Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的recyclerView上的onClickListener不';我不会被叫的原因是什么_Android - Fatal编程技术网

Android 我的recyclerView上的onClickListener不';我不会被叫的原因是什么

Android 我的recyclerView上的onClickListener不';我不会被叫的原因是什么,android,Android,我为我的recyclerView做了一个onClickListener,但它就是不起作用。 当我从recyclerView中单击一个项目时,日志不会出现,我在OnClickListener中输入的命令不会被调用,我已经花了2-3天的时间来查找问题,但我没有发现代码中有错误,这应该会导致问题的出现,可能是一个愚蠢的小错误 但是如果有人能帮我解决这个问题,我会很高兴的。 在我的适配器类中,我将onClick指定为选中和取消选中复选框 在main活动中,我指定将其保存到数据库中 这是我的主要活动

我为我的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
        }
    }
});