Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 onClick不工作_Android_Android Recyclerview - Fatal编程技术网

Android RecyclerView onClick不工作

Android RecyclerView onClick不工作,android,android-recyclerview,Android,Android Recyclerview,我试图通过Recyclerview项单击启动自定义对话框,但什么也没发生。我正在为Recyclerview使用自定义onClick功能。这是我的代码: recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() { @Override p

我试图通过Recyclerview项单击启动自定义对话框,但什么也没发生。我正在为Recyclerview使用自定义onClick功能。这是我的代码:

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
                    @Override public void onItemClick(View view, int position) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                        builder.setView(getLayoutInflater().inflate(R.layout.edit_dialog, null));
                        builder.setTitle("Edit Item");
                        builder.setNeutralButton("TEST", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Log.d("TEST","Test button was clicked in AlertDialog");
                            }
                        });
                        builder.setCancelable(true);
                        builder.show();
                    }

                    @Override public void onLongItemClick(View view, int position) {}
                })
起初,我认为问题在于我没有为对话框设置按钮,但即使设置了一个中性按钮,它仍然不起作用。以下是我的recyclerview onClick功能:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {return false;}

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {}

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);

        public void onLongItemClick(View view, int position);
    }

    GestureDetector mGestureDetector;

    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {

        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {

            @Override
            public boolean onSingleTapUp(MotionEvent e) {return true;}

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && mListener != null) {
                    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                }
            }
        });
    }
}
这是我的适配器:

public class CustomCursorAdapter extends RecyclerView.Adapter<CustomCursorAdapter.TaskViewHolder>{

private Cursor cursor;
private Context con;

public CustomCursorAdapter(Context context) {
    this.con = context;
}



@Override
public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(con).inflate(R.layout.task_layout, parent, false);
    return new TaskViewHolder(view);
}

@Override
public void onBindViewHolder(TaskViewHolder holder, int position) {

    int index = cursor.getColumnIndex(TaskContract.TaskEntry._ID);
    int descriptionOfIndex = cursor.getColumnIndex(TaskContract.TaskEntry.COLUMN_DESCRIPTION);
    int priorityofIndex = cursor.getColumnIndex(TaskContract.TaskEntry.COLUMN_PRIORITY);

    cursor.moveToPosition(position);

    final int id = cursor.getInt(index);
    String description = cursor.getString(descriptionOfIndex);
    int priority = cursor.getInt(priorityofIndex);

    holder.itemView.setTag(id);
    holder.taskDescriptionView.setText(description);

    String priorityString = "" + priority;
    holder.priorityView.setText(priorityString);

    GradientDrawable priorityCircle = (GradientDrawable) holder.priorityView.getBackground();
    int priorityColor = getPriorityColor(priority);
    priorityCircle.setColor(priorityColor);

}

private int getPriorityColor(int priority) {
    int priorityColor = 0;

    switch(priority) {
        case 1: priorityColor = ContextCompat.getColor(con, R.color.materialRed);
            break;
        case 2: priorityColor = ContextCompat.getColor(con, R.color.materialOrange);
            break;
        case 3: priorityColor = ContextCompat.getColor(con, R.color.materialYellow);
            break;
        default: break;
    }
    return priorityColor;
}

@Override
public int getItemCount() {
    if (cursor == null) {
        return 0;
    }
    return cursor.getCount();
}

public Cursor swapCursor(Cursor c) {
    if (cursor == c) {
        return null;
    }
    Cursor temp = cursor;
    this.cursor = c;

    if (c != null) {
        this.notifyDataSetChanged();
    }
    return temp;
}

class TaskViewHolder extends RecyclerView.ViewHolder {

    TextView taskDescriptionView;
    TextView priorityView;

    public TaskViewHolder(View itemView) {
        super(itemView);

        taskDescriptionView = (TextView) itemView.findViewById(R.id.taskDescription);
        priorityView = (TextView) itemView.findViewById(R.id.priorityTextView);
    }
}
公共类CustomCursorAdapter扩展了RecyclerView.Adapter{
私有游标;
私人语境;
公共CustomCursorAdapter(上下文){
this.con=上下文;
}
@凌驾
公共任务ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=布局展开器。从(con)。充气(R.layout.task_布局,父,false);
返回新的TaskViewHolder(视图);
}
@凌驾
public void onBindViewHolder(任务视图持有者,int位置){
int index=cursor.getColumnIndex(TaskContract.TaskEntry.\u ID);
int descriptionOfIndex=cursor.getColumnIndex(TaskContract.TaskEntry.COLUMN\u DESCRIPTION);
int priorityofIndex=cursor.getColumnIndex(TaskContract.TaskEntry.COLUMN\u PRIORITY);
光标。移动位置(位置);
final int id=cursor.getInt(索引);
字符串描述=cursor.getString(descriptionOfIndex);
int priority=cursor.getInt(priorityofIndex);
holder.itemView.setTag(id);
holder.taskDescriptionView.setText(说明);
字符串优先级String=”“+优先级;
holder.priorityView.setText(priorityString);
GradientDrawable priorityCircle=(GradientDrawable)holder.priorityView.getBackground();
int priorityColor=getPriorityColor(优先级);
优先圈。设置颜色(优先颜色);
}
私有int getPriorityColor(int优先级){
int priorityColor=0;
交换机(优先级){
案例1:priorityColor=ContextCompat.getColor(con,R.color.materialRed);
打破
案例2:priorityColor=ContextCompat.getColor(con,R.color.materialRange);
打破
案例3:priorityColor=ContextCompat.getColor(con,R.color.materialYellow);
打破
默认:中断;
}
返回优先颜色;
}
@凌驾
public int getItemCount(){
if(游标==null){
返回0;
}
返回cursor.getCount();
}
公共游标交换游标(游标c){
如果(游标==c){
返回null;
}
光标温度=光标;
this.cursor=c;
如果(c!=null){
this.notifyDataSetChanged();
}
返回温度;
}
类TaskViewHolder扩展了RecyclerView.ViewHolder{
TextView任务描述视图;
文本视图优先视图;
公共任务视图持有者(视图项视图){
超级(项目视图);
taskDescriptionView=(TextView)itemView.findViewById(R.id.taskDescription);
priorityView=(TextView)itemView.findViewById(R.id.priorityTextView);
}
}

}

我相信在
onBindViewHolder
中设置单击侦听器会更容易。
containerView
-从您的视图持有者处获取此视图

    @Override
    public void onBindViewHolder(TaskViewHolder holder, int position) {
            containerView.setOnClickListener(new DefaultInterfaceImplUtils.ClickListener() {
                @Override
                public void onViewClicked(View v) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setView(getLayoutInflater().inflate(R.layout.edit_dialog, null));
                    builder.setTitle("Edit Item");
                    builder.setNeutralButton("TEST", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Log.d("TEST", "Test button was clicked in AlertDialog");
                        }
                    });
                    builder.setCancelable(true);
                    builder.show();
                }
            }
        });
    }

更好的做法是在ViewHolder中绑定侦听器,并重用侦听器。有关更多信息,请参阅。你说得对。我只是想让代码对他更清楚。所以他会明白不要使用AddonimtouchListenet