是否应该在内部注册(convertview == null)或在条件块之外注册? [ANDROID]

时间:2016-06-04 16:21:28

标签: java android user-interface

当我们在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;
}
}

1 个答案:

答案 0 :(得分:0)

他们做的是好的。但你必须要小心。

他们设法编写监听器,以便在视图被回收并绑定到新数据时不需要更改(非空convertView是先前从{{1返回的回收视图}})

他们通过每次调用getView时将holder.position设置为新值来实现此目的,因此当视图被回收时也是如此。这就是每次点击时getView导致不同数据的方式。

您也可以通过每次设置一个新的侦听器,或者通过在持有者中存储对数据的直接引用来实现。