Страницы

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

воскресенье, 8 марта 2020 г.

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

#android #listview #adapter


Здравствуйте. Зашел в тупик при создании адаптера для ListView. Если начинать с начала,
то есть ArrayList, содержащий список объектов Week. Каждый объект Week, в свою очередь,
содержит список объектов Day с 2 полями: header и список объектов Subject. Ну и каждый
Subject, соответственно, тоже имеет список полей.
Вывод данных в ListView должен быть следующим: идет вывод данных из конкретного объекта
Week так, что сначала идет header объекта Day, а после него - данные из каждого Subject
этого Day. При этом данные из Subject и header имею разные Layout'ы.
Это очень трудно описать, поэтому сделал примитивную зарисовку. 



Может кто-нибудь подсказать по этому поводу? Заранее благодарю за ответ.
    


Ответы

Ответ 1



Создаем 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(); } } В итоге получаем такое:

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

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