簡體   English   中英

如何在 RecyclerView 適配器中處理多個視圖

[英]how to handle multiple views in RecyclerView adapter

我在適配器內部使用自定義 ItemClickListener 實現 ReyclerView 的問題:

    public interface ItemClickListener{
    
            void onItemClick(BookModel book);
        } 

這是整個代碼(對於適配器):


package com.example.recyclerview;

import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class BookAdapter extends RecyclerView.Adapter<BookAdapter.BookViewHolder> {
  private BookModel[] booklist;
  ItemClickListener itemClickListener;

    public BookAdapter(BookModel[] booklist, ItemClickListener itemClickListener) {
        this.booklist = booklist;
        this.itemClickListener = itemClickListener;
    }

    @NonNull
    @Override
    public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new BookViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull BookViewHolder holder, int position) {
        holder.bookTitle.setText(booklist[position].getBookName());
        holder.bookAuthor.setText(booklist[position].getBookAuthor());
        holder.bookDescription.setText(booklist[position].getDescription());
        holder.img.setImageResource(booklist[position].getImgId());

        holder.itemView.setOnClickListener(view ->{
            itemClickListener.onItemClick(booklist[position]);
        });

    }

    @Override
    public int getItemCount() {
        return booklist.length;
    }
    public interface ItemClickListener{

        void onItemClick(BookModel book);
    }


    public class BookViewHolder extends RecyclerView.ViewHolder {
        TextView bookTitle;
        TextView bookAuthor;
        TextView bookDescription;
        ImageView img;

        public BookViewHolder(@NonNull View itemView) {
            super(itemView);
            bookTitle = itemView.findViewById(R.id.bookTitle);
            bookAuthor = itemView.findViewById(R.id.bookAuthor);
            bookDescription = itemView.findViewById(R.id.bookDesc);
            img = itemView.findViewById(R.id.imgView);
        }
    }
}

所以問題是當我覆蓋活動中的 ItemClickListener 以控制列表項中的視圖時(我將附上活動代碼和下面的布局):

MainActivity.java

