Страницы

Поиск по вопросам

вторник, 28 мая 2019 г.

Создание адаптера для ListView

Здравствуйте. Зашел в тупик при создании адаптера для 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 mSubjects;
public Day(String header, ArrayList subjects) { mHeader = header; mSubjects = new ArrayList<>(subjects); }
public String getHeader() { return mHeader; }
public void setHeader(String header) { mHeader = header; }
public ArrayList getSubjects() { return mSubjects; }
public void setSubjects(ArrayList subjects) { mSubjects = new ArrayList<>(subjects); } }
Week
public class Week { private ArrayList mDays;
public Week(ArrayList days) { mDays = new ArrayList<>(days); }
public ArrayList getDays() { return mDays; }
public void setDays(ArrayList days) { mDays = new ArrayList<>(days); } }
Создаем адаптер для ListView
public class CustomAdapter extends BaseAdapter {
private static final int TYPE_CONTENT = 0; private static final int TYPE_HEADER = 1;
private ArrayList mData;
private LayoutInflater mInflater;
public CustomAdapter(Context context, ArrayList data) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mData = new ArrayList<>(data); }
@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 mWeeks;
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 days = new ArrayList<>();
for(int i=0; i<5; i++) { ArrayList subjects = new ArrayList<>(); for(int j=0; j<4; j++) { subjects.add(new Subject("Header #" + i + ", subject #" + j + ", field #0", "Header #" + i + ", subject #" + j + ", field #1", "Header #" + i + ", subject #" + j + ", field #2")); } days.add(new Day("Header #" + i, subjects)); }
mWeeks = new ArrayList<>(); mWeeks.add(new Week(days));
mCustomAdapter = new CustomAdapter(this, mWeeks.get(0).getDays());
mListView.setAdapter(mCustomAdapter); mCustomAdapter.notifyDataSetChanged(); } }
В итоге получаем такое:

Комментариев нет:

Отправить комментарий