2017-09-21 1 views
1

私は大きなアイテムのリストを持つRecyclerViewを持っています。このRecyclerViewには、無限スクロールのためのOnScrollListenerがあります。 RecyclerViewで表示されていないときに、Hilighted/Selectedアイテムの色が変わります

  • 項目が選択された場合、私は、特定の色で強調表示し
  • 場合非選択色の変化白/正常に。

私が直面している問題は、上下にスクロールしていくつかの項目を選択すると、すでに選択されている項目の色が白に変わります。

モデルクラスでブール変数(isSelected)を追加して、選択した項目を強調表示しようとしましたが、以前と同じ問題に直面しています。現在、recyclerViewでは、ビューから1つの項目だけを選択できます。いくつかの調査の後、コンセプトの一部はthisの記事から取得しました。複数の項目を選択できるようにするには、このコードをどのように変更/調整するのだろうか。

私は非常に巨大で秘密ですが、このシナリオの一般的な修正がある場合、それは何ですか?

背景:このアプリケーションはチャットアプリであり、送受信されたテキストを表示しています。ユーザーは、いくつかの特定のテキストを選択できる必要があり、他の人とそれを共有できるはずです。

編集:私は私のonBindViewHolderでコードを入れています:要件は、単一の項目を選択することだったとき

@Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 

     final PostDataColumns mPostDataColumns = data.get(position); 

     holder.textCardView.setBackgroundColor(mPostDataColumns.isSelected() ? getResources().getColor(R.color.long_press): 
       getResources().getColor(android.R.color.white)); 

    holder.textCardView.setOnLongClickListener(new View.OnLongClickListener() { 

       @Override 
       public boolean onLongClick(View v) { 

        mPostDataColumns.setSelected(!mPostDataColumns.isSelected()); 

        if(mPostDataColumns.isSelected()) { 

         holder.textCardView.setBackgroundResource(R.color.long_press); 
         multipleSelectedPositions.add(holder.getLayoutPosition()); 

        } else if(!mPostDataColumns.isSelected()) { 
         holder.textCardView.setBackgroundResource(android.R.color.white); 
         multipleSelectedPositions.remove(holder.getAdapterPosition()); 
        } 

        //Adapter.this.onLongClick(holder, position); 

        return true; 
       } 
      }); 
      holder.textCardView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        holder.textCardView.setBackgroundResource(android.R.color.white); 

        /* clearLongSelection(holder, position, alignParentRight, 
          data.get(position).getReceiverUserId().length() > 5); */ 
       } 
      }); 
} 

私はonclickのとonLongClickにコメントしているコードを使用しました。インスタンスはselectedPosition = -1 variable-として

public boolean clearLongSelection(ViewHolder holder, int position) { 
     if (selectedPosition >= 0) { 
      if (selectedPosition == position) { 
       holder.parentLayout.setBackgroundResource(android.R.color.transparent); 
       if (alignParentRight) { 
        holder.mediaCardView.setBackgroundResource(android.R.color.white); 
        holder.assessmentCardView.setBackgroundResource(android.R.color.white); 
        holder.surveyCardView.setBackgroundResource(android.R.color.white); 
        holder.documentCardView.setBackgroundResource(android.R.color.white); 
        holder.textCardView.setBackgroundResource(android.R.color.white); 
       } else { 
        holder.mediaCardView.setBackgroundResource(R.color.long_press); 
        holder.assessmentCardView.setBackgroundResource(R.color.long_press); 
        holder.surveyCardView.setBackgroundResource(R.color.long_press); 
        holder.documentCardView.setBackgroundResource(R.color.long_press); 
        holder.textCardView.setBackgroundResource(R.color.long_press); 
       } 
       selectedPosition = -1; 
       invalidateOptionsMenu(); 
       getSupportActionBar().setTitle(intentData.getName()); 
      } 
      return true; 
     } 
     return false; 
    } 

    public void onLongClick(ViewHolder holder, int position) { 
     if (selectedPosition < 0) { 
      holder.parentLayout.setBackgroundResource(R.color.long_press); 
      holder.mediaCardView.setBackgroundResource(R.color.long_press); 
      holder.assessmentCardView.setBackgroundResource(R.color.long_press); 
      holder.surveyCardView.setBackgroundResource(R.color.long_press); 
      holder.documentCardView.setBackgroundResource(R.color.long_press); 
      holder.textCardView.setBackgroundResource(R.color.long_press); 
      selectedPosition = position; 
      invalidateOptionsMenu(); 
      getSupportActionBar().setTitle("1 Selected"); 
     } else { 

     } 

    } 

のonClickとclearLongSelection可変selectedPositionクラスに初期化される:

これらはのonClickとonLOngClickで呼び出された方法です。リサイクル・ビュー・アダプタで選択した項目を追跡する

+0

を好きな位置がすでに選択されているかどうかを確認かonBindViewHolderにあなたのコードを投稿しますか? – Shruti

+0

を確認してください。https://stackoverflow.com/questions/20611123/listview-subobject-clickable-confilct/20612237#20612237クリックするとボタンの色が変わります。同様のメカニズムを背景色としても使用できます – Raghunandan

+0

単一または複数選択? – KeLiuyue

答えて

0

使用SparseBooleanArray

プライベートmemeber変数としてSparseBooleanArrayを初期化し

任意の項目をクリックしながら、としてクリックされたアイテムの位置を保存し、あなたのクリック機能内部次に
private SparseBooleanArray mClickedItems=new SparseBooleanArray(); 

本当。

mClickedItems.put(getAdapterPosition(),true); 
notifyDataSetChanged(); 

は、この

if(mClickedItems.get(position)==true){ 
    //Show selected color 
}else { 
    //show unselected color 
} 
関連する問題