我正在从公共来源解析JSON数组,并将其插入自定义ListView中。我有四节课;


MySingleton排球请求

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;
}}

GameListItem

公共类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;
}}

CustomListAdapter

公共类CustomListAdapter扩展BaseAdapter {

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;
}}

主要活动

公共类MainActivity扩展了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 an error", ""+error.getMessage()+","+error.toString());
        }
    });


    MySingleton.getInstance(this).addToRequestQueue(stringRequest);

    adapter = new CustomListAdapter(this, gameList);
    listView.setAdapter(adapter);


}}



如主要活动中所述,当我手动添加一行(包含手动数据)时,ListView会生成并显示,但解析器未显示任何内容。
我检查了无数的教程,一切似乎井井有条,我什至在这里看了看,并遵循了大部分的答案,但我什么都没发现。
有人可以看到导致列表无法构建/打印的错误吗?

PS。 Log.e也将打印(位于解析器内部)

谢谢!

最佳答案

如果请求成功,则必须将数据更改通知适配器。在您的情况下adapter.notifyDataSetChanged();在onResponse中的catch块之前。

10-07 19:20
查看更多