如何处理 RecyclerView 适配器中的多个视图
我在适配器内使用自定义 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 -我必须双击才能启用红色 favIcon,因此有一种方法可以在不使用嵌套侦听器的情况下控制 list_item 内的多个视图?
这是我的应用程序的快照:
双击后的结果
<一个href="https://i.sstatic.net/Q9e1U.png" rel="nofollow noreferrer">
the problem that I implement a ReyclerView with a custom ItemClickListener inside the adapter:
public interface ItemClickListener{
void onItemClick(BookModel book);
}
and here is the whole code (for Adapter):
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);
}
}
}
so the problem that when I have overridden the ItemClickListener inside the activity to control the views inside the list-item( I will attach the code of the activity and the layout below):
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>
the problem when I clicked the ImageView (favIcon), it's not enabled directly!
which the onItemClick for(ItemClickListener) interface executed first, then
the onClick for the nested onClickListener(favIcon) executed -I have to make a double click to enable the red favIcon, so there is a way that I can control multiple views inside the list_item without using nested Listener?
here is a snapshot of my app:
the result after double click
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 ItemClickListener 获取正在单击的内容并执行与其相关的操作。刚刚将您的 ItemClickListener 更改为以下内容:
现在将单击侦听器添加到您的项目所需的所有视图中。例如。对于您的 favIcon,您可以发送 type=fav,对于您的下载图标,您可以发送 type=download 等。
现在只需使用 switch case using type 并处理您的点击。
You can use your ItemClickListener to get what is being clicked and perform action related to it. Just changed your ItemClickListener to following:
Now add click listener to all the views you require for your item. Eg. for you favIcon you can send type=fav, for your download icon type=download, etc.
Now just use switch case using type and handle your click.