【问题标题】:ExpandableListView with JSON data带有 JSON 数据的 ExpandableListView
【发布时间】:2017-06-23 23:53:54
【问题描述】:

我正在尝试显示联赛冠军的常备桌组。

我有 3 组:A 组、B 组、C 组。

对于每个组,我有 4 支球队:Team1、Team2、Team3、Team4,他们的积分和比赛次数。

我以 JSON 格式获取数据,并成功地将 ArrayList 中的数据传递给 ExpandableListView 适配器。

我在 groupview 方法上扩展了父行布局,因此它显示 GROUP A、GROUP B、GROUP C 如下:

现在在小组新闻中,我想放大这个自定义布局,显示 4 支球队的 id、球队名称、比赛、得分:

这是我的模型类:

public class Standings_data {

    String id;
    String groupid;
    String team;

    public String getTeam() {
        return team;
    }

    public void setTeam(String team) {
        this.team = team;
    }

    public String getGroupid() {
        return groupid;
    }

    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }

    String p;
    String pts;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }



    public String getP() {
        return p;
    }

    public void setP(String p) {
        this.p = p;
    }

    public String getPts() {
        return pts;
    }

    public void setPts(String pts) {
        this.pts = pts;
    }
}

我的片段类:

public class StandingFragment extends Fragment implements ConnectivityReceiver.ConnectivityReceiverListener,
        SwipeRefreshLayout.OnRefreshListener{
    public CoordinatorLayout coordinatorLayout;
    public boolean isConnected;
    public static final String NA = "NA";
    public RecyclerView recycler_post;
    public PostAdapter7 adapter;
    public ProgressDialog progressDialog;
    ArrayList<Standings_data> post_array = new ArrayList<>();
    public SwipeRefreshLayout swipeRefreshLayout;
    InterstitialAd mInterstitialAd;
    private InterstitialAd interstitial;
    public ExpandableListView elv;


    @Override
    public void onPrepareOptionsMenu(Menu menu) {

        super.onPrepareOptionsMenu(menu);
    }


    public StandingFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        checkConnectivity();

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v=inflater.inflate(R.layout.fragment_standing,null);

        // toolbar = (Toolbar) v.findViewById(R.id.toolbar_viewpager);
        // searchToolbar = (Toolbar) v.findViewById(R.id.toolbar_search);
        coordinatorLayout = (CoordinatorLayout) v.findViewById(R.id.coordinatorLayout);
        elv = (ExpandableListView)v.findViewById(R.id.elv);
        elv.setOnGroupExpandListener(onGroupExpandListenser);

        swipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
        swipeRefreshLayout.setColorSchemeResources(R.color.colorGreen,R.color.black,R.color.colorRed);


        try {
            getData();
        } catch (Exception e) {
            e.printStackTrace();
        }


        return v;
    }
    ExpandableListView.OnGroupExpandListener onGroupExpandListenser = new ExpandableListView.OnGroupExpandListener() {
        int previousGroup =-1;
        @Override
        public void onGroupExpand(int groupPosition) {
            if(groupPosition!= previousGroup)
                elv.collapseGroup(previousGroup);
            previousGroup = groupPosition;
        }
    };



    public void getData() throws Exception {
        if (checkConnectivity()){
            try {
                swipeRefreshLayout.setRefreshing(true);
                getAllPosts();
            } catch (Exception e) {
                e.printStackTrace();

            }
        }else {
            swipeRefreshLayout.setRefreshing(false);

            // getAllPosts();
            showSnack();

        }
    }

    public boolean checkConnectivity() {
        return ConnectivityReceiver.isConnected();
    }

    public void showSnack() {

        Snackbar.make(coordinatorLayout, getString(R.string.no_internet_connected), Snackbar.LENGTH_INDEFINITE)
                .setAction(getString(R.string.settings), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                    }
                }).setActionTextColor(Color.RED)
                .show();
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main, menu);


        super.onCreateOptionsMenu(menu,inflater);
    }


    @Override
    public void onResume() {
        super.onResume();
        // Toast.makeText(getContext(),"u have resumed the app",Toast.LENGTH_SHORT).show();
        AppController.getInstance().setConnectivityReceiver(this);
    }


    @Override
    public void onRefresh() {
        try {
            //  Toast.makeText(getContext(),"u have refreshed the app",Toast.LENGTH_SHORT).show();

            //when u swipe the app..the getdata method is invoked !
            getData();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    @Override
    public void onPause() {
        super.onPause();
        // Toast.makeText(getContext(),"u have paused the app",Toast.LENGTH_SHORT).show();
    }



    @Override
    public void onNetworkChange(boolean inConnected) {
        this.isConnected = inConnected;
        // Toast.makeText(getContext(),"the app network have been changed",Toast.LENGTH_SHORT).show();

    }
    public void getAllPosts() throws Exception{
        String TAG = "POSTS_STANDINGS";
        String url = Constants.STANDINGS_URL;
        StringRequest jsonObjectRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.i("response_standings", response);
                parseJson(response);
                progressDialog.dismiss();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                try {

                    progressDialog.dismiss();
                    swipeRefreshLayout.setRefreshing(false);
                    Log.e("error", "" +error.getMessage());
                }catch (NullPointerException e)
                {
                    swipeRefreshLayout.setRefreshing(false);
                    e.printStackTrace();
                }


            }
        });


        AppController.getInstance().addToRequestQueue(jsonObjectRequest, TAG);
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("الرجاء الانتظار..");
        progressDialog.show();
    }
    public void parseJson(String response){

        try {

            JSONArray array = new JSONArray(response);
            JSONObject jsonObject =null;
            post_array.clear();
            Standings_data p;
            for(int i=0 ; i<array.length() ; i++)
            {
                jsonObject=array.getJSONObject(i);

                String id_team=jsonObject.getString("id_team");
                String groupid= jsonObject.getString("name");
                String played=jsonObject.getString("played");
                String points=jsonObject.getString("points");

                p = new Standings_data();
                p.setId(id_team);
                p.setGroupid(groupid);
                p.setP(played);
                p.setPts(points);


                post_array.add(p);
                //realmHelper.save(p);
            }


        }
        catch (JSONException e) {
            swipeRefreshLayout.setRefreshing(false);
            e.printStackTrace();
            //Log.d("error", e.getMessage());
        }
        adapter = new PostAdapter7(getContext(),post_array );
        elv.setAdapter(adapter);
        swipeRefreshLayout.setRefreshing(false);

    }





}

