2017-02-23 2 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'으로 설정하면 기본적으로 선택된 첫 번째 요소가됩니다. –