0

J'ai implémenté une vue recycleur avec Multi Select en utilisant addOnItemTouchListener pour l'identifier et la sélectionner en utilisant le double-clic. Lorsque j'ai moins de 5 éléments dans la vue recycleur, Tout fonctionne bien mais quand j'ai plus de données, pour être exact quand la vue recycleur commence à recycler la vue, ma sélection devient folle et elle sélectionne différentes possitions.J'ai déconnecté pour voir la position de clic, ceux-ci semblent être bons mais quelque chose ne va pas ce qui rend ma sélection wrong.I'm nouvelle à la programmation et à l'application android development.Can quelqu'un prendre beaucoup à cela et me aider s'il vous plaît, Voici mon codeRecycler View Sélection erronée Visualiser l'objet lors de l'exécution du multi-sélection

ma classe adaptateur

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactHolder> implements SectionIndexer, Filterable { 

    public List<Contact> contactList; 
    List<Contact> filteredUsersList; 
    CustomFilter filter; 
    Context mContext; 
    int itemResource; 
    ArrayList<Contact> selected_usersList = new ArrayList<>(); 
    int pos; 

    private ArrayList<Integer> mSectionPositions; 

    ContactAdapter(Context mContext, int itemResource, List<Contact> contactList, ArrayList<Contact> selectedList) { 
     this.contactList = contactList; 
     this.mContext = mContext; 
     this.itemResource = itemResource; 
     this.selected_usersList = selectedList; 
     this.filteredUsersList = contactList; 
    } 

    @Override 
    public ContactHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(itemResource, parent, false); 
     return new ContactHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(final ContactHolder holder, int position) { 
     pos = position; 
     final Contact contact = contactList.get(pos); 

     holder.colg.setText(contact.getColg()); 
     holder.name.setText(contact.getName()); 
     holder.job.setText(contact.getJob()); 


     if (contact.getImage() != null) 
      holder.img.setImageBitmap(Utility.getPhoto(contact.getImage())); 


    } 

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


    class ContactHolder extends RecyclerView.ViewHolder { 

     private TextView name, colg, job, id, mentee, mentor, participant; 
     private ImageView selected; 
     // private PorterShapeImageView img; 
     private HexagonMaskView img; 
     private RelativeLayout rr_layout; 
     ItemClickListener itemClickListener; 

     ContactHolder(View itemView) { 
      super(itemView); 
      // Set up the UI widgets of the holder 
      // img = (PorterShapeImageView) itemView.findViewById(R.id.contact_image); 
      img = (HexagonMaskView) itemView.findViewById(R.id.contact_image); 
      name = (TextView) itemView.findViewById(R.id.contact_name); 
      colg = (TextView) itemView.findViewById(R.id.contact_colg); 
      job = (TextView) itemView.findViewById(R.id.contact_job); 
      mentee = (TextView) itemView.findViewById(R.id.mentee); 
      mentor = (TextView) itemView.findViewById(R.id.mentor); 
      participant = (TextView) itemView.findViewById(R.id.participant); 
      rr_layout = (RelativeLayout) itemView.findViewById(R.id.rr_layout); 
      selected = (ImageView) itemView.findViewById(R.id.tic_contact_selected); 

     } 

    } 
} 

Mon RecyclerItemClickListener classe

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 

    public interface OnItemClickListener { 
     void onItemClick(View view, int position); 

     void onItemLongClick(View view, int position); 
    } 

    private OnItemClickListener mListener; 
    private GestureDetector mGestureDetector; 

    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
     mListener = listener; 

     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

       if (childView != null && mListener != null) { 
        mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView)); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 

     if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
      mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     } 

     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

Ma mise en œuvre de addOnItemTouchListener

