2017-08-01 67 views
-1

我正在構建一個涉及Recyclerview的應用程序。我想在點擊每個項目(編輯該項目的內容)時啓動一個對話框,但現在,我只想在每個項目單擊該項目的唯一ID時顯示一個Toast消息。有在stackoverflow的例子,但他們都是不同的方法,我不知道如何實現他們到我的應用程序(我還在學習Recyclerviews)。這是我在處理點擊動作時的嘗試,但它沒有做任何事情:如何處理項目onClick我的Recyclerview

recyclerView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(addTaskActivity, view + " is clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

什麼也沒有發生。以下是我的MainActivity.javaCustomCursorAdapter.java文件。

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static final String TAG = MainActivity.class.getSimpleName(); 
    private static final int LOADER_ID = 0; 

    private CustomCursorAdapter customCursorAdapter; 
    RecyclerView recyclerView; 
    private AddTaskActivity addTaskActivity; 
    private Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     recyclerView = (RecyclerView) findViewById(R.id.recyclerViewTasks); 

     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

     customCursorAdapter = new CustomCursorAdapter(this); 
     recyclerView.setAdapter(customCursorAdapter); 

     recyclerView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(addTaskActivity, view + " is clicked", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { 
      @Override 
      public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
       return false; 
      } 

      @Override 
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
       int id = (int) viewHolder.itemView.getTag(); 

       String itemId = Integer.toString(id); 
       Uri uri = TaskContract.TaskEntry.CONTENT_URI; 
       uri = uri.buildUpon().appendPath(itemId).build(); 

       getContentResolver().delete(uri, null, null); 

       getSupportLoaderManager().restartLoader(LOADER_ID, null, MainActivity.this); 

      } 
     }).attachToRecyclerView(recyclerView); 


     FloatingActionButton floatingActionButton = (FloatingActionButton) findViewById(R.id.fab_btn); 

     floatingActionButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent addTaskIntent = new Intent(MainActivity.this, AddTaskActivity.class); 
       startActivity(addTaskIntent); 
      } 
     }); 

     getSupportLoaderManager().initLoader(LOADER_ID, null, this); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     getSupportLoaderManager().restartLoader(LOADER_ID, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, final Bundle loaderArgs) { 

     return new AsyncTaskLoader<Cursor>(this) { 

      Cursor cursor = null; 

      @Override 
      protected void onStartLoading() { 
       if (cursor != null) { 
        deliverResult(cursor); 
       } else { 
        forceLoad(); 
       } 
      } 
      @Override 
      public Cursor loadInBackground() { 

       try { 
        return getContentResolver().query(TaskContract.TaskEntry.CONTENT_URI, 
          null, 
          null, 
          null, 
          TaskContract.TaskEntry.COLUMN_PRIORITY); 

       } catch (Exception e) { 
        Log.e(TAG, "Failed to load data."); 
        e.printStackTrace(); 
        return null; 
       } 
      } 

      public void deliverResult(Cursor data) { 
       cursor = data; 
       super.deliverResult(data); 
      } 
     }; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     customCursorAdapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
      customCursorAdapter.swapCursor(null); 
     } 

} 

這是我的自定義適配器:

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; 
    } 

    public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     TextView taskDescriptionView; 
     TextView priorityView; 

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

      taskDescriptionView = (TextView) itemView.findViewById(R.id.taskDescription); 
      priorityView = (TextView) itemView.findViewById(R.id.priorityTextView); 

      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      int position = getLayoutPosition(); 

     } 
    } 
} 

編輯試過這種實現,但我不能從另一個調用活性的方法:

public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     TextView taskDescriptionView; 
     TextView priorityView; 

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

      taskDescriptionView = (TextView) itemView.findViewById(R.id.taskDescription); 
      priorityView = (TextView) itemView.findViewById(R.id.priorityTextView); 

      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      int position = getLayoutPosition(); 
      addTaskActivity.onClickAddTask(view); 

     } 
    } 
+1

代碼這已經一再要求實現它。當你研究如何做時,你看到了什麼? –

+0

一種簡單的方法是編寫onClick例如'android:onClick =「myOnClick」'在相應視圖的XMl中,然後在調用RecyclerView的活動中使用'public void myOnClick(View view){....}'編寫方法。 – MikeT

+0

@ cricket_007基本上與我的代碼並沒有緊密結合的實現,因爲我遵循規範和框架代碼進行工作。 –

回答

1

您可以使用下面

public 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); 

       itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(v.getContext(),"Clicked " + v.getId(),Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      } 


     } 
0

你把的onClick( )在錯誤的地方。

public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

      TextView taskDescriptionView; 
      TextView priorityView; 

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

       taskDescriptionView = (TextView) itemView.findViewById(R.id.taskDescription); 
       priorityView = (TextView) itemView.findViewById(R.id.priorityTextView); 

       itemView.setOnClickListener(this); 
      } 

      @Override 
      public void onClick(View view) { 
       int position = getLayoutPosition(); 
    /* your onclick method here */ 
        Log.d(TAG, "Element " + position + " clicked."); 


      } 
     } 
+0

我試過了。它不起作用。 –

相關問題