2016-07-09 5 views
1

Ich Parsing ein JSON-Array von einer öffentlichen Quelle und Einfügen von ihnen in eine benutzerdefinierte ListView. Ich habe 4 Klassen;Android Benutzerdefinierte ListView nicht mit Volley

  1. MySingleton für Volley Anfragen

    public class MySingleton { 
    private static MySingleton mInstance; 
    private RequestQueue mRequestQueue; 
    private ImageLoader mImageLoader; 
    private static Context mCtx; 
    
    private MySingleton(Context context) { 
        mCtx = context; 
        mRequestQueue = getRequestQueue(); 
    
        mImageLoader = new ImageLoader(mRequestQueue, 
          new ImageLoader.ImageCache() { 
           private final LruCache<String, Bitmap> 
             cache = new LruCache<String, Bitmap>(20); 
    
           @Override 
           public Bitmap getBitmap(String url) { 
            return cache.get(url); 
           } 
    
           @Override 
           public void putBitmap(String url, Bitmap bitmap) { 
            cache.put(url, bitmap); 
           } 
          }); 
    } 
    
    public static synchronized MySingleton getInstance(Context context) { 
        if (mInstance == null) { 
         mInstance = new MySingleton(context); 
        } 
        return mInstance; 
    } 
    
    public RequestQueue getRequestQueue() { 
        if (mRequestQueue == null) { 
         mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 
        } 
        return mRequestQueue; 
    } 
    
    public <T> void addToRequestQueue(Request<T> req) { 
        getRequestQueue().add(req); 
    } 
    
    public ImageLoader getImageLoader() { 
        return mImageLoader; 
    }} 
    
  2. GameListItem

    public class GameListItem {

    private String itemName, itemLongDescription, itemShortDescription, itemReleaseDate; 
    String releaseyear; 
    private int iconID, imageID; 
    
    public GameListItem(String itemName, String releaseyear, int iconID) { 
    
        this.itemName = itemName; 
        this.releaseyear = releaseyear; 
        this.iconID = iconID; 
    } 
    
    public String getItemName() { 
    
        return itemName; 
    } 
    
    public String getReleaseyear() { 
        return releaseyear; 
    }} 
    
  3. CustomListAdapter

    public class CustomListAdapter BaseAdapter erstreckt {

    private Context mContext; 
    private LayoutInflater mInflater; 
    private List<GameListItem> mDataSource; 
    
    public CustomListAdapter(Context context, List<GameListItem> items) { 
        mContext = context; 
        mDataSource = items; 
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    
    
    @Override 
    public int getCount() { 
        return mDataSource.size(); 
    } 
    
    @Override 
    public Object getItem(int position) { 
        return mDataSource.get(position); 
    } 
    
    @Override 
    public long getItemId(int position) { 
        return position; 
    } 
    
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        View rowView = mInflater.inflate(R.layout.gamelist_layout, parent, false); 
    
        TextView titleTextView = (TextView) rowView.findViewById(R.id.gameTitle); 
    
        TextView subtitleTextView = (TextView) rowView.findViewById(R.id.gameDescription); 
    
        titleTextView.setText(mDataSource.get(position).getItemName()); 
        subtitleTextView.setText(mDataSource.get(position).getReleaseyear()); 
    
        return rowView; 
    }} 
    
  4. MainActivity

    public class MainActivity erstreckt AppCompatActivity {

    final String TAG = this.getClass().getSimpleName(); 
    RequestQueue requestQueue; 
    private CustomListAdapter adapter; 
    private List<GameListItem> gameList; 
    private GameListItem gameItem; 
    ListView listView; 
    
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        Cache cache = new DiskBasedCache(getCacheDir(), 1024*1024); 
        Network network = new BasicNetwork(new HurlStack()); 
        requestQueue = new RequestQueue(cache, network); 
        requestQueue.start(); 
        listView = (ListView) findViewById(R.id.gameListView); 
        gameList = new ArrayList<>(); 
    
        //This works and gives me a ListView with 5 rows 
        gameList.add(new GameListItem("Test 1", "2019", R.mipmap.ic_launcher)); 
        gameList.add(new GameListItem("Test 2", "2092", R.mipmap.ic_launcher)); 
        gameList.add(new GameListItem("Test 3", "3243", R.mipmap.ic_launcher)); 
        gameList.add(new GameListItem("Test 4", "2323", R.mipmap.ic_launcher)); 
        gameList.add(new GameListItem("Test 5", "2123", R.mipmap.ic_launcher)); 
    
    
        //This doesn't work... 
        String url = "http://api.androidhive.info/json/movies.json"; 
        JsonArrayRequest stringRequest = new JsonArrayRequest(url, new Response 
          .Listener<JSONArray>(){ 
    
         @Override 
         public void onResponse(JSONArray jsonArray) { 
    
          if (jsonArray == null) { 
           Toast.makeText(MainActivity.this, "jsonArray is Null", Toast.LENGTH_LONG).show(); 
          } else { 
           try { 
            Toast.makeText(MainActivity.this, "ATTEMPTING PARSING", Toast.LENGTH_SHORT).show(); 
            Log.e("This is the json array", jsonArray.toString()); 
    
            for (int i = 0; i < jsonArray.length(); i++){ 
    
             JSONObject jsonObject = jsonArray.getJSONObject(i); 
             String title = jsonObject.getString("title"); 
             int releaseYear = jsonObject.getInt("releaseYear"); 
    
             gameList.add(new GameListItem(releaseDate, "" + releaseYear , R.mipmap.ic_launcher)); 
    
             //this prints all the Titles and Release Dates correctly 
             Log.e("This is a title", title); 
             Log.e("This is a year", "HERE " + releaseYear); 
    
    
    
            } 
    
           } catch(JSONException e){ 
            Log.i("JSON exception", e.toString()); 
            Toast.makeText(MainActivity.this, "JSON ERROR", Toast.LENGTH_LONG).show(); 
           } 
    
           requestQueue.stop(); 
          } 
    
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
    
          Log.d("This is a fucking error", ""+error.getMessage()+","+error.toString()); 
         } 
        }); 
    
    
        MySingleton.getInstance(this).addToRequestQueue(stringRequest); 
    
        adapter = new CustomListAdapter(this, gameList); 
        listView.setAdapter(adapter); 
    
    
    }} 
    

