У меня есть представление списка, которое содержит около 20 нечетных элементов из базы данных, а также две кнопки и дополнительный TextView в качестве счетчика, заключенного в линейный макет. Обычно две кнопки увеличивают и уменьшают значение в дополнительном TextView. То, что я хочу, - это когда я нажимаю кнопку за пределами listView, должен извлекать все элементы вместе со значением дополнительного текста. Прямо сейчас я могу получить Linear layouts, и там отображаются дочерние элементы, которые видны на экране, т.е. на экране отображаются 20 элементов 10, поэтому мой вопрос заключается в том, как извлекать оставшиеся элементы вместе с дополнительными значениями Textview, заключенными в линейный макет, которые не видны, можно просмотреть при прокрутке списка Listview?
Вот файл main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation= "horizontal"
android:layout_width="match_parent" android:layout_height="match_parent"
android:background="#CBCBCB">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget64"
android:background="@drawable/toolbar_color"
android:layout_x="0px"
android:layout_y="0px"
android:layout_width="match_parent" android:layout_height="40dip">
<Button
android:id="@+id/save_creature_for_encounter"
android:layout_marginTop="5px"
android:textSize="10dip"
android:textColor="#ffffff"
android:textStyle="bold"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:background="@drawable/onclick_button_bg"
android:layout_width="40dip" android:layout_height="50dip"
android:text="Save"/>
<Button
android:id="@+id/back_show_encounter"
android:layout_width="80dip"
android:layout_marginTop="5px"
android:text="Cancel"
android:textSize="10dip"
android:textColor="#ffffff"
android:textStyle="bold"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:background="@drawable/button_color"
android:layout_height="50dip">
</Button>
</RelativeLayout>
<ListView
android:id="@+id/list_view"
android:background="#ffffff"
android:fadingEdge="none"
android:cacheColorHint="#ffffff"
android:layout_weight="1"
android:layout_gravity="center"
android:scrollbars="vertical"
android:layout_marginTop="28dip" android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
И вот мой файл custom_list.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="left|center"
android:paddingBottom="5px"
android:paddingTop="5px" android:paddingLeft="5px" android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:text="test" android:id="@+id/item_creatures_to_encounter"
android:layout_marginLeft="10px" android:layout_width="180dip" android:layout_height="wrap_content"></TextView>
<Button
android:id="@+id/desc"
android:layout_width="30px"
android:layout_height="30px"
android:layout_marginTop="5px"
android:text="-"
android:textSize="10dip"
android:textColor="#ffffff"
android:textStyle="bold"
android:layout_alignTop="@+id/widget66"
android:layout_alignParentRight="true"
android:onClick="myDescClickHandler">
>
</Button>
<Button
android:id="@+id/asc"
android:layout_width="30px"
android:layout_height="30px"
android:layout_marginTop="5px"
android:text="+"
android:textSize="10dip"
android:textColor="#ffffff"
android:textStyle="bold"
android:layout_alignTop="@+id/widget66"
android:layout_alignParentRight="true"
android:onClick="myAscClickHandler">
>
</Button>
<TextView android:text="@string/counter" android:id="@+id/counter"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip" android:layout_width="30dip"></TextView>
</LinearLayout>
Вот мой пользовательский файл адаптера
public class DomainAdapter extends SimpleCursorAdapter{
private LayoutInflater mInflater;
public DomainAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
mInflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent, Cursor data) {
// A ViewHolder keeps references to children views to avoid unneccessary calls
// to findViewById() on each row.
//final ViewHolder holder;
View row = super.getView(position, convertView, parent);
ViewHolder holder=(ViewHolder)row.getTag();
if (holder == null) {
holder = new ViewHolder(row);
row.setTag(holder);
holder.add = (Button) row.findViewById(R.id.asc);
Button.OnClickListener b =
new Button.OnClickListener() {
public void onClick(View v) {
LinearLayout parent = (LinearLayout)v.getParent();
TextView label=(TextView)parent.findViewById(R.id.counter);
Log.d("AAAAJJJAAA", ""+ parent);
CharSequence value = ((TextView) label).getText();
int count = Integer.parseInt((String) value);
count++;
String inc = String.format("%d", count);
label.setText(inc);
//parent.refreshDrawableState();
}
};
holder.add.setOnClickListener(b);
}
return row;
}
}
Представления, которые находятся за пределами видимой области, не существуют. ListView создает только количество просмотров, отображаемых на экране.
Когда вы прокручиваете, а вид исчезает, он повторно использует этот вид. Он на самом деле просит адаптер адаптировать параметры представления и использует измененный вид.
Пример:
Пусть view1 будет вашей первой строкой (тот, что текст - аватар). Когда вы прокручиваете вниз, "аватар" исчезает, а внизу становится видимым новый. ListView больше не нужен view1, потому что он не отображается. Таким образом, он дает view1 адаптеру и просит его изменить параметры view1 как новую строку. Адаптер устанавливает текст на view1 в следующую строку (например, "человек" ) и возвращает его в ListView. ListView отобразит представление1 в нижней части списка.
Таким образом, в основном представления, которые находятся за пределами видимой области, не существуют.
Что вы можете сделать: сохранить счетчик в адаптер, когда пользователь нажимает кнопки + или -.
Затем вы можете запросить элементы данных (listView.getItemAtPosition(int position)
) и посчитать их.
Пример кода для этого:
class DataForView {
int counter;
}
ListView mListView;
...
int sumCounter = 0;
for (int i=0; i<mListView.getCount(); i++) {
sumCounter += ((DataForView)mListView.getItem(i)).counter;
}
Посмотрите следующий учебник для пользовательских адаптеров:
получить экземпляр адаптера ListView, а затем попробовать вызвать getItem (http://developer.android.com/reference/android/widget/Adapter.html#getItem%28int%29)