【发布时间】: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