bindView бесконечно вызывается в пользовательском CursorAdapter

У меня есть ListView, который обслуживается пользовательским CursorAdapter. Строки ListView очень просты — CheckBox слева и два TextView. Когда флажок установлен, запускается режим действия, чтобы пользователь мог удалить несколько элементов из списка.

Борясь с флажками и OnItemClickedListeners и отслеживая, какие флажки были отмечены, я заметил, что bindView вызывается бесконечно. И я действительно имею в виду бесконечность: если в ListView есть один элемент или 100, bindView вызывается несколько раз в секунду в течение всего жизненного цикла фрагмента. ListView теперь ведет себя именно так, как я хотел, но явно что-то ОЧЕНЬ не так с моим кодом или моими макетами XML.

Поиск ответа на этом сайте не дал результатов, поэтому я публикую свой самый первый вопрос здесь.

Мой макет XML для каждой строки ListView выглядит следующим образом:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingTop="@dimen/activity_vertical_margin"
     android:descendantFocusability="blocksDescendants"    
     >

    <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:focusable="false"
      android:clickable="false"
      android:id ="@+id/chkBox" />
    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" 
      android:text="Some example text"
      android:layout_weight=".5"
      android:id="@+id/txtExercise" />
    <TextView 
      android:id="@+id/txtDuration"
      android:layout_width="fill_parent" android:layout_height="wrap_content"
      android:text="0:00" android:gravity="right"
      android:layout_weight=".5" >

    </TextView>


     </LinearLayout>

Я не уверен, какой еще код показать здесь, поэтому я собираюсь добавить свои методы newView и bindView. Надеюсь, этого будет достаточно, чтобы кто-то помог мне определить проблему.

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {     
    final LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(layout, parent, false);
    Log.i(TAG, "newView=" + parent.getId());

    final ViewHolder holder = new ViewHolder();
    holder.txtExercise = (TextView) v.findViewById(R.id.txtExercise);
    holder.txtDuration = (TextView) v.findViewById(R.id.txtDuration);
    holder.check = (CheckBox) v.findViewById(R.id.chkBox);                  
    holder.check.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean checked) {
            checkedList.put((Integer) buttonView.getTag(),checked);             
        }

    });
    v.setTag(holder);       
    return v;
}


@Override
public void bindView(View v, Context arg1, Cursor c) {
    String exercise = c.getString(c.getColumnIndex("_ExcerciseName"));
    int sec = c.getInt(c.getColumnIndex(WorkoutLog.DURATION));
    String duration = returnDurationString(sec);
    Log.i(TAG, "bindview called");
    ViewHolder holder = (ViewHolder) v.getTag();

    if(holder.txtExercise !=null)
        holder.txtExercise.setText(exercise);
    if(holder.txtDuration != null)
        holder.txtDuration.setText(duration);
    if(holder.check !=null) {   
        holder.check.setTag(c.getInt(c.getColumnIndex(WorkoutLog._ID)));
        int x = (Integer) holder.check.getTag();            
        holder.check.setChecked(checkedList.get(x));            
    }
}

Любой совет будет принят во внимание! Я все еще очень новичок в разработке Android, поэтому, вероятно, совершаю какую-то совершенно идиотскую ошибку, но у меня просто нет опыта и/или знаний, чтобы попытаться решить эту проблему.

[Изменить] - удаление тегов вокруг моего ListView решило проблему!


person Workforce7    schedule 05.05.2013    source источник
comment
Можете ли вы опубликовать макет, где у вас есть список, пожалуйста?   -  person amp    schedule 05.05.2013


Ответы (1)


Я полагаю, у вас android:layout_height из listview установлено значение wrap_content. Попробуйте переключиться на fill_parent.

Проверьте этот ответ: Почему Wrap_Content запускает BindView более одного раза

Что-то типа:

<ListView
        android:id="@+id/my_listView"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        //...
</ListView>

Надеюсь, это поможет!

person amp    schedule 05.05.2013
comment
amp, ваши комментарии не решили проблему .... но они ДЕЙСТВИТЕЛЬНО привели к тому, что я нашел причину проблемы. Убедившись, что я использую fill_parent для настройки android:layout_height, я отправился исследовать макет, содержащий сам ListView. Я обнаружил, что представление списка было заключено в ‹RelativeLayout›. Удаление этого устранило проблему. - person Workforce7; 05.05.2013
comment
Обратите внимание, что мне пришлось изменить оба, чтобы обернуть контент, так как в моем проекте у нас есть макет планшета с сеткой. - person StarWind0; 21.04.2015