2016-08-14 18 views
0

我有一個RecyclerView,我只在做onLongPress時選擇我的行,但我想要的是,第一個onLongClick將啓動突出顯示,然後onClick將選擇和取消選擇特定的行,而不是onLongClick。取消選擇最後一個選定的行後,onLongClick應該再次啓動突出顯示。我試着用布爾變量來做。但它不起作用。我感到很困惑。有任何想法嗎?如何在onClicks按下longClick後繼續選擇RecyclerView的行?

這就是我一直想要的。

if(onLongPressReceived) { 
      holder.cardView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if(!onClickAnotherPressReceived) { 
         onClickPressReceived = true; 
         mItems.get(holder.getAdapterPosition()).setmIsChecked(true); 
         notifyDataSetChanged(); 
         onClickAnotherPressReceived = true; 
        } 
       } 
      }); 
      holder.checkboxHolder.setVisibility(View.VISIBLE); 
      holder.mCheckBox.setChecked(mItems.get(position).getmIsChecked()); 
      holder.mDeleteRow.setVisibility(View.VISIBLE); 
      if(mItems.get(holder.getAdapterPosition()).getmIsChecked()){ 
       holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_selected)); 
      }else { 
       //holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_long_pressed)); 
       holder.checkboxHolder.setVisibility(View.INVISIBLE); 
       holder.mDeleteRow.setVisibility(View.INVISIBLE); 
      } 

      if(onClickPressReceived && !onLongAnotherPressReceived) 
      { 
       holder.checkboxHolder.setVisibility(View.VISIBLE); 
       holder.mCheckBox.setChecked(mItems.get(position).getmIsChecked()); 
       holder.mDeleteRow.setVisibility(View.VISIBLE); 
       if(mItems.get(holder.getAdapterPosition()).getmIsChecked()){ 
        holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_selected)); 
       }else { 
        //holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_long_pressed)); 
        holder.checkboxHolder.setVisibility(View.INVISIBLE); 
        holder.mDeleteRow.setVisibility(View.INVISIBLE); 
       } 
      } 
      //Checking whether a particular view is clicked or not 
      if(onClickAnotherPressReceived && !onLongAnotherPressReceived) 
      { 
       holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_long_pressed)); 
       holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_unselected)); 
       holder.mDeleteRow.setVisibility(View.INVISIBLE); 
       if (mItems.get(position).getmIsChecked()) { 
        holder.checkboxHolder.setVisibility(View.VISIBLE); 
        holder.mCheckBox.setChecked(true); 
       } else { 
        holder.checkboxHolder.setVisibility(View.GONE); 
        holder.mCheckBox.setChecked(false); 
       } 
      } 
     } 
      //Checking whether a particular view is clicked or not 
     else{ 
      holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_long_pressed)); 
      holder.cardView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.list_unselected)); 
      holder.mDeleteRow.setVisibility(View.INVISIBLE); 
      if (mItems.get(position).getmIsChecked()) { 
       holder.checkboxHolder.setVisibility(View.VISIBLE); 
       holder.mCheckBox.setChecked(true); 
      } else { 
       holder.checkboxHolder.setVisibility(View.GONE); 
       holder.mCheckBox.setChecked(false); 
      } 
     } 


     //Calls the interface method in Activity to respond to CheckBox changes 
     holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       updateMainClass.updateListBackground(holder.getAdapterPosition(), b); 
      } 
     }); 
     /** 
     * <p>Responds to long press made on any row</p> 
     * <p>Checks the item on which long press is made 
     * sets the onLongPressReceived status to true and notify the adapter to refresh the list.</p> 
     */ 
     holder.cardView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       if(onLongAnotherPressReceived) { 
        onLongPressReceived = true; 
        mItems.get(holder.getAdapterPosition()).setmIsChecked(true); 
        notifyDataSetChanged(); 
        onLongAnotherPressReceived = false; 
       } 
       return true; 
      } 
     }); 
     //Calls the interface in Activity to remove the item from the List. 
     holder.mDeleteRow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       updateMainClass.updateItemList(holder.getAdapterPosition()); 
      } 
     }); 

    } 

回答

0

我經常這樣做:

在你onBindViewHolder通話ViewHolder類的bindView方法:

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { 
     ((ViewHolder) viewHolder).bindView(getItem(position)); 
    } 
在viewHolder類要和你實體實例

然後:

public class ViewHolder extends RecyclerView.ViewHolder { 

     YOUR_OBJECT entity; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      //initialize view here 
     } 

     public void bindView(ChannelEntity entity) { 

      this.entity = entity; // use this entity for longClickListener 
      //setOnClickListener || OnLongClickListener Here 
     } 
    }