【问题标题】:How to add a button to Firebase Recycler view in Android?如何在 Android 中向 Firebase Recycler 视图添加按钮?
【发布时间】:2018-02-14 19:27:10
【问题描述】:

我想为 Firebase 回收器视图中的每个项目添加一个按钮。 我已经创建了按钮,它正在显示,当我按下它时我正在接收 Toast。 但是 - 我怎样才能在它的列表中获得相关项目?

例如 - 当我按下“DELETE”时,我想删除某个任务“aspodm”。 (对不起,大图,我怎么把它变小?)

这就是数据库的样子(vfPvsk... 是用户 ID,773f... 是任务 ID 的随机 uuid):

这就是相关片段的代码。 (点击按钮时的吐司被激活 - 我只是不知道如何到达相关任务才能删除它)

 package com.airpal.yonatan.airpal;


import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;


/**
 * A simple {@link Fragment} subclass.
 */
public class PendingFragment_User extends Fragment {

    private String TAG = "dDEBUG";
    private RecyclerView mPendingList;

    private DatabaseReference mMissionsDb;
    private FirebaseAuth mAuth;

    private String mCurrent_user_id;

    private View mMainView;

    Query queries;

    public PendingFragment_User() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mMainView = inflater.inflate(R.layout.fragment_pending_user, container, false);

        mPendingList = (RecyclerView)mMainView.findViewById(R.id.pending_recycler_user);
        mAuth = FirebaseAuth.getInstance();

        mCurrent_user_id = mAuth.getCurrentUser().getUid();

        mMissionsDb = FirebaseDatabase.getInstance().getReference().child("Missions").child(mCurrent_user_id);
        queries = mMissionsDb.orderByChild("status").equalTo("Available");
        mMissionsDb.keepSynced(true);

        mPendingList.setHasFixedSize(true);
        mPendingList.setLayoutManager(new LinearLayoutManager(getContext()));


        // Inflate the layout for this fragment
        return mMainView;
    }

    @Override
    public void onStart() {
        super.onStart();

        FirebaseRecyclerAdapter<Mission, PendingFragment_User.MissionsViewHolder> firebaseMissionsUserRecyclerAdapter = new FirebaseRecyclerAdapter<Mission, PendingFragment_User.MissionsViewHolder>(
                Mission.class,
                R.layout.missions_single_layout,
                PendingFragment_User.MissionsViewHolder.class,
                queries
        ) {
            @Override
            protected void populateViewHolder(PendingFragment_User.MissionsViewHolder missionViewHolder, final Mission missionModel, int missionPosition) {
//                Log.d(TAG, "inside populateViewHolder" + missionModel.getType() + " , " + missionModel.getDescription());
                missionViewHolder.setMissionName(missionModel.getType());
                missionViewHolder.setMissionDescription(missionModel.getDescription());
                missionViewHolder.setMissionStatus(missionModel.getStatus());
                missionViewHolder.button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
//                        Toast.makeText(view.getContext(), "esto es un boton"+ view.getNextFocusUpId(), Toast.LENGTH_SHORT).show();
                        Log.d(TAG,"The button was pressed");
                    }
                });

            }
        };

        mPendingList.setAdapter(firebaseMissionsUserRecyclerAdapter);
    }

    public static class MissionsViewHolder extends RecyclerView.ViewHolder {
        View mView;
        Button button ;

        public MissionsViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
            button = (Button)mView.findViewById(R.id.pending_single_button);

        }

        public void setMissionName(String name){
            TextView mMissionNameView = mView.findViewById(R.id.mission_single_name);
            mMissionNameView.setText(name);
        }

        public void setMissionStatus(String status){
            TextView mMissionStatusView = mView.findViewById(R.id.mission_single_status);
            mMissionStatusView.setText(status);
            if (status.equals("Available")){
                mMissionStatusView.setTextColor(Color.parseColor("#008000"));;
            } else {
                mMissionStatusView.setTextColor(Color.parseColor("#FF0000"));;
            }
        }

        public void setMissionDescription(String description){
            TextView mMissionDescriptionView = mView.findViewById(R.id.mission_single_description);
            mMissionDescriptionView.setText(description);

        }
    }
}

【问题讨论】:

  • 你能使用adapter.getItem(int position) 方法,它返回一个Mission 对象吗?你应该可以在你的点击监听器中调用它。
  • 我的 onClick 在 firebaseMissionsUserRecyclerAdapter.populateViewHolder 方法所以当我尝试时: firebaseMissionsUserRecyclerAdapter.getItem(missionPosition);我收到适配器变量可能尚未初始化且无法编译

标签: android firebase firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:

尝试使用子类而不是匿名子类。然后,您将能够访问适配器的getItem(int position) 方法。大致如下:

private class MissionAdapter extends FirebaseRecyclerAdapter<Mission, PendingFragment_User.MissionsViewHolder> {

    public MissionAdapter(Query queries){
        super(Mission.class, R.layout.missions_single_layout, PendingFragment_User.MissionsViewHolder.class, queries);
    }

    @Override
    protected void populateViewHolder(PendingFragment_User.MissionsViewHolder missionViewHolder, final Mission missionModel, final int missionPosition) {
        Log.d(TAG, "inside populateViewHolder" + missionModel.getType() + " , " + missionModel.getDescription());
        missionViewHolder.setMissionName(missionModel.getType());
        missionViewHolder.setMissionDescription(missionModel.getDescription());
        missionViewHolder.setMissionStatus(missionModel.getStatus());
        missionViewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Mission clickedMission = MissionAdapter.this.getItem(missionPosition);
                if (clickedMission != null){ // for the sake of being extra-safe
                    Log.d(TAG,"The button was pressed for mission: " + clickedMission.getType());
                }
            }
        });
    }
}

我让它打印了一个日志,但是你应该可以用那里检索到的Mission 对象做任何你想做的事情。

【讨论】:

  • 正如我上面所说,它不会编译,因为我在 populateViewHolder 中编写了missionViewHolder.button.setOnClickListener(new View.OnClickListener() { 行
  • 哦,那你不能只使用this 而不是firebaseMissionsUserRecyclerAdapter 吗?所以this.getItem(missionPosition)?或类似的规定。我自己试试看。
  • 否 - 'getItem' 未解决missionViewHolder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { this.getItem(missionPosition); } });
  • 我会尝试一些其他的东西,但是您绝对可以通过将适配器设置为子类而不是匿名的来解决这个问题。
  • @JohnSnowTheDeveloper 您应该可以在适配器上调用getRef(int position),就像调用getItem 一样。 That will return the database reference.
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多