我如何使用来自firebase的数据制作recyclerview,并有意图地点击
Posted
技术标签:
【中文标题】我如何使用来自firebase的数据制作recyclerview,并有意图地点击【英文标题】:how do i make a recyclerview with data from firebase clickable with an intent 【发布时间】:2020-04-17 00:44:01 【问题描述】:我正在尝试编写一个代码,其中可以在 recyclerview 中填充来自 firebase 的数据,并使其可点击,以便它可以在点击时将点击的数据传递给不同的活动
package com.example.helpresponse;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class ShowStudentDetailsActivity extends AppCompatActivity
DatabaseReference databaseReference;
ProgressDialog progressDialog;
List<StudentDetails> list = new ArrayList<>();
RecyclerView recyclerView;
RecyclerView.Adapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_student_details);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(ShowStudentDetailsActivity.this));
progressDialog = new ProgressDialog(ShowStudentDetailsActivity.this);
progressDialog.setMessage("Loading Data from Firebase Database");
progressDialog.show();
databaseReference = FirebaseDatabase.getInstance().getReference("Police").child("Chats");
databaseReference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot snapshot)
for (DataSnapshot dataSnapshot : snapshot.getChildren())
StudentDetails studentDetails = dataSnapshot.getValue(StudentDetails.class);
list.add(studentDetails);
adapter = new RecyclerViewAdapter(ShowStudentDetailsActivity.this, list);
recyclerView.setAdapter(adapter);
progressDialog.dismiss();
@Override
public void onCancelled(DatabaseError databaseError)
progressDialog.dismiss();
);
上面的代码显示了在recyclerview 中填充的来自firebase 的数据。但我想让它可点击,以便它打开一个新活动,将点击的特定数据传递给新活动。
package com.example.helpresponse;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Locale;
public class TargetDataAdapter extends RecyclerView.Adapter<TargetDataAdapter.TargetViewHolder>
ArrayList<AndroidTargets> targetsArrayList;
public TargetDataAdapter(ArrayList<AndroidTargets> mTargetData)
targetsArrayList = mTargetData;
@NonNull
@Override
public TargetViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
View v= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.target_row,viewGroup,false);
return new TargetViewHolder(v);
@Override
public void onBindViewHolder(@NonNull TargetViewHolder viewHolder, int i)
viewHolder.androidTargetName.setText(targetsArrayList.get(i).FIELD1 );
viewHolder.androidTargetNumber.setText(String.format(Locale.getDefault(), "API Level: %d", targetsArrayList.get(i).FIELD2));
viewHolder.androidTargetShortName.setText(targetsArrayList.get(i).FIELD3);
@Override
public int getItemCount()
if(targetsArrayList == null)
return 0;
return targetsArrayList.size();
public static class TargetViewHolder extends RecyclerView.ViewHolder
protected TextView androidTargetName;
protected TextView androidTargetNumber;
protected TextView androidTargetShortName;
public TargetViewHolder(@NonNull View itemView)
super(itemView);
androidTargetShortName= itemView.findViewById(R.id.textView2);
androidTargetName= itemView.findViewById(R.id.textView3);
androidTargetNumber= itemView.findViewById(R.id.textView4);
以上代码是recyclerview适配器
【问题讨论】:
【参考方案1】:第一步:创建任意名称的接口。
public interface HandleClick
void onItemClick(int index);
之后:你需要在Adapter中声明这个接口的成员变量:
private HandleClick mHandleClick;
public void setmHandleClick(HandleClick handleClick)
this.mHandleClick = handleClick;
之后:在主活动中声明适配器时,您需要传递此接口的实际实现:
adapter = new RecyclerViewAdapter(ShowStudentDetailsActivity.this, list);
adapter.setmHandleClcik(new HandleClick()
@Override
public void onItemClick(int index)
// Here You can Add Any Java Code
Intent intent = new Intent(getApplicationContext() , TargetActivity.class);
startActivity(intent);
);
之后:您需要在 recyclerView 中单击项目时触发此代码: 在方法 onBindViewHolder 中添加此代码:
myClickableView.setOnClickListener((v) ->
mHandleClick.onItemClick(i);
);
这种方式允许开发人员使用它的宿主 Activity 的功能回收器视图为: 1- startAactivityForResult 2-如果您在请求中使用分页,您可以从活动而不是适配器发出新请求。
【讨论】:
能否请您重写代码。我是初学者,我尝试了你的要求,但我不断收到错误。我很困惑【参考方案2】:您可以在 onBindViewHolder 中设置一个可点击的视图,并在 Intent 中传递您的数据。像这样的:
向 TargetDataAdapter 类添加上下文字段:
private Context context;
在 onCreateViewHolder 中分配上下文:
context = viewGroup.getContext();
设置可点击视图并使用您的数据向其传递意图:
@Override
public void onBindViewHolder(@NonNull TargetViewHolder viewHolder, int i)
viewHolder.androidTargetName.setText(targetsArrayList.get(i).FIELD1 );
viewHolder.androidTargetNumber.setText(String.format(Locale.getDefault(), "API Level: %d", targetsArrayList.get(i).FIELD2));
viewHolder.androidTargetShortName.setText(targetsArrayList.get(i).FIELD3);
View myClickableView = viewHolder.itemView.findViewById(R.id.my_clickable_view);
myClickableView.setOnClickListener((v) ->
Intent intent = new Intent(context, MyClassIWantToSendDataTo.class);
intent.putExtra("myDataKey", myData);
//more intent.putExtra(s) as needed
context.startActivity(intent);
);
【讨论】:
我试过了,但它说错误:找不到符号方法 findViewById(int) Phillip, "my_clickable_view" 是您需要在 xml 布局中创建的视图的示例参考。如果您不创建名为“my_clickable_view”的视图,您将收到该错误。该视图可以是一个按钮,也可以是任何将可点击设置为 true 的视图,您可以随意命名。它不必命名为“my_clickable_view”。那只是一个例子。您需要在 target_row 布局中创建视图,因为这是您在 onCreateViewHolder 中膨胀的布局 我在那里创建了一个视图。但它不断给出同样的错误。请帮忙 @PhilipAfriyie 我的错...试试这个 View myClickableView = viewHolder.itemView.findViewById(R.id.my_clickable_view)。我在没有 IDE 帮助的情况下输入了这个。我更新了上面的答案。以上是关于我如何使用来自firebase的数据制作recyclerview,并有意图地点击的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中缓存来自 Firebase 的图像?
你如何从firebase数据库制作arraylist以填充到ArrayAdapter中?
Flutter 中的 LinearProgressIndicator 使用 Firebase
如何使用 FCM(Firebase 云消息传递)制作紧凑通知?
如何使用来自 Firebase Google Maps API Android 的数据更新标记位置
如何使用来自 react-redux-firebase 的 redux thunk getFireBase 和 getFirestore 将数据添加到 firebase doc