Wie in Hauptaktivität kommentierten, wenn i manuell eine Reihe hinzuzufügen (mit manuelle Daten), die das ListView erstellt und anzeigt, aber der Parser zeigt nichts an. Ich habe unzählige Tutorials überprüft und alles scheint in Ordnung zu sein, ich habe sogar hier nachgeschaut und den meisten der beantworteten habe ich noch nichts gefunden. Kann jemand den Fehler sehen, der dazu führt, dass die Liste nicht erstellt/gedruckt wird?

PS. das Log.e druckt auch (das ist innerhalb des Parsers)

Vielen Dank!

+0

Haben Sie Protokolle? Führt die Anfrage zu Erfolg oder Fehler? Und wenn die Anfrage erfolgreich ist, müssen Sie die Datenänderung an den Adapter melden. In Ihrem Fall adapter.notifyDataSetChanged(); bevor catch blockieren in onResponse. –

+0

Hey, das Ergebnis ist erfolgreich, und du hast mein Problem gelöst, du kannst es als Antwort schreiben und ich werde es akzeptieren. Ich habe eigentlich überall nach der Lösung für den halben Tag gesucht, vielen Dank ...Ich kann dir nicht genug danken! Ich fügte diese Zeile hinzu und das war es! – Prime47

Antwort

1

Wenn die Anfrage erfolgreich ist, müssen Sie die Datenänderung an den Adapter melden. In Ihrem Fall adapter.notifyDataSetChanged(); bevor catch blockieren in onResponse.

1

Fügen Sie die folgende Zeile nach dem requestQueue.stop Aussage:

adapter.notifyDataSetChanged(); 

Zuerst wird, wenn Sie den Adapter gesetzt, die Liste keine Daten hat, weil die Volley Anfrage asynchron gemacht werden, das ist, warum Sie müssen den Adapter wissen lassen, wenn sich seine Daten geändert haben.

Von the documentation:

notifyDataSetChanged()

Benachrichtigt die beigefügten Beobachter, dass die zugrunde liegenden Daten geändert worden ist und eine beliebige Ansicht des Datensatzes zulässt, sollte sich erfrischen.

+1

Vielen Dank ein Haufen, nur um es alle wissen zu lassen, es funktioniert auch nach requestQueue.stop(); – Prime47