首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓- ClickListener在ListView?

安卓- ClickListener在ListView?
EN

Stack Overflow用户
提问于 2014-10-26 12:42:46
回答 2查看 64关注 0票数 0

我创建ListView并使用BaseAdapter生成它的内容。ListView包含每一行的按钮和隐藏的ImageView。我把OnClickListener放在Button上给ImageView看。

设想情况:

  • ListView有9行,3行在屏幕上可见。
  • 然后单击第一行的Button。

问题:

  • ImageView在第一行显示成功,但也显示在第四和第六行。
  • 当我单击第二行的Button时,也会发生这种情况。显示了第五行和第七行的ImageView。

问题:

  • 为什么会发生这种事?以及如何解决这个问题?

这是代码:

  • UI线程 .适配器=新ContentAdapter(上下文、内容);listView.setListAdapter(适配器);.
  • ContentAdapter .公共视图getView(int位置,视图convertView,ViewGroup父){.(ImageView)convertView.findViewById(R.id.image);((Button)convertView.findViewById(R.id.button)).setOnClickListener(new View.OnClickListener(){ @ ImageView View.OnClickListener(视图视图){ image.setVisibility(View.VISIBLE);});.}.
EN

回答 2

Stack Overflow用户

发布于 2014-10-26 13:31:13

是否检查视图是否为null或其他

代码语言:javascript
复制
if(view == null)
    view = ((Activity)YourActivity.get()).getLayoutInflater().inflate(R.layout.list_item, null);
票数 0
EN

Stack Overflow用户

发布于 2014-10-26 13:45:33

ListView处理内存,即它回收视图,它不每次创建一个新视图(在您的情况下是vonverView),而是使用以前生成的视图(即convertView)。

因此,当您滚动时,您将看到(例如)row1在新创建的行上的视图。这就是你看到图像已经显示的原因。

为了避免这种情况,您必须将图像的可见性设置为View.INVISIBLE

代码语言:javascript
复制
public View getView(int position, View convertView, ViewGroup parent) {
    .....
    final ImageView image = (ImageView)convertView.findViewById(R.id.image);
    image.setVisibility(View.INVISIBLE);
    ((Button)convertView.findViewById(R.id.button)).setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            image.setVisibility(View.VISIBLE);
        }
    });
    .....
}

这样,滚动时就不会看到可见的图像,尽管,如果使第1行的图像可见,向下滚动,当再次向上滚动时,您将发现第1行的图像也是不可见的,在这种情况下,您必须将图像的状态保存在某个地方(例如,ArrayListMap<Integer position, Boolean isvisible>)。

这样,您还必须检查ViewHolder Pattern是否有适配器,以获得更好的内存消耗。

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26573088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档