2

I have a expandable recycler view as like this

enter image description here

I want to merged same named header(Such as "Nov 17,2016" ). and add their child at one place. and icon position must be remain same. How to do this?

Here is my json response:

{"Table":

[{"filedate":"Oct 25, 2016","clientid":4},
{"filedate":"Nov 17, 2016","clientid":4},
{"filedate":"Nov 16, 2016","clientid":4}],

"Table1":

[{"filedate":"Oct 25, 2016","file1":"12.txt","category":"Category : Bank Statement"},
{"filedate":"Nov 16, 2016","file1":"Readme.docx","category":"Category : Bank Statement"},
{"filedate":"Nov 17, 2016","file1":"hts-log.txt","category":"Category : Bills"},
{"filedate":"Nov 17, 2016","file1":"cookies.txt","category":"Category : Others",},
{"filedate":"Nov 17, 2016","file1":"readme.txt","category":"Category : Invoice",}]}

Here is my code for getting json response:

  private void prepareListData() {


        // Volley's json array request object
        StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
//                        Log.d(TAG, response.toString());
//                        hidePDialog();


                        JSONObject object = null;
                        try {
                            object = new JSONObject(response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        JSONArray jsonarray = null;
                        JSONArray jsonarray1 = null;
                        try {
                            jsonarray = object.getJSONArray("Table1");
                            jsonarray1 = object.getJSONArray("Table1");

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
//                            JSONArray jsonarray1 = object.getJSONArray("Table2");
                        for (int i = 0; i < jsonarray.length(); i++) {
                            try {

                                JSONObject obj = jsonarray.getJSONObject(i);
//                                    Movie movie = new Movie();
//                                    movie.setFiledate(obj.getString("filedate"));
                                String str = obj.optString("filedate").trim();


                                Log.d("test", str);

                                data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, str));

//                                    Toast.makeText(getApplicationContext(), lth, Toast.LENGTH_LONG).show();

                                    for (int j = 0; j < jsonarray1.length(); j++) {

                                        try {

                                            JSONObject obj1 = jsonarray1.getJSONObject(j);
                                            String str1 = obj1.optString("filedate").trim();
                                            String str2 = obj1.optString("file1").trim();
                                            String str3 = obj1.optString("filename").trim();
                                            String str4 = obj1.optString("category").trim();
                                                Toast.makeText(getApplicationContext(), "server data respone", Toast.LENGTH_LONG).show();
                                                Toast.makeText(getApplicationContext(), "test"+str1, Toast.LENGTH_LONG).show();
                                            if (str == str1) {
                                                data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str4));
                                                data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str2));
                                            }
                                                Toast.makeText(getApplicationContext(), str1, Toast.LENGTH_LONG).show();

                                            //if condition


                                        } catch (JSONException e) {
//                                            Log.e(TAG, "JSON Parsing error: " + e.getMessage());
                                        }

                                    }

                                // adding movie to movies array



                            } catch (JSONException e) {
                                Log.e("gdshfsjkg", "JSON Parsing error: " + e.getMessage());
                            }

                        }                        Log.d("test", String.valueOf(data));




                        // notifying list adapter about data changes
                        // so that it renders the list view with updated data
//                        adapterheader.notifyDataSetChanged();
                        recyclerview.setAdapter(new ExpandableListAdapter(data));
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
//                VolleyLog.d(TAG, "Error: " + error.getMessage());
//                hidePDialog();

            }
        }){
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put(CLIENT, "4");
                return params;
            }
        };
        // Adding request to request queue
        MyApplication.getInstance().addToRequestQueue(stringRequest);
    }

Adapeter class

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int HEADER = 0;
    public static final int CHILD = 1;

    private List<Item> data;

    public ExpandableListAdapter(List<Item> data) {
        this.data = data;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        View view = null;
        Context context = parent.getContext();
        float dp = context.getResources().getDisplayMetrics().density;
        int subItemPaddingLeft = (int) (18 * dp);
        int subItemPaddingTopAndBottom = (int) (5 * dp);
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (type) {
            case HEADER:

                view = inflater.inflate(R.layout.list_header, parent, false);
                ListHeaderViewHolder header = new ListHeaderViewHolder(view);
                return header;
            case CHILD:
                view = inflater.inflate(R.layout.listchild, parent, false);
                ListChildViewHolder child = new ListChildViewHolder(view);
                return child;
        }
        return null;
    }

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Item item = data.get(position);
        switch (item.type) {
            case HEADER:
                final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder;
                itemController.refferalItem = item;
                itemController.header_title.setText(item.text);
                if (item.invisibleChildren == null) {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                } else {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                }
                itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (item.invisibleChildren == null) {
                            item.invisibleChildren = new ArrayList<Item>();
                            int count = 0;
                            int pos = data.indexOf(itemController.refferalItem);
                            while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) {
                                item.invisibleChildren.add(data.remove(pos + 1));
                                count++;
                            }
                            notifyItemRangeRemoved(pos + 1, count);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                        } else {
                            int pos = data.indexOf(itemController.refferalItem);
                            int index = pos + 1;
                            for (Item i : item.invisibleChildren) {
                                data.add(index, i);
                                index++;
                            }
                            notifyItemRangeInserted(pos + 1, index - pos - 1);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                            item.invisibleChildren = null;
                        }
                    }
                });
                break;
            case CHILD:
                boolean showIcon = position > 1 && getItemViewType(position) == CHILD && getItemViewType(position - 2) == HEADER;

                final ListChildViewHolder itemController1 = (ListChildViewHolder) holder;
                itemController1.refferalItem = item;
                itemController1.header_title1.setText(item.text);
                itemController1.btn_expand_toggle1.setVisibility((showIcon) ? View.VISIBLE : View.GONE);
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return data.get(position).type;
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
        public TextView header_title;
        public ImageView btn_expand_toggle;
        public Item refferalItem;

        public ListHeaderViewHolder(View itemView) {
            super(itemView);
            header_title = (TextView) itemView.findViewById(R.id.header_title);
            btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle);
        }
    }
    private static class ListChildViewHolder extends RecyclerView.ViewHolder {
        public TextView header_title1;
        public ImageView btn_expand_toggle1;
        public Item refferalItem;

        public ListChildViewHolder(View itemView) {
            super(itemView);
            header_title1 = (TextView) itemView.findViewById(R.id.header_title1);
            btn_expand_toggle1 = (ImageView) itemView.findViewById(R.id.btn_expand_toggle1);
        }
    }
    public static class Item {
        public int type;
        public String text;
        public List<Item> invisibleChildren;

        public Item() {
        }

        public Item(int type, String text) {
            this.type = type;
            this.text = text;
        }
    }
}
Adi
  • 400
  • 8
  • 25

1 Answers1

1

You can use the library SectionedRecyclerViewAdapter to group your Item objects under the same header.

First create a Section class:

class MySection extends StatelessSection {

    Item item;

    public MySection(Item item) {
        // call constructor with layout resources for this Section header, footer and items 
        super(R.layout.section_header, R.layout.section_item);

        this.item = item;
    }

    @Override
    public int getContentItemsTotal() {
        return item.invisibleChildren.size(); // number of items of this section, TODO: check if invisibleChildren is null and return 0
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        // return a custom instance of ViewHolder for the items of this section
        return new MyItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyItemViewHolder itemHolder = (MyItemViewHolder) holder;

        // bind your view here
        itemHolder.tvItem.setText(item.invisibleChildren.get(position).text);
    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new SimpleHeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;

        // bind your header view here
        headerHolder.tvItem.setText(item.text);
    }
}

Then you set up the RecyclerView with your Sections:

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();

// Add your Sections to the adapter
sectionAdapter.addSection(new MySection(data.get(0));
sectionAdapter.addSection(new MySection(data.get(1)); //TODO: add a for loop and add all Item objects from data list

// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);

To make it expandable, follow the example here.

Gustavo Pagani
  • 6,583
  • 5
  • 40
  • 71