Android Listview OnClickListener
我有一个包含图像列表行和两个按钮的listview。该列表从JSON加载。我试图隐藏我点击的一行按钮 我通过调用BaseAdapter的getView中的onclicklistener按钮来尝试 问题 当我单击一行中的按钮时。其他一些行的按钮被隐藏。我看不到当前行按钮隐藏 Toast消息显示我正在单击的按钮的正确文本,如下面的代码所示 BaseAdapter/getViewAndroid 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
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类吗。