Java 如何获取用于在RecyclerView中创建行的对象?

Java 如何获取用于在RecyclerView中创建行的对象?,java,android,android-recyclerview,Java,Android,Android Recyclerview,在尽我所能之后,我请求帮助。我的问题是: 上下文 我正在构建一个Android应用程序。除了一部分,一切都很好。 我在主要活动的片段中有一个RecyclerView。我制作了一个适配器和一个ViewHolder来填充它,它基于一个名为“Entry”的对象,由以下内容组成:id、name、description和amount。我使用房间数据库来存储它们。它工作得很好,我可以毫无问题地填充我的RecyclerView 代码 适配器和视图保持器: public class EntryAdapter e

在尽我所能之后,我请求帮助。我的问题是:

上下文 我正在构建一个Android应用程序。除了一部分,一切都很好。 我在主要活动的片段中有一个RecyclerView。我制作了一个适配器和一个ViewHolder来填充它,它基于一个名为“Entry”的对象,由以下内容组成:id、name、description和amount。我使用房间数据库来存储它们。它工作得很好,我可以毫无问题地填充我的RecyclerView

代码 适配器和视图保持器:

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.ViewHolderEntry>
{
    private List<Entry> entries;

    EntryAdapter(List<Entry> entries)
    {
        this.entries = entries;
    }

    @Override
    public ViewHolderEntry onCreateViewHolder(ViewGroup parent, int viewType)
    {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View contactView = inflater.inflate(R.layout.list_row, parent, false);

        return new ViewHolderEntry(contactView);
    }

    @Override
    public void onBindViewHolder(ViewHolderEntry viewHolder, int position)
    {
        Entry entry = entries.get(position);

        viewHolder.nameTextView.setText(entry.getName());
        viewHolder.descriptionTextView.setText(entry.getDescription());
        viewHolder.dueTextView.setText(String.valueOf(entry.getDue()));
    }

    @Override
    public int getItemCount()
    {
        return entries.size();
    }

    class ViewHolderEntry extends RecyclerView.ViewHolder
    {
        private TextView nameTextView;
        private TextView descriptionTextView;
        private TextView dueTextView;

        ViewHolderEntry(View itemView)
        {
            super(itemView);

            this.nameTextView = itemView.findViewById(R.id.nameView);
            this.descriptionTextView = itemView.findViewById(R.id.descriptionView);
            this.dueTextView = itemView.findViewById(R.id.dueView);
        }
    }
}
公共类EntryAdapter扩展了RecyclerView.Adapter
{
私人名单条目;
EntryAdapter(列表项)
{
this.entries=条目;
}
@凌驾
public ViewHolderEntry onCreateViewHolder(视图组父级,int-viewType)
{
Context=parent.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
View contactView=充气机。充气(R.layout.list\u行,父项,false);
返回新的ViewHolderEntry(contactView);
}
@凌驾
BindViewHolder上的公共无效(ViewHolderEntry viewHolder,int位置)
{
Entry=entries.get(位置);
viewHolder.nameTextView.setText(entry.getName());
viewHolder.descriptionTextView.setText(entry.getDescription());
viewHolder.dueTextView.setText(String.valueOf(entry.getDue());
}
@凌驾
public int getItemCount()
{
返回条目。size();
}
类ViewHolderEntry扩展了RecyclerView.ViewHolder
{
私有文本视图名称文本视图;
私有文本视图descriptionTextView;
私有文本视图;
ViewHolderEntry(查看项目视图)
{
超级(项目视图);
this.nameTextView=itemView.findviewbyd(R.id.nameView);
this.descriptionTextView=itemView.findViewById(R.id.descriptionView);
this.dueTextView=itemView.findviewbyd(R.id.dueView);
}
}
}
以下是用于行的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:background="@drawable/customborder"
    android:orientation="vertical"
    android:padding="8dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/nameView"
            android:layout_weight="0.6"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:lines="1"
            android:textColor="@color/colorGrey"
            android:textSize="22sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/dueView"
            android:layout_weight="0.3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textAlignment="textEnd"
            android:layout_gravity="center|end"
            android:lines="1"
            android:textColor="@color/colorGrey"
            android:textSize="18sp"
            android:textStyle="bold" />

        <ImageButton
            android:id="@+id/buttonDotMenu"
            android:layout_weight="0.1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:background="@color/transparent"
            android:scaleType="fitCenter"
            app:srcCompat="@drawable/dotbutton" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/descriptionView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.85"
            android:lines="4"
            android:textColor="@color/colorDetails"
            android:textSize="14sp" />

        <ImageButton
            android:id="@+id/buttonValidate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="0.15"
            android:adjustViewBounds="true"
            android:background="@color/transparent"
            android:scaleType="fitCenter"
            app:srcCompat="@drawable/iconcheck" />
    </LinearLayout>
</LinearLayout>

以及它的外观:

问题 现在是我失败的部分。我的目标很简单:当用户单击绿色复选框时,会出现一个带有行信息的弹出窗口,他可以编辑/删除它(使用Room)。 但是条目的id是递增的,因此条目的第一行id不是1而是任何int。如何获取此信息?因为我需要它来更新或删除相应的条目。我可以在一行中放一个变量吗?或者查找与该行关联的对象


谢谢大家!

发布您的入门模型和MainActivity类。我相信您已经在另一个XML文件中定义了RecyclerView。
PS:在您提供这两个文件后,我将编辑此答案。

在您的视图中保持重试或在类中贴花图像后添加此行,然后为图像设置clickListener

buttonValidate = itemView.findViewById(R.id.buttonValidate)
buttonValidate.setOnClickListener(this)
为此,必须实现接口View.OnClickListener,然后应用此

@Override
public void onClick(View v) {
    int position = getLayoutPosition(); // this gives the position of item in the recycler view
    Entry entry = (Entry) v.getTag();
    // now you can fetch all the information about the entry as for ex. for id 
    //int id = entry.getId();
}
因此,最终您的代码将如下所示

class ViewHolderEntry extends RecyclerView.ViewHolder implements View.OnClickListener
{
    private TextView nameTextView;
    private TextView descriptionTextView;
    private TextView dueTextView;
    //add this line
    private ImageView buttonValidate;

    ViewHolderEntry(View itemView)
    {
        super(itemView);

        this.nameTextView = itemView.findViewById(R.id.nameView);
        this.descriptionTextView = itemView.findViewById(R.id.descriptionView);
        this.dueTextView = itemView.findViewById(R.id.dueView);
        // add this lines
        this.buttonValidate = itemView.findViewById(R.id.buttonValidate);
        buttonValidate.setOnClickListener(this)
    }
// overrid this method
@Override
    public void onClick(View v) {
        int position = getLayoutPosition(); // this gives the position of item in the recycler view
        Entry entry = (Entry) v.getTag();
        // now you can fetch all the information about the entry as for ex. for id 
        //int id = entry.getId();
    }
}

您需要创建一个接口来处理适配器中的单击事件

interface OnAdapterClick{
        void OnItemClicked(View v, int position);
    }
当活动和适配器之间连接了接口时

 private List<Entry> entries;
    private OnAdapterClick clickListener;

    EntryAdapter(List<Entry> entries, OnAdapterClick  clickListener)
    {
        this.entries = entries;
        this.clickListener = clickListener;
    }
您可以创建一个方法,在单击时获取特定的条目

在适配器中添加新方法:

public Entry getItemAt(int position){
        return entries.get(position);
    }
最后,在您的活动中,您需要实现界面并处理单击:

public class MainActivity extends AppCompatActivity implements EntryAdapter.OnAdapterClick {

    EntryAdapter entryAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        entryAdapter = new EntryAdapter(list, this);
        recyclerView.setAdapter(entryAdapter);

    }

    @Override
    public void OnItemClicked(View v, int position) {
       Entry itemClicked = entryAdapter.getItemViewType(position);
       int id = itemClicked.getId();
    }
}

