私は以下の状況に直面しています:私は3種類のビュータイプを持つRecyclerViewを持っています。それぞれにはサブタイトルが含まれ、次にラジオグループ、チェックボックス、またはeditTextが含まれます。問題は、要素の数(edittext、checkbox、radiobuttons)が可変であるため、ビュータイプとして静的テンプレートを作成できないことです。だから、私はこのようなものに到達しようとしています(ラジオボタンの例):RecyclerView - 要素数が不明なリストアイテム
LISTVIEW
------------------
row1
1) choice1
2) choice2
------------------
row2
1) choice1
2) choice2
3) choice3
------------------
row3
1) choice1
-------------------
良いアプローチについてのアイデアはありますか?あなたに時間と助けをありがとう! :)
EDIT:ChaitanyaAtkurisの回答はかなり役に立ちましたが、onBindViewHolder()でClassCastExceptionが発生しました。それは、「InputHolderにTitleHolderをキャストできません」と言いますが、正しいケース(INPUT)を使用するため、ホルダーオブジェクトが実際にTitleHolderである理由を理解できません。ここに私のアダプタのコードが
public class RecAdapter extends RecyclerView.Adapter {
private List<Object> items;
private final int TITLE_VIEW = 0;
private final int RADIO_GROUP = 1;
private final int CHECK_BOX = 2;
private final int INPUT = 3;
public RecAdapter(List<Object> data) {
this.items = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case CHECK_BOX:
View v1 = inflater.inflate(R.layout.child_checkbox, parent, false);
viewHolder = new CheckboxHolder(v1);
break;
case TITLE_VIEW:
View v2 = inflater.inflate(R.layout.child_title, parent, false);
viewHolder = new TitleHolder(v2);
break;
case INPUT:
View v3 = inflater.inflate(R.layout.child_inputfield, parent, false);
viewHolder = new TitleHolder(v3);
break;
}
return viewHolder;
}
@Override
public int getItemViewType(int position) {
ListItem item = (ListItem) items.get(position);
if (item.getviewType()==TITLE_VIEW) {
return TITLE_VIEW;
} else if (item.getviewType()==RADIO_GROUP) {
return RADIO_GROUP;
} else if (item.getviewType()==CHECK_BOX) {
return CHECK_BOX;
} else if (item.getviewType()==INPUT) {
return INPUT;
}
return -1;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case CHECK_BOX:
CheckboxHolder checkboxHolder = (CheckboxHolder) holder;
configureCheckBoxHolder(checkboxHolder, position);
break;
case TITLE_VIEW:
TitleHolder titleHolder = (TitleHolder) holder;
configureTitleHolder(titleHolder, position);
break;
case INPUT:
InputHolder inputHolder = (InputHolder) holder;
configureInputHolder(inputHolder, position);
break;
}
}
private void configureCheckBoxHolder(CheckboxHolder holder,int position) {
CheckBoxElement boxElement = (CheckBoxElement) items.get(position);
if (boxElement != null) {
holder.box.setText(boxElement.getText());
}
}
private void configureInputHolder(InputHolder holder,int position) {
InputField field = (InputField) items.get(position);
if (field != null) {
holder.title.setText(field.getSubtitle());
}
}
private void configureTitleHolder(TitleHolder holder,int position) {
TitlePojo titlePojo = (TitlePojo) items.get(position);
if (titlePojo != null) {
holder.titleText.setText(titlePojo.getTitle());
}
}
@Override
public int getItemCount() {
return items.size();
}
private class InputHolder extends RecyclerView.ViewHolder {
private TextView title;
private EditText inputfield;
public InputHolder(View v1) {
super(v1);
title = (TextView) v1.findViewById(R.id.inputTitleItem);
inputfield = (EditText) v1.findViewById(R.id.fieldItem);
}
}
private class TitleHolder extends RecyclerView.ViewHolder {
private TextView titleText;
public TitleHolder(View v1) {
super(v1);
titleText = (TextView) v1.findViewById(R.id.titleView);
}
}
private class CheckboxHolder extends RecyclerView.ViewHolder {
private CheckBox box;
public CheckboxHolder(View v1) {
super(v1);
box = (CheckBox) v1.findViewById(R.id.checkboxItem);
}
}
private class RadioGroupHolder extends RecyclerView.ViewHolder {
private RadioGroup group;
public RadioGroupHolder(View v1) {
super(v1);
}
}
}
ここでelement1、element2,3とは何ですか? – ChaitanyaAtkuri
はrecyclerViewの行です。私はそれを変更します – Pynnie
あなたが必要とするすべてのtextviews、チェックボックス、ラジオボタンを備えた1つのビューを作成し、その可視性をなくす方法はありますか?必要に応じて、所有者の視認性を視覚的に変更することができます。 – paul590