Android ListView не отображает содержимое при первом запуске фрагмента

У меня есть список во фрагменте с пользовательским адаптером, загружающим список продуктов из моей базы данных 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 печатается в журнале.

Вот мой журнал активности:

Я решил это... Проблема была в последовательности выполнения. После вызова Asynctask я не стал ждать его завершения, а заполнил список, прежде чем получить строку json с сервера. Решил это, заполнив список в методе onPostExecute Asynctask. Спасибо тем, кто пытался мне помочь.


person Nilesh Thadani    schedule 08.06.2016    source источник


Ответы (3)


Вы звоните _1_ перед получением данных.

person Nilesh Thadani    schedule 11.06.2016

Вы должны вызвать его после создания вашего 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
person earthw0rmjim    schedule 09.06.2016

viewComplainAdapter = новый ViewComplainAdapter (this.getActivity(), R.layout.complain_layout); жаловатьсяList.setAdapter(viewComplainAdapter); Здесь вы создаете объект класса ViewComplainAdapter с контекстом Activity и ресурсом макета, поэтому данные, которые вы передаете для отображения, отсутствуют. Таким образом, при первом создании фрагмента список не может отображать какие-либо данные.

После этого вы отправляете запрос на свой сервер. Проверьте строку ниже.

новый BackgroundViewComplainTask().execute();

Получив ответ от сервера, вы добавляете значение в ViewComplainAdapter.

Поэтому, когда вы вызываете Fragment во второй раз, 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++;
    }

Чтобы решить эту проблему, после получения только ответа установите адаптер со списком, чтобы вы могли видеть фрагмент со списком данных в обязательном порядке.

Я обновил код... Я сохраняю данные json в sharedPreferences и извлекаю их... Но ничего не возвращает

person Sarojini2064130    schedule 10.06.2016
comment
Хорошо, как вы помещаете данные json в sharedpreference. Можете ли вы опубликовать этот код. Я думаю, что вы неправильно помещаете данные в sharedpreference, поэтому ничего не возвращаете. - person Nilesh Thadani; 10.06.2016
comment
Редактор SharedPreferences.Editor = sharedPreferences.edit(); editor.putString(пожаловаться, результат); редактор.коммит(); - person Sarojini2064130; 10.06.2016
comment
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: в org.json.JSONTokener.nextValue(JSONTokener.java:97) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в 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: в android.app.Fragment.per formCreateView(Fragment.java:2053) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 06- 08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в 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: в android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в 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: в android.os.Looper.loop(Looper.java:135) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в android.app .ActivityThread.main(ActivityThread.java:5254) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: на java.lang.reflect. Method.invoke(собственный метод) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: в 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: в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 06-08 15:08:27.480 10110-10394 /com.example.thadaninilesh.productapp D/ответ: {"server_response":[{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"Тело полностью повреждено","added_on" :"06-08-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"Корпус полностью поврежден","added_on ":"06-08-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"Тело готово повреждены","added_on":"06-08-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwertyu","complainMessage":"Корпус полностью поврежден","added_on":"06-08-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"Физическое состояние","complainMessage":" --","added_on":"06-08-2016","productName":"Acer Travelmate"},{"serial":"12345678DFGBH","complainType":"sdcwsdw","complainMessage":"wdwdf" ,"added_on":"06-08-2016","productName":"Galaxy J7"},{"serial":"12345678DFGBH","complainType":"asd","complainMessage":"--"," add_on":"06-08-2016 08:06","productName":"Galaxy J7"}]} - person Nilesh Thadani; 10.06.2016