Hello. There is data in the database of this type:
_id | category | name 1 | cat1 | name2 2 | cat1 | name5 3 | cat3 | name1 4 | cat2 | name4 5 | cat1 | name3 6 | cat3 | name6 7 | cat1 | name9 It is necessary to list this data through RecyclerView in the following form:
cat1 1 | name2 2 | name5 5 | name3 7 | name9 cat2 4 | name4 cat3 3 | name1 6 | name6 In other words, it is necessary to create a kind of header (separator / group) in the list from the category field, and after each header, output the data that corresponds to this header.
My fragment code is:
import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v4.app.Fragment; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; public class Tab1 extends Fragment { private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; DB_Helper databaseHelper; SQLiteDatabase db; Cursor userCursor; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.my_tab1, container, false); databaseHelper = new DB_Helper(getContext()); db = databaseHelper.getReadableDatabase(); userCursor = db.rawQuery("SELECT * FROM `" + DB_Helper.DATABASE_TABLE + "` WHERE `_id` > '0' ORDER BY `category` ASC, `_id` DESC", null); ArrayList<HashMap<String, String>> myData = new ArrayList<>(); HashMap<String, String> mTab1; if (userCursor.moveToFirst()) { do { mTab1 = new HashMap<>(); mTab1.put("id", userCursor.getString(userCursor.getColumnIndex(DB_Helper.ID))); mTab1.put("cate", userCursor.getString(userCursor.getColumnIndex(DB_Helper.CATEGORY))); mTab1.put("name", userCursor.getString(userCursor.getColumnIndex(DB_Helper.NAME))); myData.add(mTab1); } while (userCursor.moveToNext()); } mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view); // если вы уверены, что изменения в контенте не изменят размер лайота, то передаём параметр true - это увеличивает производительность mRecyclerView.setHasFixedSize(true); // используем LinearLayoutManager для отображения как ListView mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); // добавляет горизонтальные полосочки между пунктами mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), LinearLayoutManager.VERTICAL)); // создаём адаптер mAdapter = new RecyclerAdapter(myData); mRecyclerView.setAdapter(mAdapter); return rootView; } } My adapter code is RecyclerView:
import android.content.Intent; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { private ArrayList<HashMap<String, String>> mDataset; public RecyclerAdapter(ArrayList<HashMap<String, String>> dataset) { mDataset = dataset; } @Override public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_tab1_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { HashMap<String, String> fast_parse = mDataset.get(position); String cate_str = fast_parse.get("cate"); String name_str = fast_parse.get("name"); holder.mMyListCateView.setText(cate_str); holder.mMyListNameView.setText(name_str); } @Override public int getItemCount() { return mDataset.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView mMyListCateView, mMyListNameView; private LinearLayout holderLayout; public ViewHolder(View v) { super(v); mMyListCateView = (TextView) v.findViewById(R.id.myMyCate); mMyListNameView = (TextView) v.findViewById(R.id.myMyName); holderLayout = (LinearLayout) v.findViewById(R.id.myLinearLayout); holderLayout.setOnClickListener(this); } @Override public void onClick(View v) { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Intent intent = new Intent(v.getContext(), Squares_Dynamic_Base.class); HashMap<String, String> fast_parse = mDataset.get(position); intent.putExtra("id", fast_parse.get("id")); v.getContext().startActivity(intent); } } } } From the examples, here and here I realized that it is necessary to use getItemViewType and use it to load different Layout for the heading of the items and for the items themselves (this is ideal because the idea of the header will be different from the design of the items in the list). But in many other examples, lists are used in which the data for the headings have been initially added, and my headings should be formed from what is. Please tell the code how to implement the desired.
PS Various decorations and beautiful effects are NOT necessary. I need the most simple and working code.