Android 我的recyclerView上的onClickListener不';我不会被叫的原因是什么
我为我的recyclerView做了一个onClickListener,但它就是不起作用。 当我从recyclerView中单击一个项目时,日志不会出现,我在OnClickListener中输入的命令不会被调用,我已经花了2-3天的时间来查找问题,但我没有发现代码中有错误,这应该会导致问题的出现,可能是一个愚蠢的小错误 但是如果有人能帮我解决这个问题,我会很高兴的。 在我的适配器类中,我将onClick指定为选中和取消选中复选框 在main活动中,我指定将其保存到数据库中 这是我的主要活动Android 我的recyclerView上的onClickListener不';我不会被叫的原因是什么,android,Android,我为我的recyclerView做了一个onClickListener,但它就是不起作用。 当我从recyclerView中单击一个项目时,日志不会出现,我在OnClickListener中输入的命令不会被调用,我已经花了2-3天的时间来查找问题,但我没有发现代码中有错误,这应该会导致问题的出现,可能是一个愚蠢的小错误 但是如果有人能帮我解决这个问题,我会很高兴的。 在我的适配器类中,我将onClick指定为选中和取消选中复选框 在main活动中,我指定将其保存到数据库中 这是我的主要活动
private void setUpGUI() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
cardView = (CardView) findViewById(R.id.cardView);
recyclerView = (RecyclerView) findViewById(R.id.recylerView);
adapter = new ItemAdapter(new ItemAdapter.ItemClickListener() {
@Override
public void onItemClicked(TodoItem item) {
Log.d(TAG, "on item click");
Uri uri = Uri.parse(TodoItemsContentProvider.CONTENT_URI + "/" + item.getId());
getContentResolver().update(uri, item.toContentValues(), null, null);
}
});
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showAddItemPopup();
}
});
这是我的适配器类
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
private static final String TAG = "item adapter";
private List<TodoItem> items = new ArrayList<>();
private ItemClickListener itemClickListener;
public ItemAdapter(ItemClickListener listener) {
itemClickListener = listener;
}
public void addItem(TodoItem item) {
if (!items.contains(item)) {
items.add(item);
Collections.sort(items);
notifyItemInserted(items.indexOf(item));
}
}
public void addItems(Collection<TodoItem> newItems) {
for (TodoItem item : newItems) {
if (!items.contains(item)) {
items.add(item);
}
}
Collections.sort(items);
notifyDataSetChanged();
}
public TodoItem getItem(int position) {
return items.get(position);
}
public void removeItem(int position) {
items.remove(position);
notifyItemRemoved(position);
}
// This listener listens for clicks to the viewholder. The viewholder passes back the position it is.
private final ClickListener clickListener = new ClickListener() {
@Override
public void onItemClicked(int position) {
Log.d(TAG, "on click adapter");
// Get the item that was clicked
TodoItem item = items.get(position);
// Set the completed state
item.setCompleted(!item.isCompleted());
//Update the UI
notifyItemChanged(position);
// Pass the item back the the itemclicklistener
itemClickListener.onItemClicked(item);
}
};
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.todo_list_item, parent, false);
return new ViewHolder(v, clickListener);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
TodoItem item = items.get(position);
holder.textView.setText(item.getText());
holder.subTextViewA.setText(item.getSubText());
holder.checkBox.setChecked(item.isCompleted());
//holder.backgroundLayout.setBackgroundColor(Color.parseColor("#ec48e418"));
}
@Override
public int getItemCount() {
return items.size();
}
// The view holder listens to clicks on the
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
// private RelativeLayout backgroundLayout;
final TextView textView, subTextViewA;
final CheckBox checkBox;
final ClickListener clickListener;
public ViewHolder(View itemView, ClickListener clickListener) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
subTextViewA = (TextView) itemView.findViewById(R.id.subTextViewA);
checkBox = (CheckBox) itemView.findViewById(R.id.checkBox);
//backgroundLayout = (RelativeLayout) itemView.findViewById(R.id.backgroundLayout);
itemView.setOnClickListener(this);
this.clickListener = clickListener;
}
@Override
public void onClick(View v) {
clickListener.onItemClicked(getAdapterPosition());
}
}
// Private listener fot the adapter to know about view clicks
private interface ClickListener {
void onItemClicked(int position);
}
// Public listener to pass the item back to the activity
public interface ItemClickListener {
void onItemClicked(TodoItem item);
}
公共类ItemAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串TAG=“item adapter”;
私有列表项=新的ArrayList();
私有项ClickListener项ClickListener;
公共项适配器(项ClickListener侦听器){
itemClickListener=监听器;
}
公共无效附加项(TodoItem项){
如果(!items.contains(item)){
项目。添加(项目);
收集.分类(项目);
notifyItemInserted(items.indexOf(item));
}
}
公共无效附加项(集合新项){
用于(TodoItem项:新建项){
如果(!items.contains(item)){
项目。添加(项目);
}
}
收集.分类(项目);
notifyDataSetChanged();
}
公共TodoItem getItem(内部位置){
返回项目。获取(位置);
}
公共无效删除项(内部位置){
项目。移除(位置);
已移除(位置)的项目;
}
//此侦听器侦听viewholder的单击。viewholder返回其当前位置。
private final ClickListener ClickListener=新建ClickListener(){
@凌驾
已单击公共位置(内部位置){
Log.d(标记“点击适配器”);
//获取已单击的项目
TodoItem item=items.get(位置);
//设置完成状态
item.setCompleted(!item.isCompleted());
//更新用户界面
(职位)变更;
//将项目传回itemclicklistener
itemClickListener.onItemClicked(项目);
}
};
@凌驾
public ViewHolder onCreateViewHolder(最终视图组父级,最终int视图类型){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.todo\u list\u项,parent,false);
返回新的ViewHolder(v,clickListener);
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
TodoItem item=items.get(位置);
holder.textView.setText(item.getText());
holder.subTextViewA.setText(item.getSubText());
holder.checkBox.setChecked(item.isCompleted());
//holder.backgroundLayout.setBackgroundColor(Color.parseColor(“#ec48e418”);
}
@凌驾
public int getItemCount(){
返回items.size();
}
//视图保持器将侦听对视图的单击
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
//私人关系背景布局;
最终文本视图文本视图,子文本视图a;
最终复选框;
最终点击监听器点击监听器;
公共视图持有者(查看项目视图,单击侦听器单击侦听器){
超级(项目视图);
textView=(textView)itemView.findViewById(R.id.textView);
subTextViewA=(TextView)itemView.findViewById(R.id.subTextViewA);
checkBox=(checkBox)itemviewbyd(R.id.checkBox);
//backgroundLayout=(RelativeLayout)itemView.findViewById(R.id.backgroundLayout);
setOnClickListener(这个);
this.clickListener=clickListener;
}
@凌驾
公共void onClick(视图v){
单击Listener.onItemClicked(getAdapterPosition());
}
}
//专用侦听器用于让适配器了解视图单击
专用接口ClickListener{
已单击的无效位置(内部位置);
}
//公共侦听器将项目传递回活动
公共接口项ClickListener{
已单击的无效项(TodoItem项);
}
}单击复选框时,itemView.OnClickListener不会调用 您可以设置click listener for复选框,并像这样从数据库中保存(或删除)项 在您的活动中:
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(Item item, boolean save) {
if (save) {
// Save
} else {
// Remove from db
}
}
});
非常感谢您的回答,但我想在整个视图上设置onClickListener,因为我想在单击视图时设置一个弹出窗口,我尝试在ViewHolder中使用itemView.setOnClickListener(此);但是这一行不起作用,因为只有复选框a可以生成checkBox.setOnClickListener(this);但是无论如何,谢谢是的,我希望能够单击整个视图以弹出一个对话框,,并且单击侦听器需要工作,因为这一行itemView.setOnClickListener(this);但它不起作用,我可以制作textView.setOnClickListener(这个);但是它只在文本视图上,不在整个视图上。谢谢
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(Item item, boolean save) {
if (save) {
// Save
} else {
// Remove from db
}
}
});