contactsRecyclerViewT.addOnItemTouchListener(new RecyclerItemClickListener(this, contactsRecyclerViewT, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, final int position) { 

      Log.e("tag", "" + position); 

      for (int i = 0; i < multiselect_list.size(); i++) { 
       Log.e("tag", "sss" + multiselect_list.get(i).getName()); 
      } 

      pos = position; 

      contact = contactArrayList.get(position); 

      menteeTextView = (TextView) view.findViewById(R.id.mentee); 
      mentorTextView = (TextView) view.findViewById(R.id.mentor); 
      participantTextView = (TextView) view.findViewById(R.id.participant); 
      rr_layout = (RelativeLayout) view.findViewById(R.id.rr_layout); 
      selected = (ImageView) view.findViewById(R.id.tic_contact_selected); 
      img = (HexagonMaskView) view.findViewById(R.id.contact_image); 
      name = (TextView) view.findViewById(R.id.contact_name); 

      if (isMultiSelect) { 

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

         multi_select(position); 

         if (multiselect_list.contains(contactArrayList.get(position))) { 

          contact.setStatus("0"); 
          Log.e("tag", "setStatus" + contact.getStatus()); 

          Log.e("tag", "position " + position); 

          rr_layout.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.bg_card_selected)); 
          selected.setVisibility(View.VISIBLE); 

          mentorTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
          participantTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
          menteeTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorAccent)); 
          menteeTextView.setVisibility(View.VISIBLE); 
          mentorTextView.setVisibility(View.VISIBLE); 
          participantTextView.setVisibility(View.VISIBLE); 
          menteeTextView.setClickable(true); 
          mentorTextView.setClickable(true); 
          participantTextView.setClickable(true); 

         } else { 
          rr_layout.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.cement)); 
          selected.setVisibility(View.GONE); 

          Log.e("tag", "position " + position); 

          menteeTextView.setVisibility(View.GONE); 
          mentorTextView.setVisibility(View.GONE); 
          participantTextView.setVisibility(View.GONE); 
          menteeTextView.setClickable(false); 
          mentorTextView.setClickable(false); 
          participantTextView.setClickable(false); 
         } 

        } 
       }); 

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

         contact.setStatus("1"); 
         Log.e("tag", "setStatus" + contact.getStatus()); 

         mentorTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorAccent)); 
         menteeTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
         participantTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
        } 
       }); 


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

         contact.setStatus("0"); 
         Log.e("tag", "setStatus" + contact.getStatus()); 

         mentorTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
         participantTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
         menteeTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorAccent)); 
        } 
       }); 


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

         contact.setStatus("2"); 
         Log.e("tag", "setStatus" + contact.getStatus()); 

         mentorTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
         menteeTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
         participantTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorAccent)); 
        } 
       }); 

       name.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Intent intent = new Intent(ContactsActivity.this, OtherProfileActivity.class); 
         intent.putExtra("id", Integer.parseInt(contactArrayList.get(position).getId())); 
         startActivity(intent); 
        } 
       }); 

      } else { 
       Intent intent = new Intent(ContactsActivity.this, OtherProfileActivity.class); 
       intent.putExtra("id", Integer.parseInt(contactArrayList.get(position).getId())); 
       startActivity(intent); 
      } 
      // contactList.get(position).setStatus("1"); 
      // contactList.get(position).setStatus("0"); 

     } 

     @Override 
     public void onItemLongClick(View view, int position) { 

      contact = contactArrayList.get(position); 

      Log.e("tag", "" + position); 

      for (int i = 0; i < multiselect_list.size(); i++) { 
       Log.e("tag", "sss" + multiselect_list.get(i).getName()); 
      } 


      menteeTextView = (TextView) view.findViewById(R.id.mentee); 
      mentorTextView = (TextView) view.findViewById(R.id.mentor); 
      participantTextView = (TextView) view.findViewById(R.id.participant); 
      rr_layout = (RelativeLayout) view.findViewById(R.id.rr_layout); 
      selected = (ImageView) view.findViewById(R.id.tic_contact_selected); 
      img = (HexagonMaskView) view.findViewById(R.id.contact_image); 
      name = (TextView) view.findViewById(R.id.contact_name); 

      if (!isMultiSelect) { 
       multiselect_list = new ArrayList<>(); 
       isMultiSelect = true; 

       if (mActionMode == null) { 
        mActionMode = startActionMode(mActionModeCallback); 
       } 
      } 

      multi_select(position); 

      if (multiselect_list.contains(contactArrayList.get(position))) { 

       rr_layout.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.bg_card_selected)); 
       selected.setVisibility(View.VISIBLE); 

       contact.setStatus("0"); 
       Log.e("tag", "setStatus" + contact.getStatus()); 

       Log.e("tag", "position " + position); 

       mentorTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
       participantTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
       menteeTextView.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorAccent)); 
       menteeTextView.setVisibility(View.VISIBLE); 
       mentorTextView.setVisibility(View.VISIBLE); 
       participantTextView.setVisibility(View.VISIBLE); 
       menteeTextView.setClickable(true); 
       mentorTextView.setClickable(true); 
       participantTextView.setClickable(true); 

      } else { 
       rr_layout.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.cement)); 
       selected.setVisibility(View.GONE); 

       Log.e("tag", "position " + position); 

       menteeTextView.setVisibility(View.GONE); 
       mentorTextView.setVisibility(View.GONE); 
       participantTextView.setVisibility(View.GONE); 
       menteeTextView.setClickable(false); 
       mentorTextView.setClickable(false); 
       participantTextView.setClickable(false); 
      } 

     } 
    })); 

    ArrayList<AlphabetItem> mAlphabetItems = new ArrayList<>(); 
    List<String> strAlphabets = new ArrayList<>(); 
    for (int i = 0; i < contactArrayList.size(); i++) { 
     Contact contact = contactArrayList.get(i); 
     String name = contact.getName(); 
     if (name == null || name.trim().isEmpty()) 
      continue; 
     String word = name.substring(0, 1); 
     if (!strAlphabets.contains(word)) { 
      strAlphabets.add(word); 
      mAlphabetItems.add(new AlphabetItem(i, word, false)); 
     } 
    } 
} 
+1

