带json值的片段中的自定义适配器 [英] Custom Adapter in fragment with get json value

查看:117
本文介绍了带json值的片段中的自定义适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在活动中显示片段时,我试图从片段中的JSON获取列表. 我将在显示适配器时遇到问题.

I'm trying to get list from JSON in fragment when show the fragment in activity. I have problem when I will show the adapter.

SiswaFragment

public class SiswaFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private List<MenuItem> menuItem;
    private ListView listView;
    private MenuListAdapter listAdapter;
    private String URL_FEED = AppConfig.URL;


    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

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

    // TODO: Rename and change types and number of parameters
    public static SiswaFragment newInstance(String param1, String param2) {
        SiswaFragment fragment = new SiswaFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

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

        View view = inflater.inflate(R.layout.fragment_siswa, container, false);
        //session = new SessionManager(getActivity().getApplicationContext());

        listView = (ListView) view.findViewById(R.id.listSiswa);
        menuItem = new ArrayList<MenuItem>();

        RequestQueue rq = Volley.newRequestQueue(getActivity().getApplicationContext());

        String no_hp = "085733777717";
        String URL = URL_FEED + "/?nomor_hp=" + no_hp;

        StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // Do something with the response

                        try{

                            JSONObject o = new JSONObject(response);
                            JSONArray feedArray = o.getJSONArray("data");

                            for (int i = 0; i < feedArray.length(); i++) {
                                JSONObject feedObj = (JSONObject) feedArray.get(i);

                                //Toast.makeText(getApplicationContext(), feedObj.toString(), Toast.LENGTH_LONG).show();
                                MenuItem item = new MenuItem();
                                item.setId(feedObj.getString("kode"));
                                item.setImage(AppConfig.URL_ASSETS + "user.png");
                                item.setName(feedObj.getString("nama"));
                                item.setDescription(feedObj.getString("kelas"));
                                item.setRemarks(feedObj.getString("sekolah"));

                                menuItem.add(item);
                            }

                            //txt.setText(sb.toString());


                        }  catch (JSONException ex){}

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // Handle error
                    }
                });

        listAdapter = new MenuListAdapter(getActivity(), menuItem);
        listView.setAdapter(listAdapter);
        // Inflate the layout for this fragment
        rq.add(stringRequest );
        return view;
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }

}

MenuListAdapter

public class MenuListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<MenuItem> menuItem;
    private SessionManager session;
    private Database db;
    private Context context;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public MenuListAdapter(Activity activity, List<MenuItem> menuItem) {
        this.activity = activity;
        this.menuItem = menuItem;
        this.context = activity.getApplicationContext();
    }

    @Override
    public int getCount() {
        return menuItem.size();
    }

    @Override
    public Object getItem(int location) {
        return menuItem.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        db = new Database(activity.getApplicationContext());

        // Session manager
        session = new SessionManager(activity.getApplicationContext());

        if (inflater == null)
            inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.menu_item, null);
        }

        if (imageLoader == null) {
            imageLoader = AppController.getInstance().getImageLoader();
        }

        TextView name = (TextView) convertView.findViewById(R.id.name);
        TextView description = (TextView) convertView.findViewById(R.id.description);
        NetworkImageView image = (NetworkImageView) convertView.findViewById(R.id.profilePic);
        //FeedImageView feedImageView = (FeedImageView) convertView.findViewById(R.id.feedImage1);

        final MenuItem item = menuItem.get(position);

        name.setText(item.getName());
        description.setText(item.getDescription());
        image.setImageUrl(item.getImage(), imageLoader);

        return convertView;
    }
}

我在运行时发现问题,只是显示眨眼(强制关闭).我认为listAdapter = new MenuListAdapter(getActivity(), menuItem);listView.setAdapter(listAdapter);上的问题. 希望我很清楚,谢谢.

I found problem when this running and just showing the blink (force close). I think the issue at listAdapter = new MenuListAdapter(getActivity(), menuItem); and listView.setAdapter(listAdapter);. Hope I was clear, thanks.

推荐答案

除一件事外,一切都很好...!

Everything is fine except one thing...!

您已经在请求之前设置了适配器,但是那时您的菜单列表为空,因为您尚未从bac-kend接收任何数据.

You have set the adapter just before your request and that time your menu list is empty because you haven't received any data from bac-kend.

//just here
listAdapter = new MenuListAdapter(getActivity(), menuItem);
    listView.setAdapter(listAdapter);
    // Inflate the layout for this fragment
    rq.add(stringRequest );

因此,当onResponse回调将被调用时,您将获得数据. 您可以在其中添加逻辑,以便在此之前初始化适配器并刷新菜单列表,然后调用notifyDataSetChanged方法刷新列表视图.

So, you will get data when onResponse callback will be invoked... You can add a logic in it to just initialize your adapter before this and refresh your menu list and call notifyDataSetChanged method to refresh your listview.

只需像这样修改您的方法:

Just modify your method like this:

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

    View view = inflater.inflate(R.layout.fragment_siswa, container, false);
    //session = new SessionManager(getActivity().getApplicationContext());

    listView = (ListView) view.findViewById(R.id.listSiswa);
    menuItem = new ArrayList<MenuItem>();

    RequestQueue rq = Volley.newRequestQueue(getActivity().getApplicationContext());

    String no_hp = "085733777717";
    String URL = URL_FEED + "/?nomor_hp=" + no_hp;
    listAdapter = new MenuListAdapter(getActivity(), menuItem);
    listView.setAdapter(listAdapter);

    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Do something with the response

                    try{

                        JSONObject o = new JSONObject(response);
                        JSONArray feedArray = o.getJSONArray("data");

                        for (int i = 0; i < feedArray.length(); i++) {
                            JSONObject feedObj = (JSONObject) feedArray.get(i);

                            //Toast.makeText(getApplicationContext(), feedObj.toString(), Toast.LENGTH_LONG).show();
                            MenuItem item = new MenuItem();
                            item.setId(feedObj.getString("kode"));
                            item.setImage(AppConfig.URL_ASSETS + "user.png");
                            item.setName(feedObj.getString("nama"));
                            item.setDescription(feedObj.getString("kelas"));
                            item.setRemarks(feedObj.getString("sekolah"));

                            menuItem.add(item);
                        }

                        //txt.setText(sb.toString());
                        listAdapter.notifyDataSetChanged();

                    }  catch (JSONException ex){}

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // Handle error
                }
            });
    // Inflate the layout for this fragment
    rq.add(stringRequest );
    return view;
}

这篇关于带json值的片段中的自定义适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