[英]RecyclerView OnClick Event Does Not Work
在將onclicklistener設置到recyclerview時遇到了一些麻煩。 我看到有人問過類似的問題,我嘗試了所有可以找到的方法,但沒有結果。 這是我的實現方式:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Question> values;
private Context context;
public class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener{
public TextView txtHeader;
public View layout;
public ViewHolder(View v) {
super(v);
layout = v;
txtHeader = (TextView) v.findViewById(R.id.header);
}
@Override
public void onClick(View view) {
Log.d("Tag:", "Here");
int position = getLayoutPosition();
String question = values.get(position).getQuestion();
String choiceA = values.get(position).getChoiceA();
String choiceB = values.get(position).getChoiceB();
String choiceC = values.get(position).getChoiceC();
Integer questionID = values.get(position).getQuestionID();
Intent intent = new Intent(context,SingleQuestionActivity.class);
intent.putExtra("question", question);
intent.putExtra("choiceA", choiceA);
intent.putExtra("choiceB", choiceB);
intent.putExtra("choiceC", choiceC);
intent.putExtra("questionID", questionID);
QuestionActivity questionActivity =
(QuestionActivity) context;
questionActivity.goToSingleQuestionScreen(intent);
}
}
...
如您所見,我放入一個Log.d來查看它是否涉及onClick方法。 然后在我的QuestionActivity類中設置此適配器,如下所示:
public class QuestionActivity extends AppCompatActivity{
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_question);
initializeComponents();
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setBackgroundColor(Color.YELLOW);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
QuestionRepository questionRepository =
QuestionRepository.getInstance(getApplicationContext());
Intent intent = getIntent();
questions = questionRepository
.getCategorizedQuestions(intent.getIntExtra("category", 1));
mAdapter = new MyAdapter(questions, this);
recyclerView.setAdapter(mAdapter);
...
我在哪里做錯了?
嘗試:
public ViewHolder(View v) {
super(v);
layout = v;
txtHeader = (TextView) v.findViewById(R.id.header);
v.setOnClickListener(this);
}
希望這可以幫助
使用Butterknife可以輕松干凈地完成此操作。
添加到您的gradle文件依賴項並同步項目。
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
現在,更容易設置偵聽器和綁定視圖。 您可以執行以下操作:
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.header)
TextView header;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@OnClick
void onClick(View view) {
Log.d("pos", getAdapterPosition());
Intent intent ...
...
view.getContext().startActivity(intent);
}
}
通過使用@BindView
批注,您不必每次都調用findViewById()
-Butterknife會為您執行此操作。 另外,您不必實現偵聽器-只需添加@OnClick
批注。
另外,也不需要獲取QuestionActivity並從適配器調用它的方法(我假設它正在啟動另一個活動)。 可以從view.getContext()
獲得上下文,因為每個視圖都包含對上下文的引用,然后可以調用例如startActivity(intent)
為了進一步閱讀,我建議
http://www.vogella.com/tutorials/AndroidButterknife/article.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.