Vous devez ajouter votre logique onBindViewHolder pas onItemClick –

+0

Pouvez-vous s'il vous plaît élaborer et me éclairer s'il vous plaît @MuthukrishnanRajendran –

+0

RecyleView réutilise toujours la vue, vous définissez tout en onItemClick mais quand vous commencez à faire défiler le nouvel objet créer ou l'objet existant va modifier pour accomplir le nouvel élément. Donc, mieux, vous devriez faire tous les changements sur onBindViewHolder. –

Répondre

1

Vous faites plus de la manipulation de la vue dans auditeur Onclick, vous devez déplacer que vous l'adaptateur onBindView, car même si vous définissez dans l'écouteur Onclick, il va modifier lorsque l'utilisateur défile.

Je ne donne pas la manipulation complète de la vue, je donne juste l'indice comment nous devrions faire.

@Override 
public void onBindViewHolder(final ContactHolder holder, int position) { 
    pos = position; 
    final Contact contact = contactList.get(pos); 

    holder.colg.setText(contact.getColg()); 
    holder.name.setText(contact.getName()); 
    holder.job.setText(contact.getJob()); 


    if (contact.getImage() != null) 
     holder.img.setImageBitmap(Utility.getPhoto(contact.getImage())); 


    if (multiselect_list.contains(contactArrayList.get(position))) { // May be you should check form your fragment or actvity using listeners 
     holder.mentee.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 
     holder.participant.setBackgroundColor(ContextCompat.getColor(ContactsActivity.this, R.color.colorPrimary)); 

     holder.mentee.setVisibility(View.VISIBLE); 
     holder.participant.setVisibility(View.VISIBLE); 
    } else { 

     holder.mentee.setVisibility(View.GONE); 
     holder.participant.setVisibility(View.GONE); 
    } 

} 
+0

donc toute la logique de l'auditeur de clic devrait être écrit dans onBindViewHolder uh?Alors qu'est-ce que b devrait être dans mon implémentation addOnItemTouchListener –

+0

oui Pour les vues à l'intérieur de chaque élément, vous devez ajouter onBindViewHolder (ex menteeTextView.setOnClickListener), mais pour l'élément complet, vous pouvez utiliser votre RecycleViewClickListener. –

+0

À l'intérieur de addOnItemTouchListener vous pouvez simplement ajouter ou supprimer dans la liste multiselect et juste appeler notifyDataSetChange il mettra à jour la vue dans onBindViewHolder –

2

ajouter boolena tableau

dans l'esprit initialize constructeur de votre arraylist.

itemcheck = new boolean[feedItemList.size()]; 

chèque porte-Bindview comme celui-ci

if(itemcheck[position]==true){ 
    holder.row_linearlayout.setBackgroundColor(Color.parseColor("#b7c5ea")); 
     }else { 
      holder.row_linearlayout.setBackgroundColor(0xFFFFFFFF); 
      //holder.row_linearlayout.setBackgroundResource(R.drawable.blurback); 
     } 

et perspectices définir ou faux onclick de votre relativelayout au lieu de tout controle autre controle.

holder.row_linearlayout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        LinearLayout Lout = (LinearLayout) v.findViewById(R.id.selectlinear); 
        if(model.isSelected()){ 
         Lout.setBackgroundColor(0xFFFFFFFF); 
         itemcheck[position]=false; 
         //get all other controle value here 
        }else{ 

         Lout.setBackgroundColor(Color.parseColor("#b7c5ea")); 
         itemcheck[position]=true;  
         //get all other controle value here     
        } 
       } 
      }); 
+0

laissez-moi l'essayer –

+0

yah essayer et demander si une requête. –