首页 > 解决方案 > Volley json 解析在 ListView 中不显示任何内容

问题描述

我想显示来自 themoviedb.org 的电影标题。但是应用程序没有在 ListView 中显示任何内容。这是我的代码:

try{
JsonObjectRequest request = new JSonObjectRequest(Request.Method.Get,url,null,new Response.Listener<JSONObject>(){
@Override
public void onResponse(JSONObject response){
try{
JSONArray titlesArray =response.getJSONArray("results");
for(int i=0;i<titlesArray.length();i++){`
JSONObject inner = titlesArray.getJSONObject(i);
String id=inner.getString("id");
String title =inner.getString("title");
String c= id+title;
arrayListMovies=new ArrayListMovies<>();
arrayListMovies.add(c);
}
RequestQueue requestQueue=Volley.newRequestQueue(this);

requestQueue.add(request);

我在 Volley 函数之外将 arrayadapter 设置为 movieList ListView

moviesList = findViewById(R.id.listViewForMovies);
ArrayAdapter<String> adapter =new ArrayAdapter<String>(getApplicationContext(),android.R.layout.android_simple_list_item1,arrayListMovies);
moviesList.setAdapter(adapter);

谢谢。

标签: android

解决方案


我不建议您按照您的方式进行 REST API 调用,这很容易出错,我建议您检查一下改造: https ://square.github.io/retrofit/

您的代码存在各种问题:

  1. 在对 API 的调用完成之前,您正在创建适配器并分配数据。

  2. 您正在为您的titlesArray 的每次迭代创建字符串列表

  3. 您没有通知适配器列表已更改。

  4. 不要在您的响应中使用 try 块,因为如果您的代码有错误,应用程序崩溃以获取有关此错误的通知将很有用。

    public class Test extends AppCompatActivity {
    private ArrayAdapter<String> myAdapter;
    private ArrayList<String> arrayListMovies = new ArrayList<>();
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        this.myAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.android_simple_list_item1, arrayListMovies);
        this.makeRequest();
    }
    
    public void makeRequest() {
        try {
            JsonObjectRequest request = new JSonObjectRequest(Request.Method.Get, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    JSONArray titlesArray = response.getJSONArray("results");
                    arrayListMovies = new ArrayList<>();
                    for (int i = 0; i < titlesArray.length(); i++) {
                        JSONObject inner = titlesArray.getJSONObject(i);
                        String id = inner.getString("id");
                        String title = inner.getString("title");
                        String c = id + title;
                        arrayListMovies.add(c);
                    }
                    myAdapter.notifyDataSetChanged();
                    RequestQueue requestQueue = Volley.newRequestQueue(this);
                }
            }
        }
    }
    }
    

请注意一些事项:我已将适配器和 arrayListMovies 声明移至类的顶部。我在进行 api 调用之前初始化了适配器。在网络调用的响应中,我创建了一次 arrayListMovies。最后我调用 myAdapter.notifyDataSetChanged(); 刷新适配器数据。


推荐阅读