Кнопка включения после выбора элемента списка RecyclerView

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

У меня есть действие с RecyclerView и кнопкой, которая сначала отключена. Элементы RV можно выбирать, и я хочу, чтобы кнопка была включена только после выбора элемента. Я попытался установить addOnItemTouchListener в recyclerview, проблема в том, что он также вызывается при прокрутке списка.

Вот мой адаптер:

 public class CLusterListAdapter extends RecyclerView.Adapter<CLusterListAdapter.ClusterListViewHolder> {


private ArrayList<ClusterItem> mListOfClusters;
private OnItemClickListener mListener;
//index
int row_index = -1; //Default no row chosen

public interface OnItemClickListener{
    //delete
    void onDeleteCluster(int position);
    //edit
    void onEditCluster(int position);
    //select
    void onClick(View view, int position);

}

public void setOnItemClickListener(OnItemClickListener listener){mListener = listener;}


    public static class ClusterListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{


        public TextView mClusterName;
        public TextView mClusterMembers;
        public ImageView mDeleteCluster;
        public ImageView mEditCluster;

        //This
        private OnItemClickListener itemClickListener;
        public void setItemClickListener(OnItemClickListener listener){
            this.itemClickListener = listener;
        }

        public ClusterListViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);

            mClusterName = itemView.findViewById(R.id.tv_clusters_name_cluster_list);
            mClusterMembers = itemView.findViewById(R.id.tv_clusters_members_cluster_list);
            mDeleteCluster = itemView.findViewById(R.id.iv_delete_cluster);
            mEditCluster = itemView.findViewById(R.id.iv_edit_cluster);

            mDeleteCluster.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            listener.onDeleteCluster(position);
                        }
                    }
                }
            });

            mEditCluster.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            listener.onEditCluster(position);
                        }
                    }
                }
            });
            //used for highlighting item
            itemView.setOnClickListener(this);

        }
        //This
        @Override
        public void onClick(View v) {
           itemClickListener.onClick(v, getAdapterPosition());
        }
    }

    public CLusterListAdapter(ArrayList<ClusterItem> listOfClusters ){ mListOfClusters = listOfClusters;}


@NonNull
@Override
public ClusterListViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.chose_your_cluster_list_item, viewGroup, false);
    ClusterListViewHolder clusterListViewHolder =  new ClusterListViewHolder(view, mListener);
    return clusterListViewHolder;
}

@Override
public void onBindViewHolder(@NonNull ClusterListViewHolder clusterListViewHolder, int i) {
    ClusterItem currentCluster = mListOfClusters.get(i);

    clusterListViewHolder.mClusterName.setText(currentCluster.getClustersName());
    clusterListViewHolder.mClusterMembers.setText(currentCluster.getClustersMembers());
    clusterListViewHolder.mClusterMembers.setSelected(true);

    clusterListViewHolder.setItemClickListener(new OnItemClickListener() {
        @Override
        public void onDeleteCluster(int position) {
            //nothing here
        }

        @Override
        public void onEditCluster(int position) {
            //nothing here
        }

        @Override
        public void onClick(View view, int position) {
            //Select a certain item
            row_index = position; //Set row index to selected position
            SpTAGs.currentItem = mListOfClusters.get(position); //Set current item is item selection
            notifyDataSetChanged(); //Made effect on RecyclerView's Adapter

            SpTAGs.selectedClusterPosition = position;
        }

    });

    //Set highlight color
    if(row_index == i) {
        clusterListViewHolder.itemView.setBackgroundColor(Color.parseColor("#E64A19"));
    }else {
        clusterListViewHolder.itemView.setBackgroundColor(Color.parseColor("#FFFFFF"));
    }
}

@Override
public int getItemCount() {
    return mListOfClusters.size();
}
  

}

И вот как я применил addOnItemTouch

 clusterRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {
                selectButton.setEnabled(true);
                Log.v("MyTAG", "Touch");

            return false;
        }

        @Override
        public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean b) {

        }
    });
  

Есть идеи, как это получить? Спасибо!

Комментарии:

1. создайте свой собственный интерфейс и используйте его при выборе и отмене выбора списка, а также для обмена данными между вашей активностью и представлением recyclerview.

Ответ №1:

Есть обратный вызов от адаптера к действию. Включите вашу кнопку там.

 public class CLusterListAdapter extends RecyclerView.Adapter<CLusterListAdapter.ClusterListViewHolder> {
         ...

         interface Listener {
              void onItemClick(int position);
         }
}
  

Вызовите это при щелчке элемента

 clusterListViewHolder.setItemClickListener(new OnItemClickListener() {
        @Override
        public void onDeleteCluster(int position) {
            //nothing here
        }

        @Override
        public void onEditCluster(int position) {
            //nothing here
        }

        @Override
        public void onClick(View view, int position) {
            //Select a certain item
            row_index = position; //Set row index to selected position
            SpTAGs.currentItem = mListOfClusters.get(position); //Set current item is item selection
            notifyDataSetChanged(); //Made effect on RecyclerView's Adapter
            listener.onItemClick(position); // notify the listener (activity) of the click

            SpTAGs.selectedClusterPosition = position;
        }

    });
  

В действии:

 clusterRecyclerView.addOnItemTouchListener( ... );
clusterRecyclerView.setListener((int position) -> { 
    // logic to enable button goes here
});
  

Ответ №2:

здесь вам не нужно использовать addOnItemTouchListener. просто создайте метод внутри действия, подобный этому

 public void VisibleButton(){

yourButton.setVisibility(View.VISIBLE);
/**....*/

}
  

и просто вызовите метод

VisibleButton()

из вашего адаптера, откуда вы хотите, чтобы ваша кнопка была видна, точно так же, как это

 ((YourActivityName)your_ACtivity_Context).VisibleButton();