当我们在convertview==null
期间放置监听器时,是否意味着当视图耗尽可创建数量时,我们将无法为相应的膨胀视图创建新的监听器?
此外,是否可以在适配器而不是position
类中声明视图Viewholder
的变量?
来自this website的示例代码:
class ExampleAdapter extends ArrayAdapter<String> {
private List<String> mData;
public ExampleAdapter(Context context, List<String> objects) {
super(context, 0, objects);
mData = objects;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.simple_list_item_1, parent, false);
holder = new ViewHolder();
holder.textView = (TextView) convertView;
convertView.setTag(holder);
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "Clicked in '" + mData.get(holder.position) + "'", Toast.LENGTH_SHORT).show();
}
});
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(mData.get(position));
holder.position = position;
return convertView;
}
static class ViewHolder {
public TextView textView;
public int position;
}
}
答案 0 :(得分:0)
他们做的是好的。但你必须要小心。
他们设法编写监听器,以便在视图被回收并绑定到新数据时不需要更改(非空convertView
是先前从{{1返回的回收视图}})
他们通过每次调用getView
时将holder.position
设置为新值来实现此目的,因此当视图被回收时也是如此。这就是每次点击时getView
导致不同数据的方式。
您也可以通过每次设置一个新的侦听器,或者通过在持有者中存储对数据的直接引用来实现。