Android Listview OnClickListener

Android Listview OnClickListener,android,listview,android-listview,Android,Listview,Android Listview,我有一个包含图像列表行和两个按钮的listview。该列表从JSON加载。我试图隐藏我点击的一行按钮 我通过调用BaseAdapter的getView中的onclicklistener按钮来尝试 问题 当我单击一行中的按钮时。其他一些行的按钮被隐藏。我看不到当前行按钮隐藏 Toast消息显示我正在单击的按钮的正确文本,如下面的代码所示 BaseAdapter/getView public View getView(final int position, View convertView, Vie

我有一个包含图像列表行和两个按钮的listview。该列表从JSON加载。我试图隐藏我点击的一行按钮

我通过调用BaseAdapter的getView中的onclicklistener按钮来尝试

问题

当我单击一行中的按钮时。其他一些行的按钮被隐藏。我看不到当前行按钮隐藏

Toast消息显示我正在单击的按钮的正确文本,如下面的代码所示

BaseAdapter/getView

public View getView(final int position, View convertView, ViewGroup parent) {

final ViewHolder holder;
newsItem = listData.get(position);
if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.home_single_image, null);
    }
    holder.caption1View = (Button) convertView.findViewById(R.id.btnpos);

    holder.caption1View.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            HomeListItem newsItem1 = listData.get(position);
            Toast.makeText(c,newsItem1.getCaption1(),Toast.LENGTH_LONG).show();// shows the correct position button text
             holder.caption1View.setVisibility(View.GONE);
        }
    });

    convertView.setTag(holder);
}
else {
    holder = (ViewHolder) convertView.getTag();
}
}       
return convertView;
}

您应该将isVisible变量添加到HomeListItem类中。然后添加这些方法

class HomeListItem {
...
private boolean isVisible;

private boolean isVisible() {return isVisible};
private void setIsVisible(boolean b) { isVisible = b;}
将此代码添加到
getView()
方法中

if(HomeListItem.isVisible()){
 holder.caption1View.setVisibility(View.VISIBLE);
} else {
 holder.caption1View.setVisibility(View.GONE);
}
在你的点击监听器中,你应该这样做

HomeListItem newsItem1 = listData.get(position);
boolean prevVisibility = newsItem1.isVisible();
newsItem1.setIsVisible(!prevVisibility);
notifyDataSetChanged();
那么完整的代码呢

public View getView(final int position, View convertView, ViewGroup parent) {

final ViewHolder holder;
newsItem = listData.get(position);
..
  if(newsItem.isVisible()){
     holder.caption1View.setVisibility(View.VISIBLE);
    } else {
     holder.caption1View.setVisibility(View.GONE);
    }
holder.caption1View.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          boolean prevVisibility = newsItem.isVisible();
          newsItem.setIsVisible(!prevVisibility);
          notifyDataSetChanged();
    }
});
。。。 }


问题是ListView重用了视图,所以当您执行
holder.caption1View.setVisibility(view.GONE)时如果不更新它,它将消失。

这是因为适配器重用视图。这意味着,在您的行上设置
caption.setVisibility(View.GONE)
时,不仅会影响此行,还会影响将重用此视图的另一行

您需要保留隐藏按钮的索引,或者可以让您决定是否为某一行隐藏按钮的任何其他方法

然后在
getView
方法的末尾添加这些行

if (buttonShouldBeVisibileForIndex(position)) {//<= this is the method you need to implement
     holder.caption.setVisible(View.GONE);
} else {
     holder.caption.setVisible(View.VISIBLE);
}
if(buttonshouldbevisibleforindex(position)){/试试这个

public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.home_single_image, null);
            holder = new ViewHolder();
            holder.caption1View = (Button) convertView.findViewById(R.id.btnpos);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }

        newsItem = listData.get(position);


        holder.caption1View.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HomeListItem newsItem1 = listData.get(position);
                Toast.makeText(c, newsItem1.getCaption1(), Toast.LENGTH_LONG).show();// shows the correct position button text
                holder.caption1View.setVisibility(View.GONE);
            }
        });

        return convertView;
    }

第一次使用时,您没有初始化
holder
。我不明白?它是初始化的。我认为您不太了解ViewHolder是什么或如何使用它。如果您使用的是ViewHolder,它应该是一个单独的类,包含您正在实例化的每个列表项的视图。您应该定义
onClick()
在该类中,这样从该类创建的每个对象都将有自己的
onClick
回调。它也会这样做,当单击按钮时,其他一些行按钮将被隐藏添加
holder=new ViewHolder();
在if条件中。您可以发布整个适配器和ViewHolder类吗。