【问题标题】:How to display names under same card when using RecyclerView?使用 RecyclerView 时如何在同一张卡片下显示名称?
【发布时间】:2020-06-09 15:22:02
【问题描述】:

在解释我面临的问题之前,我不得不承认我的 UI 技能并不是那么出色。所以解决方案可能比我想象的要容易得多。话虽如此,让我们开始吧。我使用具有以下行为的 RecyclerView 创建了一个布局:

[Avatar] [Username]

例如:

[Avatar] Avi Benson
[Avatar] Ben Dixson
[Avatar] Noris Danilov
[Avatar] Sofi Dan
[Avatar] Neli Maximov

我想创建以下布局:

[Letter] 
[Avatar] [Username]
[Avatar] [Username]

其中[Letter] 是姓氏的第一个字母。我使用卡片来显示每个项目,但我希望具有相同字母的卡片在同一张卡片中。意思是每个字母我都会有一张卡片,但是当用户按下卡片时,它只会选择选定的用户卡片(而不是完整的字母卡片)。例如:

B 
[Avatar] Avi Benson
D 
[Avatar] Ben Dixson
---------------------
[Avatar] Noris Danilov
---------------------
[Avatar] Sofi Dan
M 
[Avatar] Neli Maximov

基本上,我希望获得与联系人应用程序中相同的布局:

目前每个item的布局:

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

    <com.google.android.material.card.MaterialCardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checkable="true"
        android:clickable="true"
        android:focusable="true"
        android:layout_margin="5dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginEnd="16dp"
            android:layout_marginTop="16dp"
            android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp">

            <ImageView
                android:id="@+id/avatar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:layout_marginStart="15dp"
                android:textSize="25sp"
                android:layout_gravity="center"/>

        </LinearLayout>
    </com.google.android.material.card.MaterialCardView>
</LinearLayout>

Java 代码:

rvContacts = (RecyclerView) fragmentView.findViewById(R.id.contacts);

Query userQuery = connectedGroupDocumentRef.collection("contacts").orderBy("fullname", Query.Direction.ASCENDING);
FirestoreRecyclerOptions<User> options = new FirestoreRecyclerOptions.Builder<User>().setQuery(userQuery, User.class).build();
adapter = new FirestoreRecyclerAdapter<User, UserViewHolder>(options) {
    @NonNull
    @Override
    public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
        return new UserViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull User model) {
        // Set avatar
        // Code

        // Set full name
        holder.textFullName.setText(model.getFullname());
    }
};

rvContacts.setHasFixedSize(true);
rvContacts.setLayoutManager(new LinearLayoutManager(getActivity()));
rvContacts.setAdapter(adapter);

请注意,我使用 firebase 来获取数据。 User 类包含一个字段 fullname 和一个 getter/setter。

我知道我们应该做的第一件事是在布局中添加另一个TextView。但那我该怎么办?我怎么知道已经有一封信?另外,我怎样才能让卡片保持在相同的布局下?每个名字都是一张卡片还是每个字母都有一张卡片(而不是每个名字)?如果它只有每个字母的卡片,那么我如何按特定的用户名(例如用于编辑它的信息)?

【问题讨论】:

    标签: java android android-layout android-recyclerview


    【解决方案1】:

    试试嵌套recyclerview,意思是两个recyclerview。 1 个父母,第 2 个孩子 recyclerview。 制作第一个 recyclerview 的布局并在其中添加一个 recyclerview,然后也为子 recyclerview 制作一个布局。

    【讨论】:

    • 感觉像是把事情复杂化了不是吗?我确信只有一个 recyclerview 是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多