android - Android:传递recyclerview上显示的数据并填充另一个活动
问题描述
我想将 recyclerview 收到的数据从 firebase 实时数据库传递给其他活动。因此,当用户单击任何项目时,它将打开另一个接收到完整数据的活动(图像、名称、位置、描述)。
注意:我尝试对 firebaseRecyclerAdapter 使用 setonclick 侦听器,但 android studio 没有显示 OnClickListener,那么我想在哪里使用 onclick?
我的主要活动:
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<HomeWorkView> options = new FirebaseRecyclerOptions.Builder<HomeWorkView>()
.setQuery(reference, HomeWorkView.class)
.build();
FirebaseRecyclerAdapter<HomeWorkView, HomeScreenWorkViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<HomeWorkView, HomeScreenWorkViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull HomeScreenWorkViewHolder viewHolder, int i, @NonNull HomeWorkView homeWorkView) {
viewHolder.setdetails(getApplicationContext(), homeWorkView.getName(), homeWorkView.getImage(), homeWorkView.getDescription(), homeWorkView.getLocation());
}
@NonNull
@Override
public HomeScreenWorkViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.work_item_display_layout, parent,false);
HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view);
return holder;
}
};
firebaseRecyclerAdapter.startListening();
mrecyclerView.setAdapter(firebaseRecyclerAdapter);
}
视图持有者:
public class HomeScreenWorkViewHolder extends RecyclerView.ViewHolder {
View view;
public HomeScreenWorkViewHolder(@NonNull View itemView) {
super(itemView);
view = itemView;
}
public void setdetails(Context context, String name, String image, String description, String location) {
TextView mtitletv = view.findViewById(R.id.product_layout_name);
TextView mdesrcriptiontv = view.findViewById(R.id.product_layout_description);
TextView mlocationtv = view.findViewById(R.id.product_layout_location);
ImageView mImagetv = view.findViewById(R.id.product_layout_image);
mtitletv.setText(name);
mdesrcriptiontv.setText(description);
mlocationtv.setText(location);
Picasso.get().load(image).into(mImagetv);
}
}
班级:
public class HomeWorkView {
String Name, Image, Description, Location;
public HomeWorkView() {
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getImage() {
return Image;
}
public void setImage(String image) {
Image = image;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getLocation() {
return Location;
}
public void setLocation(String location) {
Location = location;
}
}
解决方案
为 firebaseAdapter 创建 onItemClickListener:创建 itemclicked 回调:
public interface OnItemClick{
void onItemClicked(int position);
}
更改您的 viewHolder:
public class HomeScreenWorkViewHolder extends RecyclerView.ViewHolder{
public HomeScreenWorkViewHolder(@NonNull View itemView,OnItemClick callBack) {
super(itemView);
view = itemView;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callBack.onItemClicked(getAdapterPosition());
}
});
}
}
改变开始:
@Override
protected void onStart() {
super.onStart();
OnItemClick onItemClick = new OnItemClick{
@Overide
void onItemClicked( int position ){
HomeWorkView item = firebaseRecyclerAdapter.getItem(position);
String name = item.name;
String description = item.description
Intent intent =new Intent(this@HomeActivity,
AnotherActivity::class);
intent.putExtra("name",name);
intent.putExtra("description",description);
startActivity(intent);
}
}
};
并更改此行:
HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view);
到
HomeScreenWorkViewHolder holder = new HomeScreenWorkViewHolder(view,onItemClick);
您可以使用意图在活动之间传递数据。在您的活动中:
firebaseRecyclerAdapter.setOnItemClickListener(new OnItemClick{
@Overide
void onItemClicked( int position ){
HomeWorkView item = firebaseRecyclerAdapter.getItem(position);
String name = item.name;
String description = item.description
Intent intent =new Intent(this@HomeActivity,
AnotherActivity::class);
intent.putExtra("name",name);
intent.putExtra("description",description);
startActivity(intent);
}
})
在 AnotherActivity 的 onCreate 方法中:
String name = getIntent.getExtras().getString("name");
另一种解决方案,使您的 HomeWorkView 实现 Serializable :
public class HomeWorkView implements Serializable {
}
并将其传递给另一个活动:
firebaseRecyclerAdapter.setOnItemClickListener(new OnItemClick{
@Overide
void OnItemClicked( HomeWorkView item ){
Intent intent =new Intent(this@HomeActivity,
AnotherActivity::class);
intent.putExtra("homework",item);
startActivity(intent);
}
}) 然后在AnotherActivity的onCreate方法中:
HomeWorkView data = getIntent().getSerializableExtra("homework");
推荐阅读
- node.js - 在函数内设置类属性
- android - 测试未能完成。原因:“由于 'keyDispatchingTimedOut',仪器运行失败”。检查设备 logcat 以获取详细信息
- pandas - 加快 pandas 中行的逻辑合并(基于条件)
- apache - 带有appache httpd服务器的websocket url抛出404错误
- angular - Angular `ng-content` 在 primeNg 表中没有按预期工作
- stripe-payments - 如何区分经常性金额与 Stripe 中的初始金额
- python - 该函数输入一个字符串列表 x 并返回一个整数 ptr
- powershell - 在 Powershell 中生成带有 X.509 证书签名的 JWT
- node.js - NodeJs 用 jsPDF 说“ReferenceError: window is not defined”
- listview - 通过 Adopter 和自定义布局项在 ListView 中显示关联数组