2017-02-23 92 views
1

如果有人可以幫助我。我有一個RecyclerView項目,但當我嘗試選擇ONE項目,我可以選擇很多項目。我認爲問題出在onClick回調中,但我不確切地知道。這是適配器代碼:Android很多項目選擇RecyclerView

public class HorizontalRecyclerViewAdapter extends RecyclerView 
    .Adapter<HorizontalRecyclerViewAdapter 
    .DataObjectHolder> { 
private ArrayList<HorizontalData> mDataset; 
private static MyClickListener myClickListener; 

private SparseBooleanArray selectedItem = new SparseBooleanArray(); 

public class DataObjectHolder extends RecyclerView.ViewHolder 
     implements View 
     .OnClickListener { 
    TextView mLabel; 
    TextView mDateTime; 
    LinearLayout linearLayout; 

    public DataObjectHolder(View itemView) { 
     super(itemView); 
     mLabel = (TextView) itemView.findViewById(R.id.item_list_view_text_view); 
     mDateTime = (TextView) itemView.findViewById(R.id.item_list_view_text_view_two); 
     linearLayout = (LinearLayout) itemView.findViewById(R.id.myBackground); 

     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (selectedItem.get(getAdapterPosition(), false)) { 
      selectedItem.delete(getAdapterPosition()); 
      v.setSelected(false); 
     } else { 
      selectedItem.put(getAdapterPosition(), true); 
      v.setSelected(true); 
     } 

     myClickListener.onItemClick(getAdapterPosition(), v); 
    } 
} 

public void setOnItemClickListener(MyClickListener myClickListener) { 
    this.myClickListener = myClickListener; 
} 

public HorizontalRecyclerViewAdapter(ArrayList<HorizontalData> myDataset) { 
    mDataset = myDataset; 
} 

@Override 
public DataObjectHolder onCreateViewHolder(ViewGroup parent, 
              int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.date_item, parent, false); 

    DataObjectHolder dataObjectHolder = new DataObjectHolder(view); 
    return dataObjectHolder; 
} 

@Override 
public void onBindViewHolder(DataObjectHolder holder, int position) { 
    holder.linearLayout.setSelected(selectedItem.get(position, false)); 

    holder.mLabel.setText(mDataset.get(position).getmTitle()); 
    holder.mDateTime.setText(mDataset.get(position).getmSubTitle()); 
} 

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

public interface MyClickListener { 
    void onItemClick(int position, View v); 
} 

}

謝謝!

+0

如果您只想選擇一個項目,爲什麼要使用'SparseBooleanArray'? –

+0

那麼我將如何繼續? –

+0

'int currentlySelectedItemPos'。應該夠了。當沒有選擇項目時,'-1'的值將會是。 –

回答

0

首先你不需要SparseBooleanArray,因爲你只需要選擇一個項目。用int selectedItemPos代表當前選定的項目位置就足夠了。

下面是我剛剛創建了一個簡單的適配器,它的工作,與註釋解釋發生了什麼:

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> { 

    private ArrayList<String> items; 
    //field mentioned before 
    private int selectedItemPos = -1; 

    //I create some items to see if my adapter is working. 
    public TestAdapter() { 
     this.items = new ArrayList<>(); 
     for (int i=0; i<20; i++) { 
      items.add("Test" + i); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     String item = items.get(position); 
     holder.mName.setText(item); 
     //This line sets selection state to true if current position is the same as selected one, and false otherwise. 
     holder.itemView.setSelected(selectedItemPos == position); 
    } 

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

    //helper method 
    protected void setSelectedItem(int position) { 
     int oldSelected = selectedItemPos; 
     selectedItemPos = position; 

     // update view of unselected item 
     notifyItemChanged(oldSelected); 

     //update view of just selected item 
     notifyItemChanged(selectedItemPos); 
    } 

    protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView mName; 

     public ViewHolder(View view) { 
      super(view); 
      mName = (TextView) view.findViewById(R.id.taskListItem_name); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      //if the clicked item is already selected, 
      // we will just unselect it and no new item will be selected 
      //(new one is -1, which is none) 
      int newSelectedItem = getAdapterPosition()==selectedItemPos?-1:getAdapterPosition(); 

      //apply changes on adapter 
      setSelectedItem(newSelectedItem); 
     } 
    } 
} 

你應該能夠輕鬆地與你的合併此代碼。

+0

如何在應用程序啓動時選擇**第一項**。 –

+0

要設置默認選定項目,請將'private int selectedItemPos = -1;'的初始值更改爲'-1'。如果將它設置爲「0」,它將是默認選擇的第一個元素。 –