android - 如何在同一活动中为两个不同的回收视图设置两个不同的 onClick 侦听器
问题描述
我有一个带有两个不同回收站视图的活动。为他们提供两个适配器。
- 抽屉适配器。我已经设置了一个 onClickListner 接口并在 Activity 类中实现。
抽屉适配器
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.DrawerItemViewHolder>{
Context mContext;
int layoutResID;
ArrayList<DrawerItem> menuList;
onItemClickListner mListner;
DrawerLayout mDrawerLayout;
RecyclerView mDrawerList;
WebView webViewLayout;
LinearLayout mDrawerListParent;
Toolbar toolbar;
int[] drawer_icons=new int[]{R.drawable.dr_plus,R.drawable.dr_plus_square,R.drawable.dr_search,R.drawable.dr_tasks,R.drawable.dr_dashboard
,R.drawable.dr_buy_dashboard,R.drawable.dr_add_user2,R.drawable.dr_table,R.drawable.dr_status_map,R.drawable.dr_trackchanges
,R.drawable.dr_templates};
public interface onItemClickListner{
void onItemClick(int position);
}
public class DrawerItemViewHolder extends RecyclerView.ViewHolder{
TextView itemTitle;
ImageView itemIcon;
onItemClickListner listner;
RelativeLayout dItemParentLayout;
public DrawerItemViewHolder(View itemView, final onItemClickListner listner) {
super(itemView);
itemTitle=itemView.findViewById(R.id.menu_item_title);
itemIcon=itemView.findViewById(R.id.menu_item_icon);
this.listner=listner;
dItemParentLayout=itemView.findViewById(R.id.d_item);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listner!=null){
int position=DrawerItemViewHolder.this.getAdapterPosition();
if (position!=RecyclerView.NO_POSITION){
listner.onItemClick(position);
}
}
}
});
}
}//ViewHolder
public DrawerAdapter(int resource, ArrayList<DrawerItem> itemList, WebView webViewLayout,
DrawerLayout mDrawerLayout, RecyclerView mDrawerList, LinearLayout drawerListParent,
Toolbar pToolbar,onItemClickListner listner){
layoutResID=resource;
menuList=itemList;
mListner=listner;
this.mDrawerLayout=mDrawerLayout;
this.mDrawerList=mDrawerList;
this.webViewLayout=webViewLayout;
this.mDrawerListParent=drawerListParent;
toolbar=pToolbar;
}
//======================================================================================
@Override
public DrawerItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_list_item,parent,false);
DrawerItemViewHolder dvh=new DrawerItemViewHolder(v,mListner);
return dvh;
}
//======================================================================================
@Override
public void onBindViewHolder(final DrawerItemViewHolder holder, final int position) {
final DrawerItem currentItem=menuList.get(position);
// holder.itemIcon.setImageResource(drawer_icons[position]);
holder.itemTitle.setText(currentItem.getTitle());
holder.dItemParentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//ONCLICK EVENTS
System.out.print("CLICKED AT:"+position +"\n");
webViewLayout.setWebViewClient(new WebViewClient());
toolbar.setSubtitle(currentItem.title);
// toolbar.setLogo(R.drawable.car3);
String xurl="someURL/"+currentItem.getLinkURL();
webViewLayout.loadUrl(xurl);
mDrawerLayout.closeDrawer(mDrawerListParent);
}
});
}
//======================================================================================
@Override
public int getItemCount() {
return menuList.size();
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
}
- 通知适配器。我在notificationAdapter 的onBindViewHolder 中设置了一个onclick 监听器。
通知适配器
public class NoificationAdapter extends RecyclerView.Adapter<NoificationAdapter.NotificationHolder> {
private ArrayList<NotificationItem> notificationItems;
private onItemClickListner mListner;
private int layoutResID,notificationposition;
Context myContext;
String notificationDate,notificationRecType;
String []myc={"#43A047","#C62828","#039BE5","#F57C00","#4A148C","#43A047",
"#039BE5","#C62828","#43A047","#C62828","#039BE5","#F57C00","#4A148C",
"#43A047","#039BE5","#C62828"};
public interface onItemClickListner{
void onItemClick(int position);
}
public static class NotificationHolder extends RecyclerView.ViewHolder{
TextView mNotificationTextView;
RelativeLayout mNotificaionHolderLayout;
ImageView imageDelete;
String mNotificationURL;
String mNotificationDate;
String mNotificationRT;
onItemClickListner listner;
public NotificationHolder(View itemView,final onItemClickListner listner) {
super(itemView);
this.listner=listner;
mNotificationTextView=itemView.findViewById(R.id.NotificationTextView);
mNotificaionHolderLayout=itemView.findViewById(R.id.notification__item_container);
imageDelete=itemView.findViewById(R.id.notification_delete_image);
mNotificationRT=null;
mNotificationURL=null;
mNotificationDate=null;
// itemView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// if (listner != null) {
// int position = NotificationHolder.this.getAdapterPosition();
// if (position != RecyclerView.NO_POSITION) {
// listner.onItemClick(position);
// }
// }
// }
// });
}
}//END OF NOTIFICATION_VH
public NoificationAdapter(Context context,int resource,ArrayList<NotificationItem> notificationList,onItemClickListner listner){
myContext=context;
layoutResID=resource;
notificationItems=notificationList;
mListner=listner;
notificationposition=0;
}
@Override
public NotificationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_notificationitem,parent,false);
NotificationHolder evh=new NotificationHolder(v,mListner);
return evh;
}
@Override
public void onBindViewHolder(NotificationHolder holder, int position) {
final NotificationItem currentItem=notificationItems.get(position);
notificationposition=currentItem.getPositionNumber();
if (notificationposition>=myc.length){
if (notificationposition%2==0){
holder.mNotificaionHolderLayout.setBackgroundColor(Color.parseColor(myc[0]));
holder.imageDelete.setBackgroundColor(Color.parseColor(myc[0]));
}else {
holder.mNotificaionHolderLayout.setBackgroundColor(Color.parseColor(myc[2]));
holder.imageDelete.setBackgroundColor(Color.parseColor(myc[2]));
}
}
holder.mNotificaionHolderLayout.setBackgroundColor(Color.parseColor(myc[notificationposition]));
holder.imageDelete.setBackgroundColor(Color.parseColor(myc[notificationposition]));
holder.mNotificationTextView.setText(currentItem.getNotification_name());
holder.mNotificationURL=currentItem.getNotification_link();
holder.mNotificationDate=currentItem.getNotification_date();
holder.mNotificationRT=currentItem.getNotification_rT();
if (!holder.mNotificationURL.isEmpty()){
holder.imageDelete.setVisibility(View.INVISIBLE);
}
holder.imageDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteNotification(currentItem);
}
});
}
@Override
public int getItemCount() {
return notificationItems.size();
}
//Delete from View
public void deleteNotification(NotificationItem todelete){
int notificationPosition=notificationItems.indexOf(todelete);
notificationItems.remove(notificationPosition);
notifyItemRemoved(notificationPosition);
notifyItemChanged(notificationPosition);
}
}
当我在我的活动中添加这两个适配器时,如果我先滚动通知,然后抽屉想要滚动。反之亦然,只有一个监听器在工作,那个是第一个使用的。
活动.java
public class NavigationDrawerActivity extends AppCompatActivity implements DrawerAdapter.onItemClickListner,NoificationAdapter.onItemClickListner{
//in fill drawer function
drawerAdapter = new DrawerAdapter(R.layout.drawer_list_item, drawerItemList,
webViewLayout, mDrawerLayout, mDrawerList,
mDrawerParent,mToolbar,
NavigationDrawerActivity.this);
drawerAdapter.setHasStableIds(true);
mDrawerList.setAdapter(drawerAdapter);
//in fill notification function
nfAdapter=new NoificationAdapter(NavigationDrawerActivity.this,
R.id.listView_Notific_Link, notificationList,nListner);
lvNotification.setAdapter(nfAdapter);
}
我该如何解决这个问题?
解决方案
这涉及很少的代码更改。
听众1
interface Listener1 {
function1();
}
监听器2
interface Listener2 {
function1(){}
}
活动代码
YourActivity implements Listener1, Listener2 {
// Override functionality
function1(){}
function2(){}
// Pass reference to Adapters like this
drawerAdapter = new DrawerAdapter(R.layout.drawer_list_item, drawerItemList,
webViewLayout, mDrawerLayout, mDrawerList,
mDrawerParent,mToolbar,
YourActivity.this);
}
最重要的事情在你的适配器中输入你的听众
NotificationAdapter {
Listener1 listener1;
NotificationAdapter(whatever, .... , listener1){
listener1 = (Listener1)listener1 // Because by default it will be YourActivity. This is how inheritance works.
}
}
对另一个将 Listener2 作为实例变量的适配器执行相同的操作。
推荐阅读
- laravel - 使用资产与不使用相比有优势吗?
- c# - 如何仅使用货币的硬币符号显示硬币并本地化显示?
- java - Android layout_weight iframe 和滚动
- c# - HTTP polling VS Websocket VS Webhooks 之间是否存在显着的资源使用差异?
- wordpress - 如何使用来自 get_the_content() 的原始数据作为变量
- python - 如何测试 PyVista 是否成功绘制了图形?
- machine-learning - 我可以使用 MCA 的结果使用 K-means、DBScan 或 GMM 进行聚类吗?
- reactjs - React-widgets DateTimePicker 无法正常工作,给出无法分配给类型“只读”的错误
' - python - 覆盖 object.__new__ 时的不一致
- python - 1.0 作为布尔数据类型导致 pd.read_csv() 中的 ValueError