2017-09-14 87 views
2

我決定使用RecyclerView來顯示我的數據列表。每個項目/行中都有一個複選框,2個TextViews和一個ImageView。我創建了適配器來處理所有事情,並將檢查的項目添加到我的最終列表中。RecyclerView檢查錯誤的項目,當我向下滾動

問題是,當我檢查一些項目並向下滾動時,某些項目會顯示爲已選中狀態,並且當我向上滾動時,我以前檢查過的項目顯示爲未選中狀態。圖像和文字瀏覽是可以的,但是當向下滾動時,複選框會出現混亂。

這是我的適配器:

public class TeamAdapter extends RecyclerView.Adapter<TeamAdapter.MyViewHolder> { 

    private Context mContext; 
    private List<UserProject> UserList; 
    private UserProject user; 


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     public TextView name, description; 
     public CircleImageView profile_image; 
     public CheckBox check; 

     public MyViewHolder(View view) { 
      super(view); 
      name = (TextView) view.findViewById(R.id.name); 
      description = (TextView) view.findViewById(R.id.description); 
      profile_image = (CircleImageView) view.findViewById(R.id.profile_image); 
      check = (CheckBox) view.findViewById(R.id.check); 
     } 
     @Override 
     public void onClick(View v) { 
      if (mItemClickListener != null) { 
       mItemClickListener.onItemClickListener(v, getAdapterPosition()); 
      } 
     } 
    } 


    public TeamAdapter(Context mContext, List<UserProject> userList) { 
     this.mContext = mContext; 
     this.UserList = userList; 

    } 
    @Override 
    public TeamAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.adapter_teams, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final TeamAdapter.MyViewHolder holder, final int position) { 

     user = UserList.get(position); 

     holder.name.setText(user.getName()); 
     holder.description.setText(user.getCompany()); 

     if(user.getImageURL() != null && !user.getImageURL().isEmpty()) { 
      Picasso.with(mContext).load(user.getImageURL()).into(holder.profile_image); 
     } 

     holder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if(isChecked){ 
        ActivityTeams.newList.add(UserList.get(position)); 
       }else { 
        ActivityTeams.newList.remove(UserList.get(position)); 
       } 
      } 
     }); 

    } 


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

    private TeamAdapter.onRecyclerViewItemClickListener mItemClickListener; 

    public void setOnItemClickListener(TeamAdapter.onRecyclerViewItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
    } 

    public interface onRecyclerViewItemClickListener { 
     void onItemClickListener(View view, int position); 
    } 
} 
+2

[RecyclerView中的CheckBox繼續檢查不同的項目]的可能重複(https://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items) – TofferJ

+0

它沒有爲我使用這個問題的解決方案。 –

回答

1

如同在重複回答的評論,你的持有人保留複選框視圖。您只需根據您的支持數據更新複選框狀態。

onBindViewHolder分配檢查監聽器之前補充一點:

holder.check.setOnCheckedChangeListener(null);  
holder.check.setChecked(ActivityTeams.newList.contains(UserList.get(position)); 
holder.check.setOnCheckedChangeListener(new ... "you know what to do here" 

基於從這裏https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/CompoundButton.javasetChecked CompoundButton源代碼:

/** 
* <p>Changes the checked state of this button.</p> 
* 
* @param checked true to check the button, false to uncheck it 
*/ 
@Override 
public void setChecked(boolean checked) { 
    if (mChecked != checked) { 
     mCheckedFromResource = false; 
     mChecked = checked; 
     refreshDrawableState(); 
     notifyViewAccessibilityStateChangedIfNeeded(
       AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); 

     // Avoid infinite recursions if setChecked() is called from a listener 
     if (mBroadcasting) { 
      return; 
     } 

     mBroadcasting = true; 
     if (mOnCheckedChangeListener != null) { 
      mOnCheckedChangeListener.onCheckedChanged(this, mChecked); 
     } 
     if (mOnCheckedChangeWidgetListener != null) { 
      mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); 
     } 
     final AutofillManager afm = mContext.getSystemService(AutofillManager.class); 
     if (afm != null) { 
      afm.notifyValueChanged(this); 
     } 

     mBroadcasting = false; 
    } 
} 

,你可以看到調用setChecked也稱目前連接監聽器。

+0

感謝您的回覆。我將這一行添加到適配器,現在它不再隨機檢查,但當我向下滾動並備份時,它會不斷地將項目添加到我的列表中。 –

+0

我的意思是,反覆添加。 –

+0

我希望你在編輯之前忽略了我的評論。要優化聽衆的設置需要更多的工作,請忽略該部分。你沒有執行這個對不對?因爲它被打破了錯誤的代碼。 –

1

您沒有指定CheckBox是否在您的onBindViewHolder()方法中被選中。因此,當視圖被創建/回收時,RecyclerView無法知道CheckBox是否被選中。

您可以嘗試保存單獨ArrayList中每個對應CheckBox的checked/unchecked狀態,或者與您的UserProject類合併並將信息保存在那裏。

之後,您可以簡單地說holder.check.setChecked(...);其中...是CheckBox的條件。

相關問題