如何在 RecyclerView item click 上实现两个 OnClickListeners?
How to implement two OnClickListeners on RecyclerView item click?
我很困惑,因为我需要使用两个 OnClickListener 来满足两种不同的需求。
我有一个 Recyclerview,一旦他的任何项目,一旦被按下,就需要改变,我已经使用 OnBindViewHolder.itemView.setOnClickListener
成功实现了它
现在,我想要同一次点击来更新我的 BottomAppBar,为此,我向我的 ItemHolder class 添加了一个界面。问题是现在我一旦点击,由于界面的原因(我猜)没有任何反应。
我知道理解我的情况可能有点复杂,所以我添加了以下代码来帮助解决这个问题:
public class MainActivity extends AppCompatActivity implements MultiViewTypeAdapter.IClickListener {
有这个功能:
@Override
public void onItemClick(View view, int position) {
int type = adapter.getItemViewType(position);
if (type == 0) {
bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);
bar.replaceMenu(R.menu.bab_menu_chosen_project);
fab.setImageDrawable(getDrawable(R.drawable.ic_message_white_24dp));
}
else{
bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER);
bar.replaceMenu(R.menu.bab_menu_primary);
fab.setImageDrawable(getDrawable(R.drawable.ic_reply_black_24dp));
}
}
适配器的界面如下所示:
public interface IClickListener {
void onItemClick(View view, int position);
}
我目前在做什么
public static class SelectedProjectItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
这是:
@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
然而,我想要运行的是我正在做的
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {
是:
((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataSet.remove(listPosition);
dataSet.add(listPosition, unselectedCards.get(listPosition));
notifyItemChanged(listPosition);
}
});
我希望一次点击会发生两件事 - Recyclerview 上的项目将使用我描述的最后一段代码更改,MainActivity 中的菜单将使用我描述的第一段代码更改。
谢谢帮助!
从 RecyclerView.ViewHolder
中删除以下代码
@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
并在"itemView"中添加监听事件点击如下:
((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null){
listener.onItemClick(v, getAdapterPosition());
}
dataSet.remove(listPosition);
dataSet.add(listPosition, unselectedCards.get(listPosition));
notifyItemChanged(listPosition);
}
});
您可以使用 UIHandler 或 MainLoop 将 BottomBar 宽度更改为相同(唯一)单击,您可以使用它们从适配器访问 UI。
在你的 OnCreate 上:
@Override
protected void onCreate(Bundle savedInstanceState) {
//.....
Handler uiHandle = new Handler(getMainLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle b = (Bundle) msg.obj;
int p = b.getInt("position");
Toast.makeText(MainActivity.this, "Change here your BottomBAR", Toast.LENGTH_SHORT).show();
}
};
.. 并且在您的适配器中...
yourobjectclick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// example: first change color of my object that I have clicked
((TextView)v).setTextColor( mContext.getResources().getColor(R.color.blue_100));
Bundle bundle = new Bundle();
//i can store the position about click and
bundle.putInt("position",position);
Message message = handler.obtainMessage();
message.obj = bundle;
// i have access tu User Interface objects from here
// next change my bottombar sending a message to UI
handler.sendMessage(message);
Toast.makeText(mContext, "onClick: su -> "+tvBikeName.getText(), Toast.LENGTH_SHORT).show();
}
});
我很困惑,因为我需要使用两个 OnClickListener 来满足两种不同的需求。
我有一个 Recyclerview,一旦他的任何项目,一旦被按下,就需要改变,我已经使用 OnBindViewHolder.itemView.setOnClickListener
现在,我想要同一次点击来更新我的 BottomAppBar,为此,我向我的 ItemHolder class 添加了一个界面。问题是现在我一旦点击,由于界面的原因(我猜)没有任何反应。
我知道理解我的情况可能有点复杂,所以我添加了以下代码来帮助解决这个问题:
public class MainActivity extends AppCompatActivity implements MultiViewTypeAdapter.IClickListener {
有这个功能:
@Override
public void onItemClick(View view, int position) {
int type = adapter.getItemViewType(position);
if (type == 0) {
bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);
bar.replaceMenu(R.menu.bab_menu_chosen_project);
fab.setImageDrawable(getDrawable(R.drawable.ic_message_white_24dp));
}
else{
bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER);
bar.replaceMenu(R.menu.bab_menu_primary);
fab.setImageDrawable(getDrawable(R.drawable.ic_reply_black_24dp));
}
}
适配器的界面如下所示:
public interface IClickListener {
void onItemClick(View view, int position);
}
我目前在做什么
public static class SelectedProjectItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
这是:
@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
然而,我想要运行的是我正在做的
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {
是:
((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataSet.remove(listPosition);
dataSet.add(listPosition, unselectedCards.get(listPosition));
notifyItemChanged(listPosition);
}
});
我希望一次点击会发生两件事 - Recyclerview 上的项目将使用我描述的最后一段代码更改,MainActivity 中的菜单将使用我描述的第一段代码更改。
谢谢帮助!
从 RecyclerView.ViewHolder
中删除以下代码@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
并在"itemView"中添加监听事件点击如下:
((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null){
listener.onItemClick(v, getAdapterPosition());
}
dataSet.remove(listPosition);
dataSet.add(listPosition, unselectedCards.get(listPosition));
notifyItemChanged(listPosition);
}
});
您可以使用 UIHandler 或 MainLoop 将 BottomBar 宽度更改为相同(唯一)单击,您可以使用它们从适配器访问 UI。 在你的 OnCreate 上:
@Override
protected void onCreate(Bundle savedInstanceState) {
//.....
Handler uiHandle = new Handler(getMainLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle b = (Bundle) msg.obj;
int p = b.getInt("position");
Toast.makeText(MainActivity.this, "Change here your BottomBAR", Toast.LENGTH_SHORT).show();
}
};
.. 并且在您的适配器中...
yourobjectclick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// example: first change color of my object that I have clicked
((TextView)v).setTextColor( mContext.getResources().getColor(R.color.blue_100));
Bundle bundle = new Bundle();
//i can store the position about click and
bundle.putInt("position",position);
Message message = handler.obtainMessage();
message.obj = bundle;
// i have access tu User Interface objects from here
// next change my bottombar sending a message to UI
handler.sendMessage(message);
Toast.makeText(mContext, "onClick: su -> "+tvBikeName.getText(), Toast.LENGTH_SHORT).show();
}
});