2017-04-24 76 views
0

我有一個RecyclerView,我有9個項目裏面,當我點擊一個項目它應該被選中,但是當我選擇另一個項目它應該被選中,另一個項目應該自動取消選擇。RecyclerView適配器的項目點擊不工作根據需要

我在做什麼錯,任何幫助是明顯的謝謝。

這裏是我的適配器的代碼

class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.DataViewHolder> { 

    private final int mItemCount; 
    List<ServicesMenuModel> mServiceList; 
    SparseBooleanArray mArray = new SparseBooleanArray(); 
    int pos; 

    ItemAdapter(int itemCount, List<ServicesMenuModel> mServiceList) { 
     mItemCount = itemCount; 
     this.mServiceList = mServiceList; 
    } 

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

    public void changeAt(int position, DataViewHolder holder) { 
     mArray.delete(position); 
     notifyItemChanged(position); 
     holder.mServiceText.setSelected(false); 
    } 

    @Override 
    public void onBindViewHolder(final DataViewHolder holder, int position) { 
     holder.mServiceText.setText(mServiceList.get(position).getMenuText()); 

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

       holder.mServiceText.setSelected(mArray.get(holder.getAdapterPosition(), false)); 
       pos = holder.getAdapterPosition(); 

       //When same item is clicked 
       if (mArray.get(holder.getAdapterPosition(), false)) { 
        mArray.delete(pos); 
        holder.mServiceText.setSelected(false); 
       } else 
       //When new item is selected 
       { 

        for (int i = 0; i < mServiceList.size(); i++) { 
         changeAt(i, holder);//checking to remove other items 
        } 
        mArray.put(holder.getAdapterPosition(), true); 
        holder.mServiceText.setSelected(true); 
       } 

       if (mListener != null) { 
        mListener.onItemClicked(holder.getAdapterPosition()); 
        dismiss(); 
       } 
      } 
     }); 
    } 

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

    class DataViewHolder extends RecyclerView.ViewHolder { 
     TextView mServiceText; 

     DataViewHolder(View v) { 
      super(v); 
      mServiceText = (TextView) v.findViewById(R.id.text); 
     } 
    } 
} 
+0

這是BottomSheetDialogFragment監聽器,我們可以忽略它 –

回答

1

我推測您的要求是一次選擇一個項目。我會推薦以下方法,而不是保留一個布爾數組。

聲明一個變量來保存適配器類中的最後選定項目的索引。

int mLastSelectedIndex = -1; 

ViewHolder裏面定義了像這樣的onClick方法。

void setUpOnClick(final int position) {  
    boolean selection = position == mLastSelectedPosition; 
    mServiceText.setSelected(selection); 

    mServiceText.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int tempOldIndex = mLastSelectedPosition; 
      mLastSelectedPosition = position; 

      if (tempOldIndex >= 0) { 
       notifyItemChanged(tempOldIndex); 
      } 
      notifyItemChanged(position); 

      // your regular code 
     } 
    } 
} 

最後,內部稱之爲onBindViewHolder

@Override 
public void onBindViewHolder(final DataViewHolder holder, int position { 
    holder.setUpOnClick(position); 

    // your regular code 
} 
+0

對於單個項目的選擇是工作,但如果我點擊同一項目做什麼,我需要讓視圖不見了 –

+0

@RakshitNawani可能你可以嘗試這樣。 boolean selection = position == mLastSelectedPosition; boolean isSelected = mServiceText.isSelected(); mServiceText.setSelected(selection &&!isSelected); –

1

這當然是一個錯誤的方式做到這一點:

holder.mServiceText.setSelected(false); 

因爲這ViewHolder被重用爲您RecyclerView過的另一個項目,這將使其他項目RecyclerView要在您來回滾動時選擇。

取而代之,在ViewHolder中聲明一個字段,例如, boolean isSelected和變異的那場:

holder.isSelected = true; 

然後在onBindViewHolder()表明取決於布爾內容:

if (holder.isSelected) { 
    // display selected content 
} else { 
    // display unselected content 
} 
0

我沒有測試,但它會工作。主鍵是使用列表實例。

希望它有幫助。另外如果您的監聽器進行了一些UI更改,我會將notify_function函數放到您的適配器正在使用的地方。

package net.deali.ssmarket.view; 

import android.support.v7.widget.RecyclerView; 
import android.util.SparseBooleanArray; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import net.deali.ssmarket.R; 

import java.util.List; 

import static android.media.CamcorderProfile.get; 

/** 
* Created by soochun on 2017-04-24. 
*/ 

class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.DataViewHolder> { 

    List<ServicesMenuModel> mServiceList; 

    ItemAdapter(int itemCount, List<ServicesMenuModel> mServiceList) { 
     this.mServiceList = mServiceList; 
    } 

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

    public void changeAt(int position, DataViewHolder holder) { 
     notifyItemChanged(position); 
     holder.mServiceText.setSelected(false); 
    } 

    @Override 
    public void onBindViewHolder(final DataViewHolder holder, final int position) { 
     final ServicesMenuModel item = mServiceList.get(position); 
     holder.mServiceText.setText(item.getMenuText()); 
     holder.mServiceText.setSelected(item.isSelected()); 
     holder.mServiceText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean setValue = !item.isSelected(); 
       item.setSelected(setValue); 
       notifyItemChanged(position, item); 

       //if even one item is selected, should make other items make unselected. 
       if (setValue) { 
        int i = 0; 
        for (ServicesMenuModel servicesMenuModel : mServiceList) { 
         if (i != position) { 
          servicesMenuModel.setSelected(false); 
         } 
         i++; 
        } 
        notifyDataSetChanged(); //if recyclerView move top postion try to use notifyItemRangeChanged(0, mServiceList.size()); 
       } 

       if (mListener != null) { 
        mListener.onItemClicked(position); 
        dismiss(); 
       } 
      } 
     }); 
    } 

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

    class DataViewHolder extends RecyclerView.ViewHolder { 
     TextView mServiceText; 

     DataViewHolder(View v) { 
      super(v); 
      mServiceText = (TextView) v.findViewById(R.id.text); 
     } 
    } 

    class ServicesMenuModel { 
     String menuText; 
     boolean isSelected; 

     public String getMenuText() { 
      return menuText; 
     } 

     public void setMenuText(String menuText) { 
      this.menuText = menuText; 
     } 

     public boolean isSelected() { 
      return isSelected; 
     } 

     public void setSelected(boolean selected) { 
      isSelected = selected; 
     } 
    } 
} 
相關問題