我认为这对您很有帮助。

您可以发布实体条目模型类吗?单击行时使用接口创建回调,从列表中传递id或对象本身。非常感谢,我开始实现您的代码,这似乎很有希望!但是我现在有另一个问题。。我应该提到它,但我有两个RecyclerView,几乎做同样的事情(可以有两种类型的条目)。那么,在main活动中,如何将两个OnClick绑定到两个RecyclerViews?有可能吗?是的,有可能。因为在适配器视图保持架中,您正在传递视图,因此在主活动中,您可以获取该视图的id,并知道单击了哪个视图。但是,如果您使用的是不同的适配器?我的意思是,如果你有两种不同类型的条目,那是一种不同的模型吗?不,只是“类型”(int)不同,模型是相同的。问题是我使用了两个相同的适配器:一个用于第一种类型的条目,另一个用于第二种类型的条目。。。我不知道这样做是否正确,但因为我有两个不同的RecyclerView,我想是的?这个RecyclerView在不同的活动中?如果是这种情况,您只需要在另一个活动上实现接口,就可以了
public class MainActivity extends AppCompatActivity implements EntryAdapter.OnAdapterClick {

    EntryAdapter entryAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        entryAdapter = new EntryAdapter(list, this);
        recyclerView.setAdapter(entryAdapter);

    }

    @Override
    public void OnItemClicked(View v, int position) {
       Entry itemClicked = entryAdapter.getItemViewType(position);
       int id = itemClicked.getId();
    }
}