簡體   English   中英

如何在android RecyclerView中使用帶有多個項目的onBindViewHolder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM