0

Multi Selectでリサイクルビューを実装しました。シングルクリックとダブルクリックを識別して選択するためにaddOnItemTouchListenerを使用して正常にリサイクルビューを実装しました。しかし、私はより多くのデータを持っているとき、リサイクラビューがビューのリサイクルを開始すると正確に、私の選択は狂ってしまい、differnt possitionを選択します。私はクリック位置を見るためにログアウトしました。これは、プログラミングに私の選択wrong.I'm新を行い、Androidアプリにdevelopment.Can誰もがこれをたくさん取ると、私を助けて、ここに私のコードでくださいRecycler Viewマルチセレクションを実行しているときにView Itemを間違って選択

マイアダプタクラス

あなたは、のonclickリスナーにビュー操作のほとんどを行っているの
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); 

     } 

    } 
} 

マイRecyclerItemClickListenerクラス

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) { 

    } 
} 

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

あなたは私を詳しく説明し、啓発してくださいできないonItemClick –

+0

にonBindViewHolderであなたのロジックを追加する必要があり –

+0

RecyleViewを@MuthukrishnanRajendranしてください常にビューを再利用し、あなたはonItemClickにすべての設定されていますが、新しいオブジェクトをスクロールを開始したときになります既存のオブジェクトを作成または変更して新しいアイテムを完成させます。ですから、あなたはonBindViewHolderのすべての変更を行うべきです。 –

答えて

1

の私の実装、あなたがたとえので、onBindViewをアダプタあなたにそれを移動する必要がありますOnclickリスナーで設定すると、ユーザーがスクロールしたときに変更されます。

私は完全な表示操作を行っていません、私はちょうど私たちがやるべきことのヒントを与えています。

@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

だから、すべてのクリックリスナーのロジックは、バインドビューホルダーの中で作成する必要がありますか?だから、私のaddOnItemTouchListener実装内に何を入れるべきでしょうか –

+0

はい各項目内のビューについては、onBindViewHolder(ex menteeTextView.setOnClickListener)に追加する必要がありますが、完全な項目についてはRecycleViewClickListenerを使用することができます。 –

+0

addOnItemTouchListenerを使用すると、multiselect_listに追加または削除するだけでnotifyDataSetChangeを呼び出すことができます。これはonBindViewHolderのビューを更新します –

2

boolena配列

を追加するには、あなたのArrayListウィットコンストラクタで初期化します。

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

この

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

とトゥーレたりrelativelayoutのcontroleの代わりに、他のcontroleの偽のonclickを設定するなどのbindviewホルダーでチェック。

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

私はそれを試してみましょう –

+0

yahは質問してみてください。 –

関連する問題