2017-04-24 74 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; 
     } 
    } 
} 
相关问题