我有一个由自定义CursorAdapter提供的ListView。 ListView行非常简单 - 左边是CheckBox,还有两个TextView。当“单击”复选框时,将启动操作模式,以便用户可以从列表中删除多个项目。
在努力处理复选框和OnItemClickedListeners并跟踪检查哪些框时,我注意到bindView被无休止地调用。并且,我确实无意中意味着:如果ListView有一个项目或100个,则在片段生命周期的持续时间内每秒多次调用bindView。 ListView现在的行为完全符合我的要求,但我的代码或XML布局显然有些问题。
在这个网站上搜索答案没有结果,所以我在这里发布我的第一个问题。
ListView的每一行的XML布局如下所示:
<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周围删除标签解决了这个问题!
答案 0 :(得分:3)
我假设您android:layout_height
的{{1}}设置为listview
。尝试切换到wrap_content
。
检查此答案:Why does Wrap_Content fire BindView more than once
类似的东西:
fill_parent
希望这有帮助!