簡體   English   中英

RecyclerView OnClick事件不起作用

[英]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)

為了進一步閱讀,我建議

https://medium.com/@pranaypatel/butterknife-a-viewbinding-library-for-android-beginner-guide-fd92caf8e505

http://www.vogella.com/tutorials/AndroidButterknife/article.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM