setOnItemClickListener на FirebaseRecyclerAdapter - PullRequest
0 голосов
/ 23 июня 2018

Мой проект использует Firebase Firestore UI для показа коллекций, используя комбо RecyclerView + CardView во фрагменте, я использовал адаптер, предоставленный самой FirestoreUI.

FirestoreRecyclerAdapter

Однако я не могу установить onItemClickListener на каждой карте, которая появляется.

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<Record, recordViewHolder>(options) {
        @Override
        public void onDataChanged() {
            progressBar.setVisibility(View.GONE);

        }

        @Override
        public void onError(@NonNull FirebaseFirestoreException e) {
            Log.e(TAG, "onError: ", e);
        }

        @Override
        protected void onBindViewHolder(@NonNull recordViewHolder holder, int position, @NonNull Record record) {

            holder.date.setText(String.valueOf(record.getFullDate()));
            holder.qty.setText(String.valueOf(record.getQty()));
            holder.rate.setText(String.valueOf(record.getRate()));
            holder.total.setText(String.valueOf(record.getTotal()));
            holder.milkType.setText(String.valueOf(record.getMilkType()));

        }

        @NonNull
        @Override
        public recordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View view = inflater.inflate(R.layout.record_logs_card, parent, false);
            return new recordViewHolder(view, mListener);
        }


    };

Установка onItemClickListener таким образом приводит к огромному беспорядку синтаксической ошибки.

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<Record, recordViewHolder>(options, setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
    });) {
        @Override
        public void onDataChanged() {
            progressBar.setVisibility(View.GONE);

        }

        @Override
        public void onError(@NonNull FirebaseFirestoreException e) {
            Log.e(TAG, "onError: ", e);
        }

        @Override
        protected void onBindViewHolder(@NonNull recordViewHolder holder, int position, @NonNull Record record) {

            holder.date.setText(String.valueOf(record.getFullDate()));
            holder.qty.setText(String.valueOf(record.getQty()));
            holder.rate.setText(String.valueOf(record.getRate()));
            holder.total.setText(String.valueOf(record.getTotal()));
            holder.milkType.setText(String.valueOf(record.getMilkType()));

        }

        @NonNull
        @Override
        public recordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View view = inflater.inflate(R.layout.record_logs_card, parent, false);
            return new recordViewHolder(view, mListener);
        }


    };

Как на самом деле установить onItemClickListener, когда адаптер сам по себе является переменной, а не расширенным классом RecyclerAdapter, и передать позицию, чтобы извлечь точную повернутую карту?

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Создайте интерфейс для обработки кликов с помощью RecyclerViews

для этого сначала создайте класс с именем FirebaseViewHolder

public class FirebaseViewHolder extends RecyclerView.ViewHolder {

    public ImageView mImageView;
    public TextView mPostTitle;
    public TextView mPostDesc;

    public FirebaseViewHolder(View itemView) {
        super(itemView);

        mImageView = (ImageView) itemView.findViewById(R.id.image_recyclerview);
        mPostTitle = (TextView) itemView.findViewById(R.id.tv_title_recyclerview_item);
        mPostDesc = (TextView) itemView.findViewById(R.id.tv_desc_recyclerview_item);

        //listener set on ENTIRE ROW, you may set on individual components within a row.
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mClickListener.onItemClick(v, getAdapterPosition());

            }
        });
        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                mClickListener.onItemLongClick(v, getAdapterPosition());
                return true;
            }
        });

    }
    private FirebaseViewHolder.ClickListener mClickListener;

    //Interface to send callbacks...
    public interface ClickListener{
        public void onItemClick(View view, int position);
        public void onItemLongClick(View view, int position);
    }

    public void setOnClickListener(FirebaseViewHolder.ClickListener clickListener){
        mClickListener = clickListener;
    }
}

а потом просто в вашем onCreateViewHolder

 @NonNull
        @Override
        public recordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            View view = inflater.inflate(R.layout.record_logs_card, parent, false);

 viewHolder.setOnClickListener(new FirebaseViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        Toast.makeText(getActivity(), "Item clicked at " + position, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onItemLongClick(View view, int position) {
                        Toast.makeText(getActivity(), "Item long clicked at " + position, Toast.LENGTH_SHORT).show();
                    }
                });

            return new recordViewHolder(view, mListener);
        }

Обратите внимание, что первый класс просто объявляет представления, по которым вы будете щелкать, поэтому вместо упомянутых мною переменных вы должны сделать это самостоятельно.

0 голосов
/ 23 октября 2018

Я попробовал второй ответ "Gastón Saillén".Но я поставил второй код для viewHolder.setOnClickListener в onBindViewHolder вместо onCreateViewHolder без оператора return.И это хорошо работает

0 голосов
/ 23 июня 2018

Попробуйте в коде onBindViewHolder, указанном ниже,

holder.view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        DatabaseReference dbRef = firebaseRecyclerAdapter.getRef(position);
                        String device = dbRef.getKey();

                        Toast.makeText(getApplicationContext(), device, Toast.LENGTH_SHORT).show();

                    }
                });

Но это Firebase Database UI код. Я думаю, это поможет вам понять, как его использовать.

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