[英]how to use onBindViewHolder with multiple items in android RecyclerView
我正在創建一個帶有CardView的RecyclerView,每張卡都有標題,描述和圖像。 使用onBindViewHolder
允許我只添加一個標題,我不能讓它添加其他項目。 這是我試圖這樣做的方式。
這是我的適配器 :
public class userDressAdapter extends RecyclerView.Adapter<userDressAdapter.ViewHolder> {
private LayoutInflater layoutInflater;
private List<String> data;
private Object ViewGroup;
userDressAdapter(Context context, List<String> data) {
this.layoutInflater = LayoutInflater.from(context);
this.data = data;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.dress_recycler_view, (android.view.ViewGroup) ViewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String title = data.get(position);
ViewHolder.dressTitle.setText(title);
ViewHolder.dressDescription.setText(title);
}
@Override
public int getItemCount() {
return data.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
static TextView dressTitle;
static TextView dressDescription;
public ViewHolder(@NonNull View itemView) {
super(itemView);
dressTitle = itemView.findViewById(R.id.userDressTitleText);
dressDescription = itemView.findViewById(R.id.userDressDescriptionText);
}
}
}
我使用它作為我的視圖的主要適配器,這是我如何從主Java類調用它:
public class UserDressView extends AppCompatActivity {
private static final String TAG = "UserDressView";
RecyclerView recyclerView;
com.innoventiq.fostania.userDressAdapter userDressAdapter;
ArrayList<String> items;
ArrayList<String> description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_dress_view);
items = new ArrayList<>();
description = new ArrayList<>();
ReadDressData();
}
public void AddDressToList(String theData) {
items.add(theData);
recyclerView = findViewById(R.id.userDressRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
userDressAdapter = new userDressAdapter(this, items);
recyclerView.setAdapter(userDressAdapter);
}
public void AddDressDescriptionToList(String theData) {
description.add(theData);
recyclerView = findViewById(R.id.userDressRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
userDressAdapter = new userDressAdapter(this, description);
recyclerView.setAdapter(userDressAdapter);
}
public void ReadDressData() {
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("dress")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Log.d(TAG, document.getId() + " => " + document.getData());
AddDressToList(String.valueOf(document.getData().get("title")));
AddDressDescriptionToList(String.valueOf(document.getData().get("description")));
}
} else {
Log.w(TAG, "Error getting documents.", task.getException());
}
}
});
}
}
因為我對android studio和JAVA很新,所以我找不到這方面的指南。 我添加了2個函數,它們將不同的列表添加到適配器中,但結果卻是一團糟。 文本正在各地添加,項目被復制。
將項添加到ArrayList<Dress>
,然后僅將DressAdapter
設置一次。
使用@Bindable
字段,可以對卡視圖進行數據綁定。
class Dress extends BaseObservable {
private String title;
private String desc;
/** Constructor */
public Dress() {}
/** Constructor, new instance from Firestore {@link QueryDocumentSnapshot} */
public Dress(@NonNull QueryDocumentSnapshot snapshot) {
this.fromSnapshot(snapshot);
}
public void setTitle(@NonNull String value) {
boolean changed = !TextUtils.equals(this.title, value);
if(changed) {
this.title = value;
notifyPropertyChanged(BR.title);
}
}
public void setDesc(@NonNull String value) {
boolean changed = !TextUtils.equals(this.desc, value);
if(changed) {
this.desc = value;
notifyPropertyChanged(BR.desc);
}
}
@Bindable
public String getTitle() {
return this.title;
}
@Bindable
public String getDesc() {
return this.desc;
}
public void fromSnapshot(@NonNull QueryDocumentSnapshot snapshot) {
this.setTitle(String.valueOf(snapshot.getData().get("title")));
this.setDesc(String.valueOf(snapshot.getData().get("description")));
}
}
添加項目:
ArrayList<Dress> mItems = new ArrayList<>();
...
if (task.isSuccessful()) {
for (QueryDocumentSnapshot snapshot : Objects.requireNonNull(task.getResult())) {
mItems.add(new Dress(snapshot));
}
recyclerView.setAdapter(new dressAdapter(mItems));
}
正在為每個項目調用onBindViewHolder()
。
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="dress" type="com.acme.model.Dress"/>
</data>
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardview"
style="@style/Widget.MaterialComponents.CardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:color="?android:colorControlHighlight"
android:fontFamily="sans-serif-medium"
android:text="@{dress.title}"
android:textColor="#000000"
android:textSize="16sp"
tools:text="@string/tools_dress_title"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:color="?android:colorControlHighlight"
android:fontFamily="sans-serif-medium"
android:text="@{dress.desc}"
android:textColor="#000000"
android:textSize="16sp"
tools:text="@string/tools_dress_desc"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</com.google.android.material.card.MaterialCardView>
</layout>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.