android - RecyclerView 的 onClick 将无法单击项目,仅当您单击 BETWEEN 项目时

标签 android android-recyclerview

我正在学习 Android,并且正在使用 RecyclerView 进行测试。我想添加一个 OnItemClickListener,我想看看是否有效,所以我每次点击项目时都会出现一个 Toast,但发生了一些奇怪的事情,只有当我点击 Recycler 的 BETWEEN 卡片时才会触发,而不是当我点击项目时触发。我一直在寻找有同样问题的人,但没有找到任何东西。

这是 RecyclerAdapter 及其 Activity 。

适配器

public class CardAdapter extends ListAdapter<Card, CardAdapter.CardHolder> {

    private OnItemClickListener listener;
    private Context mContext;
    private Intent myIntent;

    protected CardAdapter() {

        super(DIFF_CALLBACK);
    }

    private static final DiffUtil.ItemCallback<Card> DIFF_CALLBACK = new DiffUtil.ItemCallback<Card>() {
        @Override
        public boolean areItemsTheSame(Card oldItem, Card newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(Card oldItem, Card newItem) {
            return oldItem.getCardImage() == newItem.getCardImage() &&
                    oldItem.getCardName().equals(newItem.getCardName()) &&
                    oldItem.getCardCode().equals(newItem.getCardCode()) &&
                    oldItem.getCardSet().equals(newItem.getCardSet()) &&
                    oldItem.getQuantity() == newItem.getQuantity() &&
                    oldItem.getRarity().equals(newItem.getRarity());

        }
    };

    @NonNull
    @Override
    public CardHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_item, parent, false);
        mContext = parent.getContext();
        return new CardHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull CardHolder holder, int position) {
        Card currentCard = getItem(position);
        Picasso.with(mContext).load(currentCard.getCardImage()).fit().centerInside().into(holder.cardImage);
        holder.cardName.setText(currentCard.getCardName());
        holder.cardCode.setText(currentCard.getCardCode());
        holder.cardSet.setText(currentCard.getCardSet());
        holder.rarity.setText(currentCard.getRarity());


    }


    class CardHolder extends RecyclerView.ViewHolder {

        private ImageView cardImage;
        private TextView cardName;
        private TextView cardCode;
        private TextView cardSet;
        private TextView quantity;
        private TextView rarity;

        public CardHolder(View itemView) {
            super(itemView);
            cardImage = itemView.findViewById(R.id.cardImage);
            cardName = itemView.findViewById(R.id.cardName);
            cardCode = itemView.findViewById(R.id.cardCode);
            cardSet = itemView.findViewById(R.id.cardSet);
            rarity = itemView.findViewById(R.id.cardRarity);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(mContext, "epaepa", Toast.LENGTH_SHORT).show();
                    Log.d("LogDiaViewHolder","epaepa");

                }
            });
        }

        public ImageView getCardImage() {
            return cardImage;
        }

    }

    public interface OnItemClickListener {
        void onItemClick(Card card);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}

Activity

public class CardListActivity extends AppCompatActivity {

    private CardViewModel cardViewModel;
    private View decorView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_card_list);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final CardAdapter adapter = new CardAdapter();
        recyclerView.setAdapter(adapter);

        cardViewModel = ViewModelProviders.of(this).get(CardViewModel.class);
        cardViewModel.getAllCards().observe(this, new Observer<List<Card>>() {
            @Override
            public void onChanged(List<Card> cards) {
                adapter.submitList(cards);
            }
        });

        decorView = getWindow().getDecorView();
        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if (visibility == 0) {
                    decorView.setSystemUiVisibility(hideSystemBars());
                }
            }
        });

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            decorView.setSystemUiVisibility(hideSystemBars());
        }
    }

}

如果有人想要完整的项目,我会在这里留下 repo 协议(protocol):https://github.com/nochuckles/BattleSpiritsCBDB

任何帮助都会很好,谢谢!

最佳答案

我修好了!显然,如果您具有以下属性:

clickable:true

在您的 CardView 上会发生这种情况。

我不知道为什么,我正在测试不同的东西,当我删除它时,它开始完美运行。我不知道为什么会这样,我会做一些研究,但如果有人有这方面的信息,我将不胜感激,谢谢!

关于android - RecyclerView 的 onClick 将无法单击项目,仅当您单击 BETWEEN 项目时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58283200/

相关文章:

android - Android:使用OpenCV对齐图像

android - 在 WebView 中查看 pdf 文件

android - 在 Android 中使用 Firebase 在单个 RecyclerView 中获取两个不同的 View

android - 如何在 recyclerview 项目之间设置相等的边距

android - CustomView 的 ListView 到 RecyclerView 迁移

android - adb 没有看到 android 设备 ubuntu

java - Android NoSuchMethodError : No virtual method invoke in MethodHandle,

android - 同一TextView中字符串的不同字体大小

java - #Askfirebase 在 android 中的 firebase 回收器适配器中获取上一个项目值(POJO)

java - 如何处理回收者 View 中的大量项目? (例如 1000 条评论)