簡體   English   中英

使用來自 JSON 響應的數據填充 ExpandableListView

[英]Populate ExpandableListView using data from JSON response

我的可擴展列表視圖有問題。 我見過的所有關於父項的教程都只有一項。 在我的情況下,我在父和子中處理多個字段(名稱和評論)。 我應該如何進行?

我的json數據

[
{
    nome: "Carlos",
    comentario: "Esse dia foi show",
    resp: [ ]
},
{
    nome: "Andre",
    comentario: "Acho que não precisava disso",
    resp: [
    {
        nome: "inutil",
        comentario: "Sempre assim"
    },
    {
        nome: "Roberto",
        comentario: "Se não estivessem fazendo nada errado, não iam querer apagar a mídia."
    },
    {
        nome: "xumbinho",
        comentario: "André ! Para vai!"
    }
    ]
},
{
    nome: "Celso",
    comentario: "É pra acabar mesmo",
    resp: [ ]
}
]

還有我的 CommentariosActivity 代碼

private void makejsonobjreq() {
        PD.show();

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, url+"284901",
                null, response -> {
                    ArrayList<Group> list = new ArrayList<Group>();
                    ArrayList<Child> ch_list;

                    Log.d("response", String.valueOf(response));
                    try {
                        Iterator<String> key = response.keys();
                        while (key.hasNext()) {
                            String k = key.next();
                            Log.d("KEY", String.valueOf(k));

                            Group gru = new Group();
                            gru.setNome(k);
                            ch_list = new ArrayList<Child>();

                            JSONArray ja = response.getJSONArray(k);
                            Log.d("QNT", String.valueOf(ja.length()));

                            for (int i = 0; i < ja.length(); i++) {

                                JSONObject jo = ja.getJSONObject(i);

                                Child ch = new Child();
                                Log.d("COMENTARIO NOME",jo.getString("nome"));
                                ch.setNome(jo.getString("nome"));
                                ch.setComentario(jo.getString("comentario"));

                                ch_list.add(ch);
                            } // for loop end
                            gru.setItems(ch_list);
                            list.add(gru);
                        } // while loop end

                        ExpAdapter = new ExpandListAdapter(ComentariosActivity.this, list);
                        ExpandList.setAdapter(ExpAdapter);

                        PD.dismiss();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                PD.dismiss();
                Log.d("response", String.valueOf(error));
            }
        });
        MyApplication.getInstance().addToRequestQueue(jsonObjReq, "jreq");
    }

適配器

package br.inf.cgn.cgnapp;

import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import com.android.volley.toolbox.ImageLoader;

import br.inf.cgn.cgnapp.model.Child;
import br.inf.cgn.cgnapp.model.Group;

public class ExpandListAdapter extends BaseExpandableListAdapter {

    private Context context;
    private ArrayList<Group> groups;

    ImageLoader imageLoader = MyApplication.getInstance().getImageLoader();

    public ExpandListAdapter(Context context, ArrayList<Group> groups) {
        this.context = context;
        this.groups = groups;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        ArrayList<Child> chList = groups.get(groupPosition).getItems();
        return chList.get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        Child child = (Child) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.comentarios_resp, null);
        }

        if (imageLoader == null)
            imageLoader = MyApplication.getInstance().getImageLoader();

        TextView nome = (TextView) convertView.findViewById(R.id.nome_resp);
        nome.setText(child.getNome().toString());

        TextView comentario = (TextView) convertView.findViewById(R.id.comentario_resp);
        comentario.setText(child.getComentario().toString());

        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        ArrayList<Child> chList = groups.get(groupPosition).getItems();
        return chList.size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return groups.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        Group group = (Group) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater inf = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = inf.inflate(R.layout.comentarios_list, null);
        }
        TextView nome = (TextView) convertView.findViewById(R.id.nome);
        nome.setText(group.getNome());
        TextView comentario = (TextView) convertView.findViewById(R.id.comentario);
        comentario.setText(group.getComentario());

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}

我嘗試了幾種方法來使這段代碼工作,但沒有成功!

我添加了將解析 JSON 響應並填充適配器數據的代碼。 這是一個完整的例子。 但它需要一個帶有名為“list”的 ExpandableListView 的 XML 文件。

我從另一個 stackoverflow 帖子中借用了一個基本的適配器。 它只顯示基本文本,而不是整個對話。 但這可能足以讓您暢通無阻。 但是你需要用你自己的視圖替換簡單的視圖,比如:android.R.layout.simple_list_item_1。

在實際應用中,最好在 ASyncTask 中解析 JSON 數據。

