Android :: Как читать невидимые дочерние элементы представления списка?

1

У меня есть представление списка, которое содержит около 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>

Изображение 174551

Вот мой пользовательский файл адаптера

   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;
    }

}

  • 0
    Извините, но я ничего не могу понять. Можете ли вы опубликовать некоторые файлы макета? Знаете ли вы, что такое шаблон ViewHolder и переработка вида?
  • 0
    @GagleKas Я прикрепил XML-файлы в соответствии с вашим запросом. Я не думаю, как шаблон ViewHolder идет, как я новичок в Android.
Показать ещё 3 комментария
Теги:
android-emulator
android-listview

3 ответа

2

Представления, которые находятся за пределами видимой области, не существуют. 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;
}

Посмотрите следующий учебник для пользовательских адаптеров:

http://commonsware.com/Android/excerpt.pdf

  • 0
    Я отредактировал свой пост и включил изображение эмулятора для четкой картинки, поэтому при нажатии кнопки «Сохранить» в правом верхнем углу я хочу собрать все элементы в списке и значения textView, которые в настоящее время равны 0 во всех списках справа, что может увеличивать или уменьшать две две кнопки, отмеченные + и - на самом listView.
  • 0
    Я понял вопрос с первого раза. Я могу предоставить вам пример кода, если вы напишите, как вы создали ListView и как вы настраиваете кнопки +, -. Я не уверен, что кнопки +, - действительно работают в вашей реализации (попробуйте увеличить первую строку и прокрутить вниз, внизу списка, увеличить другую строку и прокрутить вверх. Сохранены ли ваши изменения?)
Показать ещё 7 комментариев
1
  • В представлении списка не содержится ВСЕ детей. Когда вы прокручиваете его, он создает только видимые элементы во время выполнения.
    2. Если вы хотите полностью собрать всех детей, лучше сохранить ArrayList дочерних объектов, которые есть в вашем списке. Вы можете добавить или удалить детей в этот ArrayList в соответствии с требованиями.
0

получить экземпляр адаптера ListView, а затем попробовать вызвать getItem (http://developer.android.com/reference/android/widget/Adapter.html#getItem%28int%29)

  • 0
    getItem просто дает значение элемента базы данных из адаптера ListView, так как же я получу значение дополнительного TextView в ListView?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню