Android 滚动Listview时查看可见性问题
我有一个自定义的listview,带有textview和imageview,imageview类似于复选标记。选择textview时,在Listview的监听器上,我将imageview Visibility设置为visible,以显示所选内容Android 滚动Listview时查看可见性问题,android,listview,android-listview,android-scrollbar,Android,Listview,Android Listview,Android Scrollbar,我有一个自定义的listview,带有textview和imageview,imageview类似于复选标记。选择textview时,在Listview的监听器上,我将imageview Visibility设置为visible,以显示所选内容 stickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); stickyList.setOnItemClickListener(new OnItemClickList
stickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
stickyList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String tag = (String) ((TextView) view
.findViewById(R.id.tvtag)).getText();
ImageView cb = (ImageView)
view.findViewById(R.id.ic_check);
if (cb.getVisibility() == View.VISIBLE) {
cb.setVisibility(
View.GONE);
selectedtags.remove(tag);
} else {
cb.setVisibility(
View.VISIBLE);
selectedtags.add(tag);
}
}
});
您看到这种情况的原因是列表项视图被回收(这就是
convertView
的作用)。当您滚动列表视图
时,屏幕外滚动的上一项将作为下一位置的转换视图
传递回适配器
您需要确保在每次调用getView()
时都完全重置了项目视图的状态,这样类似的更改就不会从视图项目的一次使用泄漏到下一次使用。这可能意味着您必须始终在getView()
中检查该位置的当前“已检查”值,以确定它是否应该可见
编辑:也许这会有帮助
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
/* Unchanged code omitted */
holder.text.setText(data.get(position).mytag);
boolean checkVisible = ???; //Use whatever logic your app has to determine if this position should be checked
holder.checkmark.setVisibility(checkVisible); //Always set the visibility to what it should be for this position
return convertView;
}
您看到这种情况的原因是列表项视图被回收(这就是
convertView
的作用)。当您滚动列表视图
时,屏幕外滚动的上一项将作为下一位置的转换视图
传递回适配器
您需要确保在每次调用getView()
时都完全重置了项目视图的状态,这样类似的更改就不会从视图项目的一次使用泄漏到下一次使用。这可能意味着您必须始终在getView()
中检查该位置的当前“已检查”值,以确定它是否应该可见
编辑:也许这会有帮助
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
/* Unchanged code omitted */
holder.text.setText(data.get(position).mytag);
boolean checkVisible = ???; //Use whatever logic your app has to determine if this position should be checked
holder.checkmark.setVisibility(checkVisible); //Always set the visibility to what it should be for this position
return convertView;
}
我没听懂你的意思。你能说得更具体一点吗?我已经添加了快照。请再次检查!简单地说,当您滚动一个
列表视图时,滑入视图的项目不是从头创建的新视图,它们是滚动到屏幕外的旧视图,可以重复使用(或回收)。如果在getView()
中将convertView
交给您,则它是一个旧视图,您需要重置任何不特定于该位置的内容(在您的情况下,是图像可见性)。调用NotifiyDataSetChanged会有帮助吗?我现在该怎么办?你能添加一些代码吗?请不要,更新适配器不会改变任何事情。我试着用代码把它拼出来。非常感谢Dev!!你救了我一天。我从未想过Getview回收。我一直在google+上关注你。你太棒了。我没听懂。你能说得更具体一点吗?我已经添加了快照。再检查一遍!简单地说,当您滚动一个列表视图时,滑入视图的项目不是从头创建的新视图,它们是滚动到屏幕外的旧视图,可以重复使用(或回收)。如果在getView()
中将convertView
交给您,则它是一个旧视图,您需要重置任何不特定于该位置的内容(在您的情况下,是图像可见性)。调用NotifiyDataSetChanged会有帮助吗?我现在该怎么办?你能添加一些代码吗?请不要,更新适配器不会改变任何事情。我试着用代码把它拼出来。非常感谢Dev!!你救了我一天。我从未想过Getview回收。我一直在google+上关注你。你太棒了。