2017-02-23 94 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”,它将是默认选择的第一个元素。 –