Android - ListView中的ClickListener?

时间:2014-10-26 12:42:47

标签: android listview android-listview

我创建ListView并使用BaseAdapter生成其内容。 ListView包含每行的Button和隐藏的ImageView。我把OnClickListener放在Button上以显示ImageView。

情景:

  • ListView有9行,屏幕上可见3行。
  • 然后我点击第一行的按钮。

问题:

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

问题:

  • 为什么会这样?以及如何解决?

这是代码:

  • UI线程

    .....
    adapter = new ContentAdapter(context, content);
    listView.setListAdapter(adapter);
    .....
    
  • ContentAdapter

    .....
    public View getView(int position, View convertView, ViewGroup parent) {
        .....
        final ImageView image = (ImageView)convertView.findViewById(R.id.image);
        ((Button)convertView.findViewById(R.id.button)).setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                image.setVisibility(View.VISIBLE);
            }
        });
        .....
    }
    .....
    

2 个答案:

答案 0 :(得分:0)

如果为null或其他什么

,请检查视图
if(view == null)
    view = ((Activity)YourActivity.get()).getLayoutInflater().inflate(R.layout.list_item, null);

答案 1 :(得分:0)

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

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

为避免这种情况,您必须将图片的曝光度设置为View.INVISIBLE

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

使用它,滚动时不会看到可见的图像,但是,如果你使row1的图像可见,然后向下滚动,当你再次向上滚动时你会发现row1的图像也是不可见的,在这种情况下你必须在某处保存图像的状态(例如ArrayListMap<Integer position, Boolean isvisible>)。

话虽如此,您还必须检查ViewHolder Pattern适配器,以获得更好的内存消耗。

希望这有帮助