[英]RecyclerView list items doesn't respond to events
當我單擊RecyclerView的列表項時,不會觸發OnClick。
我創建了一個包含RecyclerView的片段。 在Adapter類中,我為每個ViewHolder注冊一個OnItemClickListener。
MyDictionaryFragment.java
public class MyDictionaryFragment extends Fragment {
private static final String TAG = "MyDictionaryFragment";
private RecyclerView mWordsList;
private DictionaryAdapter mAdapter;
private static List<CardEntry> cards;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_dictionary, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
setupViewModel();
//Recycler View
mWordsList = view.findViewById(R.id.rv_my_dictionary);
mWordsList.setLayoutManager(new LinearLayoutManager(getContext()));
mWordsList.setHasFixedSize(true);
//
super.onViewCreated(view, savedInstanceState);
}
private void setupViewModel() {
LearnWordsViewModel viewModel = ViewModelProviders.of(this).get(LearnWordsViewModel.class);
viewModel.getCards().observe(this, (cardEntries) -> {
if (cardEntries.isEmpty()) {
Log.d(TAG, "There is no cards retrieved from the DataBase");
return;
}
cards = cardEntries;
mAdapter = new DictionaryAdapter(cards);
mWordsList.setAdapter(mAdapter);
});
}
}
DictionaryAdapter.java
public class DictionaryAdapter extends RecyclerView.Adapter<DictionaryAdapter.CardViewHolder> {
private static final String TAG = "DictionaryAdapter";
private static List<CardEntry> mCards;
public DictionaryAdapter(List<CardEntry> cards) {
mCards = cards;
}
@NonNull
@Override
public CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
int dictItemLayoutId = R.layout.word_listitem;
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(dictItemLayoutId, parent, false);
return new CardViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CardViewHolder holder, int position) {
if(position >= mCards.size()) {
return;
}
holder.word.setText(mCards.get(position).getWord());
}
@Override
public int getItemCount() {
return mCards.size();
}
class CardViewHolder extends RecyclerView.ViewHolder {
private static final String TAG = "CardViewHolder";
TextView word;
CardView cardView;
private CardViewHolder(@NonNull View itemView) {
super(itemView);
cardView = itemView.findViewById(R.id.dict_cardview);
word = itemView.findViewById(R.id.word_listitem);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(itemView.getContext(), "Test", Toast.LENGTH_SHORT).show();
}
});
}
}
}
我希望當我從RecyclerView中單擊一個列表項時,該事件將觸發,但是沒有任何反應。 為什么?
您必須像這樣在onBindViewHolder()
實現按鈕onClick()
方法
public void onBindViewHolder(@NonNull CardViewHolder holder, int position) {
if(position >= mCards.size()) {
return;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(itemView.getContext(), "Test", Toast.LENGTH_SHORT).show();
}
});
holder.word.setText(mCards.get(position).getWord());
}
另外,根據您在帖子中看到的內容,您是否想添加clickListener來查看自身? 因此,您必須將其聲明為CardViewHolder
構造函數,我將為您提供一個按鈕示例:
class CardViewHolder{
Button btn;
private CardViewHolder(View itemView){
...
btn = itemView.findViewById(R.id.btn);
}
然后在onBindViewHolder
您可以將btn稱為viewholder.btn
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.