2017-08-01 87 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

我试过了。它不起作用。 –