본문 바로가기

Android/Java

다양한 recyclerView 활용법

반응형

제목 그대로 recyclerView에 체크박스를 놔두고


선택한 개수를 제한하는 방법, 제한 없는 방법, 한개만 선택 가능한 recyclerView를 구현해볼 예정입니다.


코드만 보실 분은


https://github.com/JC-Choo/JC_Android/tree/master/Test_folder


참고하세요!


우선, MainActivity 에서 자신이 활용해볼 adater를 선택합니다.






1. MainActivity


tag = "multiple";

List<Item> list = getList();
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

switch (tag) {
case "Single":
adapterSingle = new SingleSelectionAdapter(this, list);
mRecyclerView.setAdapter(adapterSingle);
break;
case "max":
adapterMultiMax = new MultiMaxSelectionAdapter(this, list);
mRecyclerView.setAdapter(adapterMultiMax);
break;
case "multiple":
adapterMulti = new MultiSelectionAdapter(this, list);
mRecyclerView.setAdapter(adapterMulti);
break;
}



tag라는 String에 원하는 adatper를 넣어서 선택하도록 합니다.(저는 MainActivity에서 다 진행했으니까요...)



그 후에


@OnClick(R.id.selected)
public void selectedClick() {
if (tag.equalsIgnoreCase("Single")) {
if (adapterSingle.selectedPosition() != -1) {
Item itemModel = adapterSingle.getSelectedItem();
String cityName = itemModel.getName();
showToast("Selected City is: " + cityName);
} else {
showToast("Please select any city");
}
} else if (tag.equalsIgnoreCase("max")) {
List list = adapterMultiMax.getSelectedItem();
if (list.size() > 0) {
StringBuilder sb = new StringBuilder();
for (int index = 0; index < list.size(); index++) {
Item model = (Item) list.get(index);
sb.append(model.getName()).append("\n");
}
showToast(sb.toString());
} else {
showToast("Please select any city");
}
} else if (tag.equalsIgnoreCase("multiple")) {
List list = adapterMulti.getSelectedItem();
if (list.size() > 0) {
StringBuilder sb = new StringBuilder();
for (int index = 0; index < list.size(); index++) {
Item model = (Item) list.get(index);
sb.append(model.getName()).append("\n");
}
showToast(sb.toString());
} else {
showToast("Please select any city");
}
}
}


이렇게 버튼 click 시 선택한 값들을 표현하도록 진행합니다.


이러면 main은 끝!









이제 adapter를 진행해보겠습니다.


2. Adapter


3개의 adapter 중에서 다중 선택하는 adapter 만 진행하겠습니다.


private void initializeViews(final Item model, final MultiSelectionVIewHolder holder, int position) {
holder.name.setText(model.getName());
holder.checkBox.setChecked(model.isSelected());
holder.checkBox.setTag(position);
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CheckBox cb = (CheckBox) view;
int clickedPos = (Integer) cb.getTag();
itemModels.get(clickedPos).setSelected(cb.isChecked());
notifyDataSetChanged();
}
});
}

나머진 일반적인 어댑터와 같고, 필요한 데이터를 가져와 private로 함수를 만들어서 진행합니다.


itemModels라는 List의 값을 가져와 setSelected해줍니다. 다시 말해서, CheckBox에 클릭된 tag의 position값을 가져와 List에서 해당 position의 boolean 값을 true로 해주는 식입니다.


잘 생각해보시면 답이 나타납다.


그리고 모든 부분에 있는


public List<Item> getSelectedItem() {
List<Item> itemModelList = new ArrayList<>();

for (int i = 0; i < itemModels.size(); i++) {
Item itemModel = itemModels.get(i);
if (itemModel.isSelected()) {
itemModelList.add(itemModel);
}
}
return itemModelList;
}



요놈은 단순히 정보를 return 해주는 method 입니다. 참고하세요!ㅎㅎ








마지막으로


3. ViewHolder


말 그대로 View에 대한 것들을 모아놨습니다.


@BindView(R.id.name)
public TextView name;
@BindView(R.id.checkbox)
public CheckBox checkBox;



저는 다른 package에 있으므로, public 을 써줬지만, 같은 곳에 있으면 따로 필요 없습니다.


public, private, protect의 차이점을 알면 됩니다!ㅎㅎ


저렇게 선언해주면 끝!


이제 메인에서 가져다가 쓰기만 하면 됩니다.!!! 고생하셨습니다.











-------------------------------------------------------------------이상입니다.


1. recyclerView multi selection


2. recyclerView multi selection max


3. recyclerView single selection




이 세가지를


https://github.com/JC-Choo/JC_Android/tree/master/Test_folder


여기에 있으니 참고하세요~~!! 끝

반응형