RecyclerView结合Firebase数据库实现点击跳转详情页的问题
解决RecyclerView条目点击跳转详情页并展示完整数据的问题
没问题,我来帮你搞定这个需求!要实现点击RecyclerView里的牙医条目,跳转到DetailsPage展示完整的Nom、Adresse、NumTel和Email信息,咱们分几个步骤修改代码就好:
第一步:修改Liste.java中的点击事件,传递完整数据
你现在的点击事件只是启动了详情页,但没把选中牙医的信息传过去。咱们调整一下点击事件的逻辑,把数据通过Intent传递出去:
方式1:逐个传递字段(简单直接)
在MyViewHolder的onClick方法里,先获取选中的牙医数据,再把每个字段放进Intent:
itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View itemView) { int pos = getAdapterPosition(); if(pos != RecyclerView.NO_POSITION){ Dentist clickedDataItem = listArray.get(pos); // 创建Intent并添加所有需要传递的字段 Intent intent = new Intent(itemView.getContext(), DetailsPage.class); intent.putExtra("KEY_NOM", clickedDataItem.getNom()); intent.putExtra("KEY_ADRESSE", clickedDataItem.getAdresse()); intent.putExtra("KEY_NUMTEL", clickedDataItem.getNumTel()); intent.putExtra("KEY_EMAIL", clickedDataItem.getEmail()); // 启动详情页 itemView.getContext().startActivity(intent); Toast.makeText(itemView.getContext(), "You clicked " + clickedDataItem.getNom(), Toast.LENGTH_SHORT).show(); } } });
方式2:传递整个Dentist对象(更优雅,适合字段多的情况)
如果以后牙医的字段可能增加,推荐用这种方式,先让Dentist类实现Serializable接口:
修改你的Dentist.java:
public class Dentist implements Serializable { private String Nom; private String Adresse; private String NumTel; private String Email; // 原有的getter和setter保持不变 public String getNom() { return Nom; } public void setNom(String nom) { Nom = nom; } public String getAdresse() { return Adresse; } public void setAdresse(String adresse) { Adresse = adresse; } public String getNumTel() { return NumTel; } public void setNumTel(String numTel) { NumTel = numTel; } public String getEmail() { return Email; } public void setEmail(String email) { Email = email; } }
然后在Liste的点击事件里直接传递整个对象:
itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View itemView) { int pos = getAdapterPosition(); if(pos != RecyclerView.NO_POSITION){ Dentist clickedDataItem = listArray.get(pos); Intent intent = new Intent(itemView.getContext(), DetailsPage.class); intent.putExtra("KEY_DENTIST", clickedDataItem); itemView.getContext().startActivity(intent); Toast.makeText(itemView.getContext(), "You clicked " + clickedDataItem.getNom(), Toast.LENGTH_SHORT).show(); } } });
第二步:修改DetailsPage.java,接收数据并展示
首先,你需要确保activity_details_page.xml里已经添加了对应展示NumTel和Email的TextView(如果还没加,先补上),比如:
<!-- 已有的detail_nom --> <TextView android:id="@+id/detail_nom" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <!-- 添加以下三个TextView --> <TextView android:id="@+id/detail_adresse" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp"/> <TextView android:id="@+id/detail_numtel" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp"/> <TextView android:id="@+id/detail_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp"/>
然后修改DetailsPage.java的代码,接收Intent传递的数据并设置到TextView上:
如果用方式1(逐个传字段):
public class DetailsPage extends AppCompatActivity { Toolbar toolbar; TextView DetailNom, DetailAdresse, DetailNumTel, DetailEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate ( savedInstanceState ); setContentView ( R.layout.activity_details_page ); this.toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); setTitle ( "Détails du Médecin" ); // 初始化所有TextView DetailNom = (TextView)findViewById ( R.id.detail_nom ); DetailAdresse = (TextView)findViewById ( R.id.detail_adresse ); DetailNumTel = (TextView)findViewById ( R.id.detail_numtel ); DetailEmail = (TextView)findViewById ( R.id.detail_email ); // 获取Intent里的字段数据 Intent intent = getIntent(); if(intent != null){ String nom = intent.getStringExtra("KEY_NOM"); String adresse = intent.getStringExtra("KEY_ADRESSE"); String numTel = intent.getStringExtra("KEY_NUMTEL"); String email = intent.getStringExtra("KEY_EMAIL"); // 设置文本 DetailNom.setText(nom); DetailAdresse.setText(adresse); DetailNumTel.setText(numTel); DetailEmail.setText(email); } } }
如果用方式2(传递整个对象):
public class DetailsPage extends AppCompatActivity { Toolbar toolbar; TextView DetailNom, DetailAdresse, DetailNumTel, DetailEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate ( savedInstanceState ); setContentView ( R.layout.activity_details_page ); this.toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); setTitle ( "Détails du Médecin" ); // 初始化所有TextView DetailNom = (TextView)findViewById ( R.id.detail_nom ); DetailAdresse = (TextView)findViewById ( R.id.detail_adresse ); DetailNumTel = (TextView)findViewById ( R.id.detail_numtel ); DetailEmail = (TextView)findViewById ( R.id.detail_email ); // 获取传递过来的Dentist对象 Intent intent = getIntent(); if(intent != null){ Dentist dentist = (Dentist) intent.getSerializableExtra("KEY_DENTIST"); if(dentist != null){ DetailNom.setText(dentist.getNom()); DetailAdresse.setText(dentist.getAdresse()); DetailNumTel.setText(dentist.getNumTel()); DetailEmail.setText(dentist.getEmail()); } } } }
这样修改之后,点击RecyclerView里的任意条目,就能跳转到详情页看到该牙医的完整信息啦!
内容的提问来源于stack exchange,提问作者Nesrine
相关产品推荐
相关产品推荐

