2017-07-31 10 views
0

Recyclerviewアイテムのクリックでカスタムダイアログを表示しようとしていますが、何も起こりません。私はRecyclerviewのカスタムonClick機能を使用しています。これは私のコードです:まず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); 
    } 
} 

}

答えて

1

私はあなたの中クリックリスナーを設定することが容易になります確信していますonBindViewHoldercontainerView - あなたのviewholder

@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(); 
       } 
      } 
     }); 
    } 
+1

それはViewHolder内部リスナーをバインドするためのより良い練習だとも、あなたのリスナーを再利用することから、このビューを取得します。詳細については、[なぜRecyclerView.AdapterのonBindViewHolder内にOnClickListenerを追加するのが悪いと考えられるのですか?](https://stackoverflow.com/a/33845951/3641665)を参照してください。 – apSTRK

+0

そうです。私はちょうど彼のためにコードがより明確になることを望んでいた。だから、彼はaddonitemtouchlistenetを使わないことを理解するだろう – motis10

関連する問題