我的ViewHolder
實現了View.OnClickListener
,正如this answer中的建議。除此之外,我再次檢查了我的適配器類與官方文檔中的示例類似。爲什麼我的RecyclerView.ViewHolder的onClick方法有時不被調用?
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private View view;
public ViewHolder(View view) {
super(view);
view.setOnClickListener(this);
this.view = view;
}
public View getView() {
return view;
}
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, DetailsActivity.class);
context.startActivity(intent);
}
}
但如果我測試我的應用程序我觀察這個非常奇怪的現象:如果我攻上排在啓動過程中看到,如預期執行onClick
方法。現在我向下滾動,使其他行可見。我點擊某處並沒有任何反應,第二次點擊 - 如果它在同一行上 - 再次運行。如果我滾動回到頂部,則會發生同樣的情況,我必須點擊兩次以獲取我的onClick
方法。
任何想法爲什麼會發生這種情況?
編輯:的完整代碼,現在設置聽者onBindViewHolder
:
public class ComposersAdapter extends RecyclerView.Adapter<ComposersAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder {
private View view;
public ViewHolder(View view) {
super(view);
this.view = view;
}
public View getView() {
return view;
}
}
private final String EXTRA_COMPOSER_ID = "composerId";
private List<Composer> composers;
public ComposersAdapter(List<Composer> composers) {
this.composers = composers;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
View view = holder.getView();
TextView textView = view.findViewById(R.id.textView);
textView.setText(composers.get(position).getTitle());
holder.getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, ComposerActivity.class);
intent.putExtra(EXTRA_COMPOSER_ID, holder.getAdapterPosition());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return composers.size();
}
}
UPDATE:這個問題似乎被連接到RecyclerView駐留在我設置app:layout_scrollFlags="scroll|enterAlways"
活動的工具欄。如果我刪除該問題不存在了。也許這與工具欄捕捉觸摸事件有關?我沒有足夠的經驗來檢查我自己。
爲什麼不在onBindViewHolder中完成它?而不是在這裏有一個點擊監聽器,試試在綁定方法的根視圖上有一個 – Kushan
你是對的,這是更清潔。但問題依然存在。 –
對不起,我剛剛看到了Kushan的評論。 @Elias,請提供適配器的完整代碼,我想你可能會錯誤地持有/分配視圖引用。 – rgv