我的适配器类:

public class PostAdapter7 extends BaseExpandableListAdapter{

    public Context mContext;

    public ArrayList<Standings_data> filtered_items = new ArrayList<>();


    //   ItemFilter mFilters = new ItemFilter();

    public PostAdapter7(Context mContext, ArrayList<Standings_data> postList) {
        this.mContext = mContext;
       this.filtered_items = postList;
    }
    @Override
    public int getGroupCount() {
        return filtered_items.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 0;
        // not sure about the return value
    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
        // not sure about the return value

    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
        // not sure about the return value
    }

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

    @Override
    public long getChildId(int i, int i2) {
        return 0;
    }

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

    @Override
    public View getGroupView(int i, boolean isExpanded, View view, ViewGroup parent) {
        final Standings_data post = filtered_items.get(i);
        if(view ==null)
        {
            LayoutInflater inflater =(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.parent_row,null);
        }
        TextView groupID = (TextView)view.findViewById(R.id.txtgroupid);
        groupID.setText(post.getGroupid());
        return view;
    }

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

         // i have no idea what to do here so the four team are displayed from arraylist for each group

        return view;    }

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




}

如何从包含数据的arraylist 中显示foreach group(A,B,C,D) 对应的团队?

为了更清楚,我试图与此相同:

更新:这是我的 json 响应

[{"0":"1","id_team":"1","1":"TEAM 1","name":"TEAM 1","2":"3","played" :"3","3":"9","points":"9"},{"0":"2","id_team":"2","1":"TEAM 2","name ":"TEAM 2","2":"3","played":"3","3":"1","points":"1"},{"0":"3"," id_team":"3","1":"TEAM3","name":"TEAM3","2":"2","played":"2","3":"6","points" :"6"}]

这是一个简单的测试

【问题讨论】:

  • 你能把你的json响应放上去吗
  • 您有(A 组、B 组、C 组)作为静态数据,您没有从响应中获得它们,对吗?如果不是静态的,请您发布完整的回复
  • @AhmedMousa 他们是静态的,因为这个锦标赛只有这 3 个组
  • 好的,我会发布一个对你有帮助的答案
  • 但是你的回复没有完成你发布了一个团队数组..但是你怎么知道这个数组是针对哪个组的?

标签: android json expandablelistview


【解决方案1】:

据我了解,您正在获取主要组(A 组、B 组、C 组)的儿童数据..

所以您的 post_array 用于保存团队数据,因此每个组都有一个 post_array 用于其子团队

