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

标签 java android android-recyclerview

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

View 持有者:

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);
    }
}

适配器:

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);
}
...

我必须将模型更改为最终模型,以便我可以在回调中使用它。这似乎有效。在继续之前,我想知道这是否是一个好的做法。

干杯

最佳答案

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

PS:我还没有找到上述配置的用例,但我认为解耦会给我带来优势。

关于您对传递模型本身的担忧(从而使其成为最终模型),我认为这从来都不是问题。我已经用这种方式实现了许多 ListView 。不过,如果您有一个简单的 RecyclerView,您可以将 position 传递给您的点击处理程序,并且在 Fragment/Activity 中,您可以调用 Adapter#getItem(position) 来获取模型。

关于java - 实现点击recycleView行的正确方法 - 传递模型本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396081/

相关文章:

android - RecyclerView - Activity 开始时的 SlideIn 动画

java - 我如何在 Eclipse 中使用 maven shade 插件

java - Spring-boot - 每个级别的日志文件的应用程序属性配置

java - 图形可视化

java - 安卓工作室 : How to start TexttoSpeech after 10 seconds?

java - Android:如何从 URL 获取或读取 XML 到字符串

Java:如何将 List<?> 转换为 Map<String,?>

android - 如何避免多模块android应用程序中的重复依赖

android - 防止ScrollView中的子项被滚动出屏幕

android - Recyclerview 的 AsyncLayout 膨胀