Android RecyclerView onClick不工作
我试图通过Recyclerview项单击启动自定义对话框,但什么也没发生。我正在为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.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