第一次启动片段时,Android ListView不显示内容

时间:2016-06-08 19:24:37

标签: android listview sharedpreferences jsonobject

我在一个片段中有一个listview,其中一个customadapter从我的mysql数据库中加载了一个产品列表。当我第一次从导航抽屉活动导航到片段时,它不会显示任何项目,但会在日志中打印相同的内容。但是当第二次启动相同的片段时,所有项目都是可见的。 这是来自片段onCreateView()的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_view_complain, container, false);
    sharedPreferences = getActivity().getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    new BackgroundViewComplainTask().execute();
    jsonString = sharedPreferences.getString("complain", "");
    complainList = (ListView)view.findViewById(R.id.list);
    addComplain = (Button)view.findViewById(R.id.addComplain);
    String productName, serial, complainType, complainMessage, added_on;
    viewComplainAdapter = new ViewComplainAdapter(this.getActivity(), R.layout.complain_layout);
    try {
        Log.d("json",jsonString);
        jsonObject = new JSONObject(jsonString);
        jsonArray = jsonObject.getJSONArray("server_response");
        int count = 0;
        ViewComplainsList viewComplainsList;

        while (count<jsonArray.length()){
            JSONObject JO = jsonArray.getJSONObject(count);
            productName = JO.getString("productName");
            serial = JO.getString("serial");
            complainType = JO.getString("complainType");
            complainMessage = JO.getString("complainMessage");
            added_on = JO.getString("added_on");
            viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
            viewComplainAdapter.add(viewComplainsList);
            count++;
        }
        complainList.setAdapter(viewComplainAdapter);
        viewComplainAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    if(jsonString.isEmpty()){
        Toast.makeText(getActivity(),"No Complains found",Toast.LENGTH_LONG).show();
        this.startActivity(new Intent(getActivity(), MainActivity.class));
    }
    addComplain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.main_activity_frame, new AddComplainFragment()).addToBackStack("complainFragment").commit();
        }
    });
    return view;
}

jsonString 会打印在日志中。

这是我的活动日志:

  

06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:org.json.JSONException:字符0处的输入结束   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at org.json.JSONTokener.syntaxError(JSONTokener.java:450)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at org.json.JSONTokener.nextValue(JSONTokener.java:97)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at org.json.JSONObject。(JSONObject.java:156)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at org.json.JSONObject。(JSONObject.java:173)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at com.example.thadaninilesh.productapp.ViewComplainFragment.onCreateView(ViewComplainFragment.java:72)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.Fragment.performCreateView(Fragment.java:2053)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.BackStackRecord.run(BackStackRecord.java:834)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:447)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.os.Handler.handleCallback(Handler.java:739)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.os.Handler.dispatchMessage(Handler.java:95)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.os.Looper.loop(Looper.java:135)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at android.app.ActivityThread.main(ActivityThread.java:5254)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at java.lang.reflect.Method.invoke(Native Method)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at java.lang.reflect.Method.invoke(Method.java:372)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)   06-08 15:08:27.450 10110-10110 / com.example.thadaninilesh.productapp W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)   06-08 15:08:27.480 10110-10394 / com.example.thadaninilesh.productapp D / response:{“server_response”:[{“serial”:“123456789QWERT”,“complainType”:“qwerty”,“complainMessage”: “身体完全受损”,“added_on”:“08-06-2016”,“productName”:“Acer Travelmate”},{“serial”:“123456789QWERT”,“抱怨类型”:“qwerty”,“抱怨消息” :“身体完全受损”,“added_on”:“08-06-2016”,“productName”:“Acer Travelmate”},{“serial”:“123456789QWERT”,“抱怨类型”:“qwerty”,“抱怨消息” “:”尸体已完全损坏“,”“add_on”:“08-06-2016”,“productName”:“Acer Travelmate”},{“serial”:“123456789QWERT”,“抱怨类型”:“qwertyu”,“抱怨消息“:”身体完全受损“,”“添加”:“”08-06-2016“,”productName“:”Acer Travelmate“},{”serial“:”123456789QWERT“,”抱怨类型“:”身体状况“ ,“抱怨消息”:“ - ”,“added_on”:“08-06-2016”,“productName”:“Acer Travelmate”},{“serial”:“12345678DFGBH”,“抱怨类型”:“sdcwsdw”,“ complainMessage “:” wdwdf “ ”ADDED_ON“: ”2016年8月6日“, ”产品名称“:” 晚会xy J7“},{”serial“:”12345678DFGBH“,”抱怨类型“:”asd“,”抱怨消息“:” - “,”added_on“:”08-06-2016 08:06“,”productName“: “Galaxy J7”}}}

3 个答案:

答案 0 :(得分:1)

我解决了...... 问题是执行的顺序。在调用Asynctask后,我没有等待它完成,而是在从服务器获取json字符串之前填充listview。 通过在Asynctask的onPostExecute方法中填充listview来解决它。 感谢那些试图帮助我的人。

答案 1 :(得分:0)

在获取数据之前,您正在调用viewComplainAdapter.notifyDataSetChanged();

您应该在创建Fragment之后或至少在获取数据后调用它:

while (count<jsonArray.length()){
    JSONObject JO = jsonArray.getJSONObject(count);
    if(JO.getString("productName").isEmpty()){
        startActivity(new Intent(this.getActivity(), LoginActivity.class));
    }
    productName = JO.getString("productName");
    serial = JO.getString("serial");
    complainType = JO.getString("complainType");
    complainMessage = JO.getString("complainMessage");
    added_on = JO.getString("added_on");
    Log.d("productName",productName);
    ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
    viewComplainAdapter.add(viewComplainsList);
    count++;
}

viewComplainAdapter.notifyDataSetChanged(); // here

答案 2 :(得分:0)

检查以下代码。

viewComplainAdapter = new ViewComplainAdapter(this.getActivity(),R.layout.complain_layout);     complainList.setAdapter(viewComplainAdapter); 这里您正在使用Activity上下文和布局资源创建ViewComplainAdapter类的对象,因此没有要传递的数据显示。因此,第一次进行片段实例化时,listview无法显示任何数据。

之后您向服务器发送请求。请检查以下行。

新的BackgroundViewComplainTask()。execute();

从服务器获得响应后,您正在将值添加到ViewComplainAdapter。

    while (count<jsonArray.length()){
        JSONObject JO = jsonArray.getJSONObject(count);

        productName = JO.getString("productName");
        serial = JO.getString("serial");
        complainType = JO.getString("complainType");
        complainMessage = JO.getString("complainMessage");
        added_on = JO.getString("added_on");
        Log.d("productName",productName);
        ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
        viewComplainAdapter.add(viewComplainsList);
        count++;
    }

因此,当您第二次调用Fragment时,ViewComplainAdapter能够在listviw中显示数据。

要解决此问题,仅在获得响应后,使用listview设置适配器,以便您可以看到带有数据列表的片段。