几天前,我问了一个问题,寻求帮助和指导如何创建一个RecyclerView
with aCursorAdapter
以便能够创建一个列表,其中数据RecyclerView
是从应用程序本身的内部数据库(在 SQLite 中)提取的。这是问题的链接。
今天,我想实现该方法onClickListener
,以便当用户单击列表中的一个项目时,会打开一个新项目,Activity
其中显示该项目的所有数据。
通过逻辑和互联网上的几个失败示例,我知道我必须onClickListener
在 的适配器内实现,RecyclerView
并从那里获取_id
已选择项目的数据,查阅该记录的数据并将其传递给新Activity
的一个Intent
,但我无法_id
从该项目中得到这个。
如何获得_id
选定的项目?我是不是忘记了什么?我做错了吗?该方法onClickListener
没有在RecyclerAdapter
or if 中实现?根据谷歌文档,它真的可以实现onClickListener
还是必须使用OnItemTouchListener
它?RecyclerView
RecyclerView
这是从以下扩展的适配器代码CursorRecyclerViewAdapter<ListsAdapter.ViewHolder>
:
public class ListsAdapter extends CursorRecyclerViewAdapter<ListsAdapter.ViewHolder>{
Cursor c;
Context context;
Cursor cursor;
//Constructor
public ListsAdapter(Context context, Cursor cursor) {
super(context, cursor);
this.context = context;
this.cursor = cursor;
c = cursor;
}
// Para enlazar el diseño del ítem a la lista
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.design_item_list, parent, false);
return new ViewHolder(itemView, context);
}
// Para declarar las variables del layout seleccionado y poder llenarlas después
// Aquí he implementado el "OnClickListener"
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView title, delivery, aux;
Context context;
Cursor cursor;
public ViewHolder(View itemView, Context context) {
super(itemView);
this.context = context;
itemView.setOnClickListener(this);
title = (TextView) itemView.findViewById(R.id.title_item);
delivery = (TextView) itemView.findViewById(R.id.delivery);
aux = (TextView) itemView.findViewById(R.id.date);
}
// Aquí es donde se supone tengo que coger el _id del registro del cursor, pero no se como. También tengo que abrir la nueva activity, pasandole los datos del registro del cursor por un un intent.
@Override
public void onClick(View v) {
// Aquí necesito de alguna forma coger el _id y hacer
// aparecer la nueva activity
ArrayList<String> data = selectData();
Intent intent = new Intent(context, ItemDetailsHomeworkActivity.class);
intent.putExtra("datos", data);
context.startActivity(intent);
}
// Desde aquí queria obtener los datos del cursor, pero al no saber
// como coger el _id no puedo obtener esos datos.
// Se supone que tendría que pasar como dato sobrecargado el _id.
private ArrayList<String> selectData(){
ArrayList<String> data = new ArrayList<>();
data.add(cursor.getString(0));// _ID - Integer
data.add(cursor.getString(1));// Nombre del deber
data.add(cursor.getString(2));// Nombre del tipo de deber
data.add(cursor.getString(3));// tieneNota - Booleano
data.add(cursor.getString(4));// Descripcion
data.add(cursor.getString(5));// Fecha entrega
data.add(cursor.getString(6));// Hora de entrega
data.add(cursor.getString(7));// Ubicacion
data.add(cursor.getString(8));// Grado de tipo de prioridad
data.add(cursor.getString(9));// Nombre de la asignatura
data.add(cursor.getString(10));// Calificación
data.add(cursor.getString(11));// Terminado - Booleano
return data;
}
}
@Override
public void onBindViewHolder(ListsAdapter.ViewHolder holder, Cursor cursor) {
holder.title.setText(cursor.getString(1));
holder.delivery.setText(cursor.getString(9));
if (cursor.getString(5).equals("null")) {
holder.aux.setText("");
} else {
holder.aux.setText(cursor.getString(5));
}
holder.cursor = cursor;
}
@Override
public int getItemCount() {
if (c != null) {
return c.getCount();
}
return 0;
}
}
我希望你能帮助我,或者有人在他们的项目中创建了类似的东西,并且可以回答和解释我提出的问题。
在此先感谢大家。
正如我在代码中所写的,a 可以
onClickListener
毫无问题地实现。我遇到的唯一问题是我需要获取与存储在光标中的所选项目相对应的数据库记录,我得到了答案。
这是解决方案:
这就是我获取
Activity
收集Intent
* 的数据的方式:我让自己感到困惑的地方是我需要
_id
记录中的那个才能访问它,但是没有,因为如果SELECT
从我那里获取记录以便能够填写列表的那个有 3 条记录,那么在列表中它将有 3 条记录,没有更多,这就是为什么如果我获得所选项目的位置,我将获得记录的位置,您所要做的就是移动光标,仅此而已。很抱歉给这个问题带来不便,我正在与这个应用程序争分夺秒,我很紧张。最后这很愚蠢,但我不想把这个问题留给想要实现这个或
onClickListener
在他们的RecyclerView
. 这就是我们丰富这个社区的方式。* 我也有一个小问题,必须
ArrayList
通过 aIntent
,但感谢x4mp73r我修复了它。非常感谢大家。