我有listadapter的listview。我想在单击列表项中的按钮时,该项目中的特定视图(而不是其他项目中)是可见的或不可见的。
下面是我在适配器getView()方法中所做的代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = vi.inflate(layoutResourceId, null, false);
holder = new Holder();
holder.setShare((ImageView) convertView.findViewById(R.id.share));
holder.setShareButtons((LinearLayout)convertView.findViewById(R.id.shareButtons));
convertView.setTag(holder);
}
holder = (Holder) convertView.getTag();
holder.getShare().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(holder.getShareButtons().getVisibility()==View.GONE){
holder.getShareButtons().setVisibility(View.VISIBLE);
}
else{
holder.getShareButtons().setVisibility(View.GONE);
}
}
});
return convertView;
}
但我所得到的只是奇怪的行为。 onClickListener和setVisibilty方法被正确调用,但我的视图有时可见,有时不可见,这取决于列表滚动位置。
我做错了什么,我该如何解决?
答案 0 :(得分:4)
滚动列表视图时,子视图将被重用并重新分配到新位置。这是为了提高效率,因为创建新视图非常昂贵。但是,它会给程序员带来负担 - 每次getView调用都必须完全重置视图的每个值。因此,如果按下子项中的按钮会更改其中一个成员的可见性,则需要记住每个数字位置的可见性,并且在getView中,您必须为每个元素设置适当的可见性。
答案 1 :(得分:1)
持有人是出于性能原因而保留对内部视图的引用。它与列表中显示的数据无关 - 仅与"单元格#34;在你的清单中。您应根据数据确定内容是否可见。
答案 2 :(得分:1)
以下是我的自定义适配器的片段,它将为您提供有关如何对适配器内的项目点击作出反应的示例:
功能:每行代表一个可以看到或看不到的对象。无论是否可见,图像都是不同的。单击项目可打开/关闭图像。
public class Exampledapter extends ArrayAdapter<CustomObject> {
private Context mContext;
private int mLayoutResourceId;
private ArrayList<CustomObject> mData = null;
public ExampleAdapter(Context context, int layoutResourceId, ArrayList<CustomObject> data, DataSource datasource) {
super(context, layoutResourceId, data);
this.mLayoutResourceId = layoutResourceId;
this.mContext = context;
this.mData = data;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View lRow = convertView;
ViewHolder holder = null;
if (lRow == null) {
LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater();
lRow = lInflater.inflate(mLayoutResourceId, parent, false);
holder = new ViewHolder();
holder.txtTitle = (TextView) lRow.findViewById(R.id.text_);
holder.imageSeen = (ImageView) lRow.findViewById(R.id.image_toggle);
lRow.setTag(holder);
} else {
holder = (ViewHolder) lRow.getTag();
}
holder.imageSeen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onListItemClick(position);
}
});
if (mData.get(position).getSeen() == 1) {
holder.imageSeen.setImageBitmap(mImageSeen);
} else {
holder.imageSeen.setImageBitmap(mImageUnseen);
}
holder.txtTitle.setText(mData.get(position).getTitle());
return lRow;
}
protected void onListItemClick(int position) {
if (mData.get(position).isSeen()) {
mData.get(position).setSeen(0);
} else {
mData.get(position).setSeen(1);
}
notifyDataSetChanged();
}
class ViewHolder {
TextView txtTitle;
ImageView imageSeen;
}
}