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