package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

   // public  boolean flag = false;
   final boolean[] flag = {false};
    BookModel[] bookModels = new BookModel[]{
      new BookModel("مت فارغاً","تود هنري","إن كتاب مت فارغًا هو أداة للأشخاص الذين لا يرغبون في تأجيل أهم أعمالهم - ولا يقصد هنا العمل الوظيفي بل عمل حياتك القابع بداخلك -\n" +
              " إلى الغد. ويعدد تود هنري الأشياء التي تبقينا في حالة رجوع، ثم يفصل كيفية التخلص منها وغرس ممارسات ثابتة في حياتنا تجعلنا نسير على الدرب الصحيح ونفرغ أسمى ما فينا.\n",R.drawable.dieempty),
            new BookModel("الهدوء","سوزان كين","\n" +
                    "يناقش كتاب الهدوء الشخصية الانطوائية بكل شغف بل ويسبر غورها فهو ملىء بقصص لا تنسى لأناس من الواقع،\n" +
                    " ويبين أيضاً إلى أي مدى نبخس الشخصية الانطوائية حقها على نحو لافت وكم نخسر من جراء ذلك.\n" +
                    "فهذا الكتاب الرائع جدير بأن يغير الطريقة التي نرى بها الانطوائيين وكذلك الطريقة التي يرى بها الانطوائيون أنفسهم على حد سواء.\n",R.drawable.quiet),
            new BookModel("شيفرة بلال","د.أحمد خيري العمري","\n" +
                    "أن تتأثر بقصة بلال بن رباح شيء ، ولكن أن تتغير حياتك كلها بسبب ذلك شيء آخر تماما..\n" +
                    "وأن يحدث ذلك في مجتمع عربي مسلم شيء ، ولكن أن يحدث في نيويورك؟!!\n" +
                    "وأن يحدث ذلك في مجتمع عربي مسلم شيء ، ولكن أن يحدث في نيويورك؟!!\n" +
                    "لكن، ذات يوم ..يصل إيميل لأحدهم..، ويتغير كل شيء...\n" +
                    "هذه الرواية هي قصة ما حدث معهم..بسبب (بلال)..\n" +
                    "وما يمكن أن يحدث معك...\n" +
                    "\n",R.drawable.belal),
            new BookModel("من الذي حرك قطعة الجبن الخاصة بي؟","سبنسر جونسون","\n" +
                    "يهدف الكاتب من هذا العمل تجسيد واقع الحياة الذي نعيشها،\n" +
                    " على أسلوب الرمز فرمز إلى متطلبات الحياة وملذاتها بقطعة الجبنة\n" +
                    "، ورمز إلى الحياة التي نعشها والأماكن التي نوجد بها بالممارات العمل تجسيد للواقع الذي نعيش فيه\n" +
                    "، وأراد الكاتب أن يوضح من خلال هذا العمل التغير الذي يحدث داخل متاهة صغيرة، \n" +
                    " يوجد بداخلها أربعة أشخاص هدفهم الأسمى في الوجود هو الحصول على قطعة \"الجبنة\"\n" +
                    " والتي شبهها الكاتب ب\"الرمز أو الهدف\" الذي نسعى في حياتنا الحصول عليه متمثلة في ملذات الحياة مثل\" الصحة،\n" +
                    " المال، اقامة علاقات، الحصول على وظيفة.......وغيرها من ملذات الدنيا، \n" +
                    "فالكل يسعى جاهدا لتحقيق هدفه وإكمال سعادته في الحصول على قطعة الجبن حيث يمثل\n" +
                    " لهم امتلاكها السعادة باكملها، وعدم الحصول عليها يسبب الآلام وعدم السعادة.\n",R.drawable.chess),
            new BookModel("الخيمائي","باولو كويلو","\n" +
                    "الخيميائي هي الرواية الثانية التي كتبها باولو كويليو، والتي حققت نجاحاً عالمياً باهراً، جعل كاتبها من \n" +
                    "أشهر الكتاب العالميين. تتحدث الرواية عن راع أندلسي شاب يدعى سانتياغو. مضى للبحث عن حلمه المتمثل بكنزٍ مدفون قرب أهرامات مصر، بدأت رحلته من\n" +
                    " أسبانيا عندما إلتقى الملك \"ملكي صادق\" الذي أخبره عن الكنز، عَبَرَ مضيق جبل طارق ماراً بالمغرب حتى بلغ مصر، وكانت توجهه طوال الرحلة إشارات غيبية.\n" +
                    "\n" +
                    "وفي طريقه للعثور على كنزه الحلم، أحداث كثيرة تقع، كل حدث منها استحال عقبة تكاد تمنعه من متابعة رحلته، إلى أن يجد الوسيلة التي تساعده على تجاوز هذه العقبة....\n" +
                    "وهكذا تتلخص الفكرة لهذه الرواية بجملة قالها الملك لسانتياغو :\"إذا رغبت في شيء.. فإن العالم كله يطاوعك لتحقيق رغبتك\".",R.drawable.alchemist)
    };
    BookAdapter adapter;
    RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);


        adapter = new BookAdapter(bookModels, new BookAdapter.ItemClickListener() {


            @Override
            public void onItemClick(BookModel book) {

                Toast.makeText(getApplicationContext(), "the item -> "+book.getBookName()+" is clicked!", Toast.LENGTH_LONG).show();

                ImageView favIcon = (ImageView) findViewById(R.id.favIcon);

                favIcon.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        if(flag[0] == false){
                            Toast.makeText(getApplicationContext(),"flag --> "+ flag[0],Toast.LENGTH_LONG).show();
                            favIcon.setImageResource(R.drawable.fav_red);
                            flag[0] = true;
                        }else{
                            Toast.makeText(getApplicationContext(),"flag --> "+ flag[0],Toast.LENGTH_LONG).show();
                            favIcon.setImageResource(R.drawable.fav2);
                            flag[0] = false;
                        }
                    }
                });









            }
        });
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);



    }
}

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="15dp"
    android:clickable="true"
    android:elevation="15dp"
    app:cardCornerRadius="15dp"

    xmlns:app="http://schemas.android.com/apk/res-auto">






        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/bookTitle"
                android:layout_marginTop="10dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Book title"
                android:textSize="20dp"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/bookAuthor"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Book's author"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:textSize="15dp"
                />



            <TextView
                android:id="@+id/bookDesc"
                android:layout_marginTop="10dp"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="This is the supporting text This is the supporting text This is the supporting text This is the supporting text This is the supporting text This is the supporting text"
                android:textSize="15dp"/>


            <ImageView
                android:id="@+id/imgView"
                android:padding="20dp"
                android:layout_marginTop="10dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/book"/>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="20dp"
                android:gravity="right"
                android:layout_margin="20dp">
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/read"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    />

                <ImageView
                    android:id="@+id/favIcon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/fav2"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"/>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_download"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"/>

            </LinearLayout>

            

        </LinearLayout>

</androidx.cardview.widget.CardView>

當我點擊 ImageView (favIcon) 時出現問題,它沒有直接啟用,首先執行 onItemClick for(ItemClickListener) 接口,然后執行嵌套 onClickListener(favIcon) 的 onClick - 我必須雙擊才能啟用紅色收藏夾圖標? 所以有一種方法可以在不使用嵌套監聽器的情況下控制 list_item 內的多個視圖?

這是我的應用程序的快照:

在此處輸入圖像描述

雙擊后的結果

在此處輸入圖像描述

您可以使用 ItemClickListener 獲取被點擊的內容並執行與之相關的操作。 剛剛將您的 ItemClickListener 更改為以下內容:

public interface ItemClickListener{

    void onItemClick(String type, BookModel book);
}

現在將點擊偵聽器添加到項目所需的所有視圖中。 例如。 對於您的 favIcon,您可以發送 type=fav,對於您的下載圖標,您可以發送 type=download 等。

 holder.itemView.setOnClickListener(view ->{
        itemClickListener.onItemClick("item", booklist[position]);
    });
 holder.favIcon.setOnClickListener(view ->{
        itemClickListener.onItemClick("fav", booklist[position]);
    });

現在只需使用 switch case using type 並處理您的點擊。

        @Override
        public void onItemClick(String type, BookModel book) {
            switch(type){
                "fav" : //Your Fav handling here
                      break;
                "download" : //Your download handling here
                      break;
                "item" : //Your item click handling here
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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