Java 如何在android RecyclerView中将onBindViewHolder与多个项目一起使用
我正在创建一个包含CardView的RecyclerView,每张卡片都有标题、描述和图像。使用Java 如何在android RecyclerView中将onBindViewHolder与多个项目一起使用,java,android,firebase,android-recyclerview,google-cloud-firestore,Java,Android,Firebase,Android Recyclerview,Google Cloud Firestore,我正在创建一个包含CardView的RecyclerView,每张卡片都有标题、描述和图像。使用onBindViewHolder只能添加标题,而不能添加其他项目。下面是我如何尝试去做的 这是我的适配器: 公共类userDressAdapter扩展了RecyclerView.Adapter{ 私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场; 私人名单数据; 私有对象视图组; userDressAdapter(上下文、列表数据)
onBindViewHolder
只能添加标题,而不能添加其他项目。下面是我如何尝试去做的
这是我的适配器:
公共类userDressAdapter扩展了RecyclerView.Adapter{
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私人名单数据;
私有对象视图组;
userDressAdapter(上下文、列表数据){
this.layoutInflater=layoutInflater.from(上下文);
这个数据=数据;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
视图视图=LayoutFlater.inflate(R.layout.dress\u recycler\u视图,(android.View.ViewGroup)视图组,false);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
字符串标题=data.get(位置);
ViewHolder.dressTitle.setText(标题);
ViewHolder.dressDescription.setText(标题);
}
@凌驾
public int getItemCount(){
返回data.size();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
静态文本视图标题;
静态文本视图描述;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
dressTitle=itemView.findViewById(R.id.userDressTitleText);
dressDescription=itemView.findViewById(R.id.userDressDescriptionText);
}
}
}
我使用它作为视图的主适配器,下面是我如何从主Java类调用它:
公共类UserDressView扩展了AppCompative活动{
私有静态最终字符串TAG=“UserDressView”;
回收视图回收视图;
com.innoventiq.fostania.userDressAdapter userDressAdapter;
数组列表项;
阵列列表描述;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u user\u dress\u view);
items=newarraylist();
description=新建ArrayList();
ReadDressData();
}
公共void AddDressToList(字符串数据){
项目。添加(数据);
recyclerView=findViewById(R.id.userDressRecyclerView);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
userDressAdapter=新的userDressAdapter(此,项);
setAdapter(userDressAdapter);
}
public void addressDescriptionList(字符串数据){
说明.添加(数据);
recyclerView=findViewById(R.id.userDressRecyclerView);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
userDressAdapter=新的userDressAdapter(此,描述);
setAdapter(userDressAdapter);
}
public void ReadDressData(){
FirebaseFirestore db=FirebaseFirestore.getInstance();
db.收藏(“服饰”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
for(QueryDocumentSnapshot文档:Objects.requirennull(task.getResult())){
Log.d(标记,document.getId()+“=>”+document.getData());
AddDressToList(String.valueOf(document.getData().get(“title”));
AddDressDescriptionList(String.valueOf(document.getData().get(“description”));
}
}否则{
Log.w(标记“获取文档时出错”,task.getException());
}
}
});
}
}
由于我对androidstudio和JAVA非常陌生,所以我没有找到这方面的指南。我在适配器中添加了两个添加到difrrent列表的函数,但结果是一团糟。文本被添加到任何地方,项目被复制 将项目添加到
ArrayList
中,然后只设置一次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));
}
<?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>