android - 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);
谢谢。
解决方案
我不建议您按照您的方式进行 REST API 调用,这很容易出错,我建议您检查一下改造: https ://square.github.io/retrofit/
您的代码存在各种问题:
在对 API 的调用完成之前,您正在创建适配器并分配数据。
您正在为您的titlesArray 的每次迭代创建字符串列表
您没有通知适配器列表已更改。
不要在您的响应中使用 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(); 刷新适配器数据。
推荐阅读
- json - org.springframework.http.converter.HttpMessageNotWritableException:没有找到类型的返回值的转换器:类 org.json.JSONObject
- r - 查找受限制的函数的最大参数
- c++ - 使用指针修改数组元素
- c# - 软物体的实时网格变形
- macos - 外壳:执行“查找”时不要索引文件夹图标/跳过空文件夹
- c - 为什么将 SX1272 的每个 SPI 寄存器与 0x80 或
- jquery - 如何在 Vue 笑话测试中等待引导模式动画完成
- r - 如何测试由“warnings()”产生的特定警告?
- javascript - 有没有办法使用 Python 从“网站按钮单击”下载 csv 文件?
- python - 如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?