您必须为您的组(A 组、B 组、C 组)创建一个 arrayList

HashMap 为您的孩子(每个组的团队)哈希映射包含您 post_array

示例:

把它放在onCreate的顶部

List<String> listDataGroup = new ArrayList<String>();
HashMap<String, ArrayList<Standings_data>> listDataTeams = new HashMap<String, ArrayList<Standings_data>>();

然后在您的 parseJson() 方法中将您的静态组添加到组列表中并在 hashMap 上填充您的团队

// Adding groups data
listDataGroup.add("Group A");
listDataGroup.add("Group B");
listDataGroup.add("Group C");

在你的 for 循环之后将数据添加到 post_array 之后

//adding childs data (Teams) like this
listDataTeams.put(listDataGroup.get(0), post_array); // Group, Child data(Teams)
listDataTeams.put(listDataGroup.get(1), post_array);
listDataTeams.put(listDataGroup.get(2), post_array);

请注意,前面的代码将为所有组添加相同的团队

然后将 (listDataGroup , listDataTeams) 传递给您的可扩展列表适配器,而不是传递 post_array

然后在你的适配器上做这个

     public class PostAdapter7 extends BaseExpandableListAdapter{

            public Context mContext;
            List<String> listDataGroup ;
            HashMap<String, ArrayList<Standings_data>> listDataTeams;
            //   ItemFilter mFilters = new ItemFilter();

                public PostAdapter7(Context mContext, List<String> listDataGroup , HashMap<String, ArrayList<Standings_data>> listDataTeams) {
                    this.mContext = mContext;
                   this.listDataGroup = listDataGroup;
                   this.listDataTeams = listDataTeams;
                }
                @Override
                public int getGroupCount() {
                    return listDataGroup.size();
                }

                @Override
                public int getChildrenCount(int groupPosition) {
                    return this.listDataTeams.get(this.listDataGroup.get(groupPosition)).size();
                }

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

                @Override
                public Object getChild(int groupPosition, int childPosition) {
                    return this.listDataTeams.get(this.listDataGroup.get(groupPosition)).get();
                }

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

                @Override
                public long getChildId(int i, int i2) {
                    return i2;
                }

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

                @Override
                public View getGroupView(int i, boolean isExpanded, View view, ViewGroup parent) {


        // this is for inflate Groups view and display data for it from listDataGroup array list 

                    if(view ==null)
                    {
                        LayoutInflater inflater =(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        view = inflater.inflate(R.layout.parent_row,null);
                    }


                    //here display your data for each Group

                    return view;
                }

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

        // this is for inflate childs (Team view replace child_row with yours) and display data for it from listDataTeams HashMap 

        if(view ==null)
                    {
                        LayoutInflater inflater =(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        view = inflater.inflate(R.layout.child_row,null);
                    }

             //here get your data for each team and set it to your textview
             final Standings_data teamData = (Standings_data)getChild(groupPosition,childPosition);

              //and then in your tv display data
              yourTextView.setText(teamData.getGroupid());
         return view;
         }

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

            } 

我希望你能理解……如果有问题请告诉我

如果你想要一个很好的教程来理解 ExpandableListViw 那么 试试这个Tutorial

更新

您可以使用它对您的团队列表进行排序

    Collections.sort(post_array, new Comparator<Standings_data>(){
        public int compare(Standings_data s1, Standings_data s2) {
            return s1.getpts().compareToIgnoreCase(s2.getPts());
        }
    });

   Collections.reverse(post_array);

您在将 post_array 添加到 listDataTeams 散列图

之前放置此代码

【讨论】:

  • 我已经复制了您的代码,并在布局充气后在 getgroupview 和 getchildview 中初始化了我的 Textview。但是我如何从 Listdatagroups 和 listDataTeams 中获取数据以正确地将它们设置为父行和子行的文本视图?
  • 我已经为 getGroupView 做了这个并且它起作用了:TextView tv = (TextView) view.findViewById(R.id.txtgroupid); tv.setText(listDataGroup.get(i));但是childview怎么办呢?
  • 完美老板!!你拯救了我的一天,这正是我想做的。感谢您的努力和感谢。我还有一个问题,如何设置积分最高的团队?
  • 超级棒! .很抱歉再去一次..我正在使用 swiperefresh,所以当滑动一切顺利时,expandablelistview 正在复制,所以它们是 3(组 a、b、c)现在它们是 6。我如何添加组 a、b、c在应用程序中一次,因此他们在刷卡时不会受到影响
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2014-03-04
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多