为了账号安全,请及时绑定邮箱和手机立即绑定

如何在android RecyclerView中将onBindViewHolder与多个项目一起使用

如何在android RecyclerView中将onBindViewHolder与多个项目一起使用

幕布斯6054654 2023-06-08 19:25:54
我正在创建一个带有 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);        }    }}由于我对 android studio 和 JAVA 很陌生,所以我没有找到这方面的指南。我添加了 2 个函数,这些函数添加到 Adapter 的不同列表中,但结果是一团糟。到处都在添加文本,并且项目被复制。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

添加项目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>



查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信