Android ListView brak wyświetlania wyników

0

Witam,
ListView jednorazowo pokazuje liste rzeczy jakich pobiera z bazy danych, a przy następnych próbach wyświetla jedynie pustą stronę. Przy korzystaniu z API21 działa poprawnie przy API17 występuje w/w błąd. Nie wiem co jest tego powodem, ma ktoś jakiś pomysł?

package com.example.trzewa.bandrider;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.parse.FindCallback;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class EditionActivity extends ListActivity {
    private AlertDialog alertDialog;
   // private Context mContext;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         final Context context = getApplicationContext();
      //  mContext = this;
        final ArrayList<HashMap<String, String>> instrumentItems = new ArrayList<>();
        //final ArrayList<HashMap<String, String>> stuffItems = new ArrayList<>();
        //Intent intent = getIntent();
        //int selected  = intent.getIntExtra(Constans.CATEGORY_SELECTED, 0);
        boolean networkstate = Utilities.getConnectivityStatus(context);
        ParseUser currentUser = ParseUser.getCurrentUser();
        String user_name = currentUser.getUsername();
        if (networkstate) {

            Toast.makeText(getApplicationContext(), "nawiazano połączenie", Toast.LENGTH_LONG).show();



                    Toast.makeText( getApplicationContext(),"Select ",Toast.LENGTH_SHORT).show();
                    ParseQuery<ParseObject> queryInstruments = ParseQuery.getQuery("Instrument");
                    queryInstruments.whereEqualTo("owner", user_name);
                    queryInstruments.findInBackground(new FindCallback<ParseObject>() {

                        public void done(List<ParseObject> instrumentList, com.parse.ParseException e) {
                            if (e == null) {
                                Log.d("score", "Retrieved " + instrumentList.size() + "instrumentów");
                                if (instrumentList.size() > 0) {

                                    for (int i = 0; i < instrumentList.size(); i++) {
                                        HashMap<String, String> map = new HashMap<>();
                                        ParseObject ob = instrumentList.get(i);
                                        map.put("nazwa_inst", ob.getString("name"));
                                        map.put("kategoria_inst", ob.getString("category"));
                                        map.put("wlasciciel_inst", ob.getString("owner"));
                                        map.put("status_inst", ob.getString("Switchstatus"));
                                        map.put("objectId",ob.getObjectId());
                                        instrumentItems.add(map);
                                    }
                                    Toast.makeText(getApplicationContext(), "Liczba" + instrumentItems.size(), Toast.LENGTH_SHORT).show();
                                }

                            } else {
                                Log.d("score", "Error: " + e.getMessage());
                            }
                        }


                    });

                    ListAdapter adapter = new SimpleAdapter(getApplicationContext(), instrumentItems,
                            R.layout.activity_edit_item,
                            new String[]{"nazwa_inst", "wlasciciel_inst","objectId"}, new int[]{
                            R.id.nazwaEditItem, R.id.wlascicielEditItem,R.id.objectID});

                    setListAdapter(adapter);

                      ListView w = getListView();
                   w.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                                int position, long id) {
                            CharSequence colors[] = new CharSequence[]{"Usuń", "Edytuj"};

                            AlertDialog.Builder builder = new AlertDialog.Builder(EditionActivity.this);
                            builder.setTitle("Co chcesz zrobić?");
                            builder.setItems(colors, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // obsługa kliknięcia
                                    switch (which)
                                    {
                                        case 0:
                                            Toast.makeText(getApplicationContext(), "PPP", Toast.LENGTH_SHORT).show();

                                            break;
                                    }
                                }
                            });
                            builder.show();

                        }
                    });


        } else {
            alertDialog = new AlertDialog.Builder(EditionActivity.this)
                    .setTitle("Brak Internetu")
                    .setMessage("brak połączenia z siecią Internet")
                    .setNegativeButton("Ok", new AlertDialog.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            alertDialog.cancel();
                            finish();
                        }
                    })
                    .create();
            alertDialog.show();


        }

         }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_plan_rider, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
0

Popraw kod na czytelniejszy to wtedy się przyglądne.
Wszystko masz w onCreate. Oszalałeś ?

0
  1. na starcie tworzysz pustą listę: instrumentItems
  2. odpalasz w tle pobieranie danych do tej listy
  3. tworzysz adapter w głównym wątku -> lista jeszcze jest pusta.
  4. Wątek pobrał listę ale adapter nie wie o tym że set danych się zmienił

Popraw to tak:

  1. stwórz adapter przed queryInstruments.findInBackground jako zmienną final

  2. na końcu metody done() public void done(List<ParseObject> instrumentList, com.parse.ParseException e) dodaj :
    runOnUiThread(new Runnable() {
    public void run() {
    adapter.notifyDataSetChanged();
    }
    });

Jezeli nadal nie działa to sprawdź czy nie lecą wyjątki

0
xxx_xx_x napisał(a):
  1. na starcie tworzysz pustą listę: instrumentItems
  2. odpalasz w tle pobieranie danych do tej listy
  3. tworzysz adapter w głównym wątku -> lista jeszcze jest pusta.
  4. Wątek pobrał listę ale adapter nie wie o tym że set danych się zmienił

Popraw to tak:

  1. stwórz adapter przed queryInstruments.findInBackground jako zmienną final

  2. na końcu metody done() public void done(List<ParseObject> instrumentList, com.parse.ParseException e) dodaj :
    runOnUiThread(new Runnable() {
    public void run() {
    adapter.notifyDataSetChanged();
    }
    });

Jezeli nadal nie działa to sprawdź czy nie lecą wyjątki

Dziękuje serdecznie koledze za radę. Pomogło i działa jak należy. Po tym jak to napisałeś stało się to zrozumiałe. Tylko jeden mały problem wystąpił z metodą runOnUiThread należało zmienić na ((BaseAdapter) adapter).notifyDataSetChanged() ponieważ notifyDataSetChanged nie jest metodą ListAdapter, ale BaseAdapter(ale to już dla zainteresowanych)

1 użytkowników online, w tym zalogowanych: 0, gości: 1