package com.example.elletlar.myapplication;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    List<Group> list = getList();
    ExpAdapter adapter = new ExpAdapter(this, list);
    ExpandableListView listView = findViewById(R.id.lst);
    listView.setAdapter(adapter);
}

public class Group {
    String name;
    private List<Child> childList;

    void setChildList(List<Child> list) {
        childList = list;
    }
    List<Child> getChildList() {
        return childList;
    }
}

public class Child {
    String name;
    String comment;
}

private ArrayList<Group> getList() {
    ArrayList<Group> list = new ArrayList<>();
    JSONArray groupArr;
    try {
        String TEST = "[" +
                "{" +
                "nome: \"Carlos\"," +
                "                comentario: \"Esse dia foi show\"," +
                "            resp: [ ]" +
                "    }," +
                "    {" +
                "        nome: \"Andre\"," +
                "                comentario: \"Acho que não precisava disso\"," +
                "            resp: [" +
                "        {" +
                "            nome: \"inutil\"," +
                "                    comentario: \"Sempre assim\"" +
                "        }," +
                "        {" +
                "            nome: \"Roberto\"," +
                "                    comentario: \"Se não estivessem fazendo nada errado, não iam querer apagar a mídia.\"\n" +
                "        }," +
                "        {" +
                "            nome: \"xumbinho\"," +
                "                    comentario: \"André ! Para vai!\"" +
                "        }" +
                "    ]" +
                "    }" +
                "]";

        groupArr = new JSONArray(TEST);
        ArrayList<Child> childList;

        for (int i = 0; i < groupArr.length(); ++i) {
            JSONObject groupObj= groupArr.getJSONObject(i);
            Group group = new Group();
            group.name = groupObj.getString("nome");

            childList = new ArrayList<>();
            JSONArray replyArr = groupObj.getJSONArray("resp");
            for (int j = 0; j < replyArr.length(); ++j) {
                JSONObject childObj = replyArr.getJSONObject(j);
                Child child = new Child();
                child.name = (childObj.getString("nome"));
                child.comment = (childObj.getString("comentario"));
                childList.add(child);
            } // for loop end

            group.setChildList(childList);
            list.add(group);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return list;
}

public class ExpAdapter extends BaseExpandableListAdapter {

    private final class ViewHolder {
        TextView textLabel;
    }

    private final List<Group> itemList;
    private final LayoutInflater inflater;

    private ExpAdapter(Context context, List<Group> itemList) {
        this.inflater = LayoutInflater.from(context);
        this.itemList = itemList;
    }

    @Override
    public Child getChild(int groupPosition, int childPosition) {

        return itemList.get(groupPosition).getChildList().get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return itemList.get(groupPosition).getChildList().size();
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
                             final ViewGroup parent) {
        View resultView = convertView;
        ViewHolder holder;

        if (resultView == null) {
            resultView = inflater.inflate(android.R.layout.simple_list_item_1, null); //TODO change layout id
            holder = new ViewHolder();
            holder.textLabel = resultView.findViewById(android.R.id.text1); //TODO change view id
            resultView.setTag(holder);
        } else {
            holder = (ViewHolder) resultView.getTag();
        }

        final Child item = getChild(groupPosition, childPosition);

        holder.textLabel.setText(item.name);

        return resultView;
    }

    @Override
    public Group getGroup(int groupPosition) {
        return itemList.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return itemList.size();
    }

    @Override
    public long getGroupId(final int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View theConvertView, ViewGroup parent) {
        View resultView = theConvertView;
        ViewHolder holder;

        if (resultView == null) {
            resultView = inflater.inflate(android.R.layout.simple_list_item_1, null);
            holder = new ViewHolder();
            holder.textLabel = resultView.findViewById(android.R.id.text1);
            resultView.setTag(holder);
        } else {
            holder = (ViewHolder) resultView.getTag();
        }

        final Group item = getGroup(groupPosition);

        holder.textLabel.setText(item.name);

        return resultView;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}
}

以下是發出 HTTP 請求的一些示例: 使用 URLConnection

此外,您可能會考慮使用 Volley 框架: Volley

簡單且非常流行的 HTTP 請求框架: OK HTTP

對於 Kotlin,我使用 Fuel: Fuel

請注意,Stackoverflow 上關於下載項目的大多數答案都使用了一個名為:DefaultHttpClient 的類,該類來自 Apache 庫。 谷歌決定在幾個 Android 版本之前刪除 Apache 庫。 仍然可以通過調整 Gradle 文件來使用它們,但這僅適用於舊版應用程序。 新應用應使用類似以下的類:URLConnection。 將 Apache 轉換為當前的 Android HTTP 類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM