【问题标题】:Data in recycler view not being uploaded to Firebase回收站视图中的数据未上传到 Firebase
【发布时间】:2017-05-04 19:00:03
【问题描述】:

因此我对此进行了一些研究,但无法解决此问题,并且每个在线解决方案都导致我出现新错误。

我目前正在开发一个事件应用程序,并且对 Android Studio 来说相对较新。

我在管理应用中有一个 RecyclerView,它可以验证组织者上传到 Firebase 的所有事件数据。主办方上传event_tile、event_desc、event_image等数据。这存储在根“事件”下的 Firebase 中。稍后,Admin App 以回收者视图的形式接收这些请求,并有一个按钮来批准它们。所有批准的事件都将存储在 Firebase 中的一个单独的表中,根为“Approved_Events”。

我在审批部分卡住了。代码运行良好,没有错误,但没有数据上传到我的 Firebase 控制台。

这是我的主要活动

     public class MainActivity extends AppCompatActivity {

        private RecyclerView request_eventList;
        private DatabaseReference mRef, aRef;
        private Button verify_button;
        private TextView request_title, request_desc;
        private ImageView request_image;
        ProgressDialog progressDialog;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            progressDialog = new ProgressDialog(this);
            mRef = FirebaseDatabase.getInstance().getReference().child("Event");
            setContentView(R.layout.activity_main);
            request_eventList = (RecyclerView) findViewById(R.id.request_eventList);
            request_eventList.setHasFixedSize(true);
            request_eventList.setLayoutManager(new LinearLayoutManager(this));


        }

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

            FirebaseRecyclerAdapter<Event, RequestViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Event, RequestViewHolder>(
                    Event.class,
                    R.layout.admin_event_row,
                    RequestViewHolder.class,
                    mRef

            ) {
                @Override
                protected void populateViewHolder(RequestViewHolder viewHolder, Event model, int position) {
                    viewHolder.setTitle(model.getTitle());
                    viewHolder.setDesc(model.getDesc());
                    viewHolder.setImage(getApplicationContext(), model.getImage());
                }
            };
            request_eventList.setAdapter(firebaseRecyclerAdapter);

        }

        public static class RequestViewHolder extends RecyclerView.ViewHolder {
            View mView;
            public Button verify_button;
            DatabaseReference mRef, aRef;
            ProgressDialog progressDialog;

            public RequestViewHolder(View itemView) {
                super(itemView);
                mView = itemView;


                progressDialog = new ProgressDialog(mView.getContext());
                verify_button = (Button) mView.findViewById(R.id.approve_button);
                mRef = FirebaseDatabase.getInstance().getReference().child("Event");
                aRef = FirebaseDatabase.getInstance().getReference().child("ApprovedEvents");

                verify_button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {mRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            Map <String, String> map = (Map<String, String>) dataSnapshot.getValue();

                            String title_val = map.get("title");
                            String desc_val = map.get("desc");
                            String image_val = map.get("image");

                            aRef.child("approved_title").setValue(title_val);
                            aRef.child("approved_desc").setValue(desc_val);
                            aRef.child("approved_image").setValue(image_val);
                            progressDialog.dismiss();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });


                    }
                });

            }

            public void setTitle(String title) {
                TextView request_title = (TextView) mView.findViewById(R.id.request_title);
                request_title.setText(title);


            }

            public void setDesc(String desc) {
                TextView request_desc = (TextView) mView.findViewById(R.id.request_desc);
                request_desc.setText(desc);
            }

            public void setImage(Context ctx, String image) {
                ImageView request_image = (ImageView) mView.findViewById(R.id.request_image);
                Picasso.with(ctx).load(image).into(request_image);
            }

        }
    }

MainActivity XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.admin.admin.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/request_eventList"
        android:clickable="true">
    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

事件 Java 类

    public class Event {
        private String title, desc, image;

        public Event(String title, String desc, String image) {
            this.title = title;
            this.desc = desc;
            this.image = image;
        }
        public Event(){

        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getImage() {
            return image;
        }

        public void setImage(String image) {
            this.image = image;
        }
    }

将填充 recyclerView 的 admin_event_row XML 文件

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/request_image"
    android:src="@drawable/abc_btn_check_material"
    android:adjustViewBounds="true" />
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/request_title"
    android:text="Title will come here "
    android:padding="10dp"
    android:textStyle="bold"
    android:textSize="15dp" />
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/request_desc"
    android:text="Desc will come here "
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingBottom="10dp" />
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/approve_button"
    android:text="Yeah it's Cool "/>
</LinearLayout>

Final App Look

【问题讨论】:

  • 您是否尝试在按钮的onClick 方法下放置系统打印?
  • 就我所见,您的按钮点击处理得当。试着放一些 toast 看看它是否调用了onClick 方法调用。
  • 是的,我尝试使用 Toast 和按钮似乎很好。我认为错误发生在之前。但是数据并未上传到 Firebase

标签: android firebase firebase-realtime-database firebaseui


【解决方案1】:

如果您的 Event 有更多未批准的孩子,请将 verify_button.setOnClickListener 从 Holder 移动到 Adapter-populateViewHolder。您必须将 verify_button.setOnClickListener 连接到 recycleviewer 中的行,以从单击的项目中获取标题、描述和图像的值。

protected void populateViewHolder(RequestViewHolder viewHolder, Event model, int position) {
                viewHolder.setTitle(model.getTitle());
                viewHolder.setDesc(model.getDesc());
                viewHolder.setImage(getApplicationContext(), model.getImage());

            final String title = model.getTitle();
            final String desc = model.getDesc();
            final String image = model.getImage();

            final DatabaseReference aRef = FirebaseDatabase.getInstance().getReference();

            viewHolder.verify_button.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {

                    String key = aRef.child("ApprovedEvents").push().getKey();

                    Event event = new Event(title, desc, image );

                    Map<String, Object> eventValues = event.toMap();

                    Map<String, Object> childUpdates = new HashMap<>();

                    childUpdates.put("/ApprovedEvents/" + key, eventValues);

                    aRef.updateChildren(childUpdates);


                }
            });


        }
    };

【讨论】:

  • 我实现了你的代码,并且按钮正常工作,但没有数据上传到数据库。
  • Firebase 数据仅显示一个名为“事件”的孩子
  • 对不起。孩子事件有一个或多个?您的回收浏览器中是否有更多未批准的事件?
  • 子 'Event' 有其他具有随机 Id 的子项,由标题、描述和图像 url 组成。我想要另一个孩子“ApprovedEvents”,它将再次由标题、描述、图片网址组成。
  • 是的,我的回收站视图中有更多未批准的事件。你可以在链接i.stack.imgur.com/LjC6d.jpg看到我的最终应用程序。
猜你喜欢
  • 2021-09-29
  • 2021-08-25
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多