有没有更好的方法来填充片段中的listView,同时获取凌空数据?

时间:2016-03-11 19:52:01

标签: android listview android-fragments android-volley android-adapter

我正在做练习,我必须通过Volley库从服务器获取JSONArray对象。然后使用该数据填充listView。我已经做到了,但我认为必须有更好的方法。我能够使它工作的唯一方法是在我发送给齐射的JSONArrayRequest的onResponse方法中设置适配器。

是否可以在片段的onCreateView方法中设置适配器?

这是我的代码:

import requests
import json

url = 'http://stats.nba.com/stats/shotchartdetail?PlayerID=2544&TeamID=0&VsConference=&Location=&SeasonType=Regular+Season&RookieYear=&Season=2015-16&DateFrom=&ClutchTime=&GameID=&OpponentTeamID=0&DateTo=&GameSegment=&AheadBehind=&LastNGames=0&VsDivision=&LeagueID=&Position=&Outcome=&ContextMeasure=FGM&SeasonSegment=&Period=0&Month=0'
r = requests.get(url)
data = json.loads(r.text)

2 个答案:

答案 0 :(得分:0)

是的,我将我的适配器设置为我当前项目中片段的onCreateView中的ExpandableListView。你应该没有问题。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      View parentThis = (LinearLayout)inflater.inflate(R.layout.tab_exlv, container, false);


      exlvTabHistory = (ExpandableListView)parentThis.findViewById(R.id.exlvTabHistory);
      exlvTabHistory.setAdapter(setupEXLVAdapter());
    }

答案 1 :(得分:0)

是的,还有更好的方法。创建对适配器的引用作为Fragment的成员变量,这允许您在数据进入后调用notifyDataSetChanged()

有一点需要注意,您无法更改数据源的引用,即users列表。因此,当数据进入时,使用addAll()添加数据而不重新分配数据源引用。

您的代码应该是这样的:

public class UserListFragment extends Fragment {

    private static final String USERS_URL = "https://raw.githubusercontent.com/users.json";
    public static final String TAG = UserListFragment.class.getSimpleName();
    private ListView listView;
    private VolleyManager volleyManager;
    private List<User> users;

    UsersAdapter adapter; //added

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_user_list, null);

        listView = (ListView) view.findViewById(R.id.list_view);

        //added:
        adapter = new UsersAdapter(getActivity(), R.layout.list_item, users);
        listView.setAdapter(adapter);


        Button obtain_data_btn = (Button) view.findViewById(R.id.user_list_obtain_btn);
        obtain_data_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getUsersListData();
            }
        });

        return view;
    }

    private void getUsersListData() {
        JsonArrayRequest jsonArrayRqst = new JsonArrayRequest(
                USERS_URL,
                new Response.Listener<JSONArray>(){
                    @Override
                    public void onResponse(JSONArray response) {
                        //modified:
                        users.addAll(parseUserList(response.toString()));
                        adapter.notifyDataSetChanged();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d(TAG, error.getMessage());
                }
                }
        );

        volleyManager = VolleyManager.getInstance(getActivity());
        volleyManager.addToRequestQueue(jsonArrayRqst);
    }

    //.........