我如何使用来自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