Здравствуйте. Зашел в тупик при создании адаптера для ListView. Если начинать с начала, то есть ArrayList, содержащий список объектов Week. Каждый объект Week, в свою очередь, содержит список объектов Day с 2 полями: header и список объектов Subject. Ну и каждый Subject, соответственно, тоже имеет список полей.
Вывод данных в ListView должен быть следующим: идет вывод данных из конкретного объекта Week так, что сначала идет header объекта Day, а после него - данные из каждого Subject этого Day. При этом данные из Subject и header имею разные Layout'ы.
Это очень трудно описать, поэтому сделал примитивную зарисовку.
Может кто-нибудь подсказать по этому поводу? Заранее благодарю за ответ.
Ответ
Создаем layout-файлы:
activity_main.xml
item_header.xml
item_content.xml
Создаем классы модели данных:
Subject
public class Subject {
private String mFirstField;
private String mSecondField;
private String mThirdField;
public Subject(String firstField, String secondField, String thirdField) {
mFirstField = firstField;
mSecondField = secondField;
mThirdField = thirdField;
}
public String getFirstField() {
return mFirstField;
}
public void setFirstField(String firstField) {
mFirstField = firstField;
}
public String getSecondField() {
return mSecondField;
}
public void setSecondField(String secondField) {
mSecondField = secondField;
}
public String getThirdField() {
return mThirdField;
}
public void setThirdField(String thirdField) {
mThirdField = thirdField;
}
}
Day
public class Day {
private String mHeader;
private ArrayList
public Day(String header, ArrayList
public String getHeader() {
return mHeader;
}
public void setHeader(String header) {
mHeader = header;
}
public ArrayList
public void setSubjects(ArrayList
Week
public class Week {
private ArrayList
public Week(ArrayList
public ArrayList
public void setDays(ArrayList
Создаем адаптер для ListView
public class CustomAdapter extends BaseAdapter {
private static final int TYPE_CONTENT = 0;
private static final int TYPE_HEADER = 1;
private ArrayList
private LayoutInflater mInflater;
public CustomAdapter(Context context, ArrayList
@Override
public int getItemViewType(int position) {
return position % 4 == 0 ? TYPE_HEADER : TYPE_CONTENT;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getCount() {
return mData.size()*4;
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
View v = convertView;
switch (viewType) {
case TYPE_CONTENT:
ContentViewHolder contentViewHolder;
if (v == null) {
v = mInflater.inflate(R.layout.item_content, null);
contentViewHolder = new ContentViewHolder();
contentViewHolder.itemContentFirstSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_first_field_text_view);
contentViewHolder.itemContentSecondSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_second_field_text_view);
contentViewHolder.itemContentThirdSubjectTextView = (TextView) v.findViewById(R.id.item_content_subject_third_field_text_view);
v.setTag(contentViewHolder);
} else {
contentViewHolder = (ContentViewHolder) v.getTag();
}
contentViewHolder.itemContentFirstSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getFirstField());
contentViewHolder.itemContentSecondSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getSecondField());
contentViewHolder.itemContentThirdSubjectTextView.setText(mData.get(position / 4).getSubjects().get(position % 4).getThirdField());
break;
case TYPE_HEADER:
HeaderViewHolder headerViewHolder;
if (v == null) {
v = mInflater.inflate(R.layout.item_header, null);
headerViewHolder = new HeaderViewHolder();
headerViewHolder.itemHeaderTextView = (TextView) v.findViewById(R.id.item_header_text_view);
v.setTag(headerViewHolder);
} else {
headerViewHolder = (HeaderViewHolder) v.getTag();
}
headerViewHolder.itemHeaderTextView.setText(mData.get(position / 4).getHeader());
break;
}
return v;
}
public static class HeaderViewHolder {
public TextView itemHeaderTextView;
}
public static class ContentViewHolder {
public TextView itemContentFirstSubjectTextView;
public TextView itemContentSecondSubjectTextView;
public TextView itemContentThirdSubjectTextView;
}
}
Создаем MainActivity
public class MainActivity extends AppCompatActivity {
private ArrayList
private CustomAdapter mCustomAdapter;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list_view);
ArrayList
for(int i=0; i<5; i++) {
ArrayList
mWeeks = new ArrayList<>();
mWeeks.add(new Week(days));
mCustomAdapter = new CustomAdapter(this, mWeeks.get(0).getDays());
mListView.setAdapter(mCustomAdapter);
mCustomAdapter.notifyDataSetChanged();
}
}
В итоге получаем такое:
Комментариев нет:
Отправить комментарий