android - 如何在可扩展的 RecyclerView 中合并相同命名的 header

标签 android expandablelistview expandablelistadapter android-json expandablerecyclerview

我有一个像这样的可扩展回收器 View

enter image description here

我想合并同名标题(例如“2016 年 11 月 17 日”)。并将他们的 child 添加到一个地方。 和图标位置必须保持不变。如何做到这一点?

这是我的 json 响应:

{"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",}]}

这是我获取 json 响应的代码:

  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);
    }

适配类

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;
        }
    }
}

最佳答案

您可以使用图书馆 SectionedRecyclerViewAdapter将您的 Item 对象分组在同一标题下。

首先创建一个Section类:

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);
    }
}

然后您使用您的 Sections 设置 RecyclerView:

// 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);

要使其可扩展,请按照示例 here .

关于android - 如何在可扩展的 RecyclerView 中合并相同命名的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671439/

相关文章:

java - 自定义相机预览问题(拉伸(stretch))

android - 如何在jetpack compose中创建具有静态值的可扩展 ListView

android - 可在 Android 中拖放列表项的 ExpandableListView

java - Android - 如何在 Android 中的 Expandable ListView 的 subview 下添加另一个 View ?

android - 可扩展 ListView 自动刷新?

android - 可扩展 ListView ;添加 itms 会弄乱展开的项目

android - 转换后删除触发的地理围栏

java - 无法访问内部类中的变量而不将其设为 Final

android - 在 AsyncTask 中保持屏幕明亮

android - 如何删除 ExpandableListView 中特定组(行)的箭头