OnClick от RecyclerView не будет работать при щелчке по элементам, только если вы нажмете МЕЖДУ элементами: решено - PullRequest
3 голосов
/ 08 октября 2019

Я изучаю Android и тестирую вещи с помощью RecyclerView. Я хотел добавить OnItemClickListener, я хотел посмотреть, работает ли я, поэтому заставляю тост появляться каждый раз, когда я нажимаю на элементы, но происходит что-то странное, срабатывает только тогда, когда я нажимаю МЕЖДУ карточками Recycler, а не когда я нажимаю элементы. Я искал людей с такой же проблемой, но ничего не нашел.

Это RecyclerAdapter и действие для него.

Адаптер

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;
    }
}

Активность

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());
        }
    }

}

Если кто-то захочет получить полный проект, я оставлю репо здесь: https://github.com/nochuckles/BattleSpiritsCBDB

Любая помощь будет полезна,спасибо!

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Я исправил это! Очевидно, если у вас есть атрибут:

clickable:true

на вашем CardView, это произойдет.

Я не знаю почему, я проверял разные вещи, и когда я это удалил, онначал работать отлично. Я не знаю, почему это происходит, я проведу некоторые исследования, но если у кого-то есть какая-то информация по этому поводу, я был бы очень признателен, спасибо!

0 голосов
/ 08 октября 2019

Это не у вас адаптер для отображения Toast, вы должны использовать свой интерфейс OnItemClickListener, чтобы уведомить вашу деятельность, когда элемент коснулся. Для этого ваша деятельность должна реализовать этот интерфейс и метод onItemClick:

public class CardListActivity extends AppCompatActivity implements OnItemClickListener {
    ....
    void onItemClick(Card card) {
         Toast.makeText(mContext, "epaepa", Toast.LENGTH_SHORT).show();
                Log.d("LogDiaViewHolder","epaepa");
    }
}

Чтобы запустить событие onItemClick в адаптере, вы должны передать адаптеру экземпляр вашего интерфейса

public class CardAdapter extends ListAdapter<Card, CardAdapter.CardHolder> {
    //....
    private OnItemClickListener mListener

    protected CardAdapter(OnItemClickListener listener) {
        super(DIFF_CALLBACK);
        this.mListener = listener;
    }
}

изатем вызвать метод интерфейса, когда элемент нажмите

itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 mListener.onItemClick(v)
            }
        });
0 голосов
/ 08 октября 2019

Установите свои OnClickListeners в BindViewHolder

@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());

        //example
        holder.cardName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

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

            }
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...