正确的实现方式点击recycleView的行 - 传递模型本身

时间:2016-04-04 06:43:30

标签: java android android-recyclerview

我在stackOverflow上阅读了一些关于如何在recycleView行上实现点击并最终获得此版本的答案:

ViewHolder:

public class ContactViewHolder extends RecyclerView.ViewHolder {

    private final TextView text_name;
    private final IContactClick listener;

    public ContactViewHolder(View itemView, IContactClick _listener) {
        super(itemView);

        text_name = (TextView) itemView.findViewById(R.id.text_name);
        listener = _listener;
    }

    public void bind(final Contact model) {
        text_name.setText(model.name);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.contactClick(model);
            }
        });
    }

    public interface IContactClick {
        void contactClick(Contact contact);
    }
}

Adaptar:

public class ContactsAdapter extends RecyclerView.Adapter<ContactViewHolder> implements ContactViewHolder.IContactClick{

private final LayoutInflater mInflater;
private final List<Contact> mModels;

public ContactsAdapter(Context context, List<Contact> models) {
    mInflater = LayoutInflater.from(context);
    mModels = new ArrayList<>(models);
}

public void contactClick(Contact contact) {
    Log.d("contactClick", contact.name);
}
...

我不得不将模型更改为final,因此我可以在回调中使用它。这似乎有效。我想知道这是否是一个很好的做法,然后继续前进。

干杯

1 个答案:

答案 0 :(得分:0)

我没有使用过RecyclerView,但我认为此方法也适用于ListView。我以这种方式实现我的ListAdapter,因为它以某种方式给出了解耦的感觉。例如,如果您想在多个Adapter / ListView中使用相同的RecyclerView(例如,具有相同的行视图/但不同的点击行为),此方法可让您执行此操作

PS:我还没有为上述配置找到一个用例,但我还是认为去耦会给我带来好处。

关于你对传球模型本身的关注(从而使其成为最终),我认为这不是一个问题。我通过这种方式实现了很多ListView个。如果你有一个简单的RecyclerView,你可以将position传递给你的点击处理程序,而Fragment / Activity则可以调用Adapter#getItem(position)来获取模型。< / p>