Sticky Header RecyclerView with Multiple ArrayLists

I use a sticky header with RecyclerView . I have three sections (i.e. 3 sticky headers) and they work fine. Now I took three arraylists inside each section, I initialized this list in my adapter, and I'm trying to get the data of these lists based on the identifier of the header inside onBindViewHolder . But he does not give me a complete list, only one line from each list (i.e., in the first section - data on the first position of mylist, in the second section - data on the second position mylist1 --- in the third section - - data on the third position mylist2)

Please, help!!

Code in context:

StickyTestAdapter

 public class StickyTestAdapter extends RecyclerView.Adapter<StickyTestAdapter.ViewHolder> implements StickyHeaderAdapter<StickyTestAdapter.HeaderHolder> { private Context mContext; private ArrayList<String> mylist; private ArrayList<String> mylist1; private ArrayList<String> mylist2; private static int countposition; private String HEADER_FIRIST="HEADER_FIRIST"; private String HEADER_SECOND="HEADER_SECOND"; private String HEADER_THIRD="HEADER_THIRD"; public StickyTestAdapter(Context context) { prepareData(); prepareData1(); prepareData2(); this.mContext=context; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { final View view = LayoutInflater.from(mContext).inflate(R.layout.item_test, viewGroup, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { long rowType= getHeaderId(position); Log.e("getHeaderId----",""+rowType); if (rowType==0){ if(!mylist.equals("")) { Log.e("list_data----", "" + mylist.get(position)); viewHolder.item.setText(mylist.get(position)); } else { Log.e("Error--0--", "" + "error"); } } else if (rowType==1){ if(!mylist1.equals("")) { Log.e("list_data1----", "" + mylist1.get(position)); viewHolder.item.setText(mylist1.get(position)); } else { Log.e("Error---1-", "" + "error"); } } else if (rowType==2){ if(!mylist2.equals("")) { Log.e("list_data2----", "" + mylist2.get(position)); viewHolder.item.setText(mylist2.get(position)); } else { Log.e("Error----2", "" + "error"); } } } @Override public int getItemCount() { if (getHeaderId(countposition)==0){ Log.e("mylist",""+mylist.size()); return mylist.size(); }else if (getHeaderId(countposition)==1){ Log.e("mylist1",""+mylist1.size()); return mylist1.size(); }else if (getHeaderId(countposition)==2){ Log.e("mylist2",""+mylist2.size()); return mylist2.size(); } return 0; } @Override public long getHeaderId(int pos) { return pos; } @Override public HeaderHolder onCreateHeaderViewHolder(ViewGroup parent) { final View view = LayoutInflater.from(mContext).inflate(R.layout.header_test, parent, false); return new HeaderHolder(view); } @Override public void onBindHeaderViewHolder(HeaderHolder viewholder, int count) { countposition=count; if (getItemViewType(count)==0){ viewholder.headertext.setText(HEADER_FIRIST); }else if (getItemViewType(count)==1){ viewholder.headertext.setText(HEADER_SECOND); }else if (getItemViewType(count)==2){ viewholder.headertext.setText(HEADER_THIRD); } } static class ViewHolder extends RecyclerView.ViewHolder { public TextView item; public ViewHolder(View itemView) { super(itemView); item = (TextView)itemView.findViewById(R.id.text_item); } } static class HeaderHolder extends RecyclerView.ViewHolder { public TextView headertext; public HeaderHolder(View itemView) { super(itemView); headertext = (TextView)itemView.findViewById(R.id.header_text); } } @Override public int getItemViewType(int position) { return position; } public void prepareData() { mylist=new ArrayList<>(); mylist.add("rajendra"); mylist.add("rani"); mylist.add("rahul"); } public void prepareData1() { mylist1=new ArrayList<>(); mylist1.add("ravi"); mylist1.add("vikram"); mylist1.add("rakesh"); } public void prepareData2() { mylist2=new ArrayList<>(); mylist2.add("apple"); mylist2.add("ashok"); mylist2.add("vikash"); } } 
+7
android
source share
3 answers
The question is pretty old. But this code looks complicated to read, personally I try not to invent what others did when creating libraries. GitHub is a complete source that you can import. Some examples: FlexibleAdapter , FastAdapter , Epoxy and others.

I built the first, but you can try others. With mine, having several views and headings with sections is pretty simple, I point here to the wiki page where I define the section and how to initialize it.

Along with this feature, you have many more features that make your life easier.

+4
source share

I divide the arraylist into 3 sections based on the alphabet, like a contact list.

For this I use SectionedRecyclerViewAdapter

MainActivity.java

 public class MainActivity extends AppCompactActivity { private SectionedRecyclerViewAdapter sectionAdapter; @Override public View onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); sectionAdapter = new SectionedRecyclerViewAdapter(); for(char alphabet = 'a'; alphabet <= 'z';alphabet++) { List<String> contacts = getContactsWithLetter(alphabet); if (contacts.size() > 0) { sectionAdapter.addSection(new ContactsSection(String.valueOf(alphabet), contacts)); } } RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(sectionAdapter); return view; } @Override public void onResume() { super.onResume(); if (getActivity() instanceof AppCompatActivity) { AppCompatActivity activity = ((AppCompatActivity) getActivity()); if (activity.getSupportActionBar() != null) activity.getSupportActionBar().setTitle(R.string.nav_example1); } } private List<String> getContactsWithLetter(char letter) { List<String> contacts = new ArrayList<>(); for (String contact : getResources().getStringArray(R.array.names_)) { if (contact.charAt(0) == letter) { contacts.add(contact); } } return contacts; } private class ContactsSection extends StatelessSection { String title; List<String> list; ContactsSection(String title, List<String> list) { super(new SectionParameters.Builder(R.layout.section_ex1_item) .headerResourceId(R.layout.section_ex1_header) .build()); this.title = title; this.list = list; } @Override public int getContentItemsTotal() { return list.size(); } @Override public RecyclerView.ViewHolder getItemViewHolder(View view) { return new ItemViewHolder(view); } @Override public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { final ItemViewHolder itemHolder = (ItemViewHolder) holder; String name = list.get(position); itemHolder.tvItem.setText(name); itemHolder.imgItem.setImageResource(name.hashCode() % 2 == 0 ? R.drawable.ic_face_black_48dp : R.drawable.ic_tag_faces_black_48dp); itemHolder.rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), String.format("Clicked on position #%s of Section %s", sectionAdapter.getPositionInSection(itemHolder.getAdapterPosition()), title), Toast.LENGTH_SHORT).show(); } }); } @Override public RecyclerView.ViewHolder getHeaderViewHolder(View view) { return new HeaderViewHolder(view); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { HeaderViewHolder headerHolder = (HeaderViewHolder) holder; headerHolder.tvTitle.setText(title); } } private class HeaderViewHolder extends RecyclerView.ViewHolder { private final TextView tvTitle; HeaderViewHolder(View view) { super(view); tvTitle = (TextView) view.findViewById(R.id.tvTitle); } } private class ItemViewHolder extends RecyclerView.ViewHolder { private final View rootView; private final ImageView imgItem; private final TextView tvItem; ItemViewHolder(View view) { super(view); rootView = view; imgItem = (ImageView) view.findViewById(R.id.imgItem); tvItem = (TextView) view.findViewById(R.id.tvItem); } } } 

enter image description here

+4
source share

use a structure similar to

  public class MultiArray<T> { List<ItemGroup> lists = new ArrayList<>(); public void addList(String headerText, List<T> list) { lists.add(new ItemGroup(headerText, list)); } public int itemCount() { int count = 0; for (ItemGroup group : lists) { count += group.count(); } return count; } public T getItem(int position) { int count = 0; for (ItemGroup group : lists) { if (count + group.count() >= position) { return group.item(position - count); } count += group.count(); } return null; } public int getGroupIndex(int position) { int count = 0; int groupIndex = 0; for (ItemGroup group : lists) { if (count + group.count() >= position) { return groupIndex; } count += group.count(); groupIndex++; } return -1; } public String getHeaderText(int position){ int count = 0; for (ItemGroup group : lists) { if (count + group.count() >= position) { return group.headerText; } count += group.count(); } return ""; } class ItemGroup { public final String headerText; public final List<T> list; public ItemGroup(String headerText, List<T> list) { this.headerText = headerText; this.list = list; } public int count() { return list.size(); } public T item(int position) { return list.get(position); } } } 

you can optimize it for faster work

+1
source share

All Articles