【问题标题】:Screen not reflecting changes to Firebase database in Android屏幕未反映 Android 中 Firebase 数据库的更改
【发布时间】:2018-05-18 02:54:53
【问题描述】:

我正在编写一个购物清单应用程序,它将数据保存到 Firebase 实时数据库并实时更新屏幕。截至目前,我拥有它,因此当您单击“+ List item”按钮时,它会将 ShoppingListItem 添加到名为“test”的数据库中。它正确地做到了,但它没有更新屏幕。我仔细检查了方法是否被调用,但屏幕没有反映更新的数据。我也尝试过使用 notifyDataSetChanged() ,但这似乎也没有帮助。

这是 ShoppingListFragment 的代码:

    public class ShoppingListFragment extends Fragment {

    private ArrayList<String> listItems = new ArrayList<String>();
    private ListView mListView;
    private TextView addItemButton;
    private LinearLayout ll;
    private RecyclerView rv;
    private FirebaseRecyclerAdapter<ShoppingListItem, ShoppingListHolder> firebaseRecyclerAdapter;
    private DatabaseReference mDatabase;

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

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {

        mDatabase = FirebaseDatabase.getInstance().getReference();


        //get reference to user
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        Query query = mDatabase.child("users").child(uid).child("shopping");

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_shopping_list, container, false);
        rv = view.findViewById(R.id.shopping_list);
        rv.setLayoutManager(new LinearLayoutManager(getContext()));

        // find the + List Item button
        final TextView addCheckBox = view.findViewById(R.id.add_check_box);



        addCheckBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addNewCheckBox(container);
            }
        });

        FirebaseRecyclerOptions<ShoppingListItem> options = new FirebaseRecyclerOptions.Builder<ShoppingListItem>()
                .setQuery(query, ShoppingListItem.class)
                .build();

        firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<ShoppingListItem, ShoppingListHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull ShoppingListHolder holder, int position, @NonNull ShoppingListItem item) {
                holder.setItem(item);
            }

            @NonNull
            @Override
            public ShoppingListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shopping_list_item, parent, false);

                return new ShoppingListHolder(view);
            }
        };

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        firebaseRecyclerAdapter.startListening();
        rv.setAdapter(firebaseRecyclerAdapter);
    }

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

        if (firebaseRecyclerAdapter != null) {
            firebaseRecyclerAdapter.stopListening();
        }
    }

    public void addNewCheckBox(ViewGroup container) {
        String key = mDatabase.child("users").child(getUid()).child("shopping_list").push().getKey();

        ShoppingListItem item = new ShoppingListItem("test");

        mDatabase.child("users").child(getUid()).child("shopping_list").child(key).setValue(item);
        firebaseRecyclerAdapter.notifyDataSetChanged();
    }

    public int convertToPx(int input) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int px = (int) (input * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }

    private class ShoppingListHolder extends RecyclerView.ViewHolder {

        private final EditText itemName;

        public ShoppingListHolder(View itemView) {
            super(itemView);

            itemName = itemView.findViewById(R.id.item_name);
        }

        public void setItem(ShoppingListItem item) {
            itemName.setText(item.getItemName());
        }
    }

    private String getUid() {
        return FirebaseAuth.getInstance().getCurrentUser().getUid();
    }
}

还有 ShoppingListItem:

    public class ShoppingListItem {
    private String itemName;
    private String type;
    private String unit;
    private int quantity;
    private String location;

    public ShoppingListItem() {

    }

    public ShoppingListItem(String name) {
        this.itemName = name;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
}

购物清单视图的 XML:

    <LinearLayout 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"
    android:id="@+id/home_fragment_main_layout"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.jggdevelopment.wannacook.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Shopping List"
        android:textStyle="bold"
        android:textSize="18sp"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="16dp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/shopping_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:clipToPadding="false"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/add_check_box"
        android:text="+ List item"
        android:textSize="16sp"
        android:layout_marginStart="40dp"
        android:layout_marginTop="16dp"/>

</LinearLayout>

以及购物清单中每个订单项的 XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <EditText
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/item_name"
        android:layout_weight="1"
        android:layout_marginStart="12dp"
        android:layout_marginEnd="32dp"
        android:inputType="text"
        android:background="@android:color/transparent"
        />

    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:id="@+id/xbutton"
        android:layout_marginEnd="12dp"
        android:src="@drawable/ic_close_white_24dp"
        android:layout_gravity="center_vertical"/>


</LinearLayout>

【问题讨论】:

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


    【解决方案1】:

    这不起作用,因为您忘记在 onCreate() 方法中设置适配器。要解决此问题,请在返回视图之前添加 rv.setAdapter(firebaseRecyclerAdapter);,如下所示:

    rv.setAdapter(firebaseRecyclerAdapter);
    return view;
    

    您可以从onStart() 方法中删除该行代码,因为那里不需要。

    如果您有兴趣,我已经创建了一个教程,我将在其中逐步解释如何使用Cloud Firestore 和 Android 构建 Shopping List App

    【讨论】:

    • 我刚刚进行了更改,但它的行为仍然相同。它正在添加到数据库中,但未显示在屏幕上。如果您需要查看完整代码,Github 链接是 www.github.com/jollygreenegiant/wannacook
    • 请添加您的数据库结构。
    • 无法发布图片,声誉太低。结构为 users->shopping_list->shoppingListItem
    • 我需要看看。立即尝试。
    • 还是不让我,我需要 10 个代表
    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2020-04-23
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多