【问题标题】:Using Firebase to populate my ListView使用 Firebase 填充我的 ListView
【发布时间】:2016-09-22 23:17:54
【问题描述】:

我正在使用 Firebase 作为我的应用程序的数据库。当我想用 Firebase 填充我的 ListView 时遇到问题。

这是我正在使用的结果、代码和数据库的图片。所以我问自己问题是出在代码上还是出在我如何构建数据库上。谢谢。

结果 - 结果实际上应该是:单词Test 应该在链接所在的位置,但它被添加为新元素:

Firebase 数据库:

这是我用来填充我的 ListView 的方法:

private void populateUserInfoList() {
    firebase = new Firebase("https://top-ten-317ef.firebaseio.com");
    firebase.child("ToptenListItem").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {

            for (DataSnapshot child : snapshot.getChildren()) {
                String TopTitle = (String) child.getValue(Boolean.parseBoolean("toptitle"));
                String TopPosterPic = (String) child.getValue(Boolean.parseBoolean("topposter"));
                ToptenListItem info = new ToptenListItem(TopTitle, TopPosterPic);
                TopArrayList.add(info);

            }
            Collections.addAll(TopArrayList);
            ToptenItemAdapter adapteri = new ToptenItemAdapter(getContext(), R.layout.itemrow, TopArrayList);
            itemListView.setAdapter(adapteri);

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            String message = "Server error. Refresh page";
            Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
        }


    });
}

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

标签: android listview firebase firebase-realtime-database


【解决方案1】:

我建议您使用 RecyclerView 而不是列表,Android 创建了 RecyclerView 作为 ListView 的改进,所以是的,您可以使用 ListView 控件创建附加列表,但是使用 RecyclerView 更容易更好。您可以在这篇文章中阅读更多内容:RecyclerView vs ListView

另外,您可以使用FirebaseRecyclerAdapter 为您的列表恢复适配器,这将为您填充列表并检索您想要的所有数据完成所有工作(我通常在我的代码中用户自定义对象等于我的 firebase 数据库的值,通过这种方式,您可以在 FirebaseRecyclerAdapter 中使用它们来改进数据检索)

例如,这里我使用 FirebaseRecyclerAdapter 使用个人资料图像填充用户列表视图:

 private void initializeRecyclerAdapter() {
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    mRecyclerUsersView.setLayoutManager(linearLayoutManager);

    Query allPostsQuery = FirebaseUtil.getUsersRef();
    mAdapter = getFirebaseRecyclerAdapter(allPostsQuery);
    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            // TODO: Refresh feed view.
        }
    });

    mRecyclerUsersView.setAdapter(mAdapter);
}

private FirebaseRecyclerAdapter<User, UserListViewHolder> getFirebaseRecyclerAdapter(Query query) {
    return new FirebaseRecyclerAdapter<User, UserListViewHolder>(
            User.class, R.layout.user_row_item, UserListViewHolder.class, query) {

        @Override
        protected void populateViewHolder(UserListViewHolder viewHolder, User user, int position) {
            setupUser(viewHolder, user, position, null);
        }

    };
}

private void setupUser(final UserListViewHolder UserViewHolder, final User user, final int position, final String inPostKey) {
    //Set the items for every new view
    UserViewHolder.setIcon(user.getPhoto_url());
    UserViewHolder.setText(user.getEmail());
    final String postKey;
    if (mAdapter instanceof FirebaseRecyclerAdapter) {
        postKey = ((FirebaseRecyclerAdapter) mAdapter).getRef(position).getKey();
    } else {
        postKey = inPostKey;
    }
    FirebaseUtil.getUsersRef().child(postKey).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {
            //Add users to the newGroup item
            UserViewHolder.setPostClickListener(new UserListViewHolder.UserClickListener() {
                @Override
                public void onUserClick() {
                   // mNewGroup.addUserToGroup(dataSnapshot.getKey());
                    mNewGroupUsers.addUserToGroup(dataSnapshot.getKey());
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            //TODO ControlOnCancelled
        }
    });
}

而且,如您所见,我的 User 对象非常简单(对象变量的名称必须等于您的 firebase 项,对于子级别,您可以在对象中使用 Hashmaps):

public class User {
private String display_name;
private String email;
private String photo_url;


  //[...] get/set methods and constructors

最后,这是我的 viewHolder 用户类:

public class UserListViewHolder extends RecyclerView.ViewHolder {
    private final View mView;
    private static final int POST_TEXT_MAX_LINES = 6;
    private ImageView mIconView;
    private TextView mAuthorView;
    private UserClickListener mListener;

    public UserListViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        mIconView = (ImageView) mView.findViewById(R.id.user_image_profile);
        mAuthorView = (TextView) mView.findViewById(R.id.user_text_profile);
        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onUserClick();
            }
        });
    }

    public void setIcon(String url) {
        GlideUtil.loadProfileIcon(url, mIconView);
    }

    public void setPostClickListener(UserClickListener listener) {
        mListener = listener;
    }


    public void setText(final String text) {
        if (text == null || text.isEmpty()) {
            mAuthorView.setVisibility(View.GONE);
            return;
        } else {
            mAuthorView.setVisibility(View.VISIBLE);
            mAuthorView.setText(text);
            mAuthorView.setMaxLines(POST_TEXT_MAX_LINES);
        }
    }

    public interface UserClickListener {
        void onUserClick();
    }
}

如有任何疑问,请随时提出!希望对你有帮助!

【讨论】:

  • 我可以看到viewholder类
  • 我在文章末尾添加了它;)
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多