Синтаксический анализ Volley json ничего не отображает в ListView

#android

Вопрос:

Я хотел бы отобразить названия фильмов из themoviedb.org. Но приложения ничего не отображают в представлении списка. Вот мой код:

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

Запрос.добавить(запрос);

И я устанавливаю arrayadapter в MovieList ListView вне функции Volley

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

Спасибо.

Ответ №1:

Я бы не рекомендовал выполнять вызовы REST API так, как вы это делаете, это может привести к ошибкам, я рекомендую вам проверить возможность модернизации: https://square.github.io/retrofit/

У вас есть различные проблемы с вашим кодом:

  1. Вы создаете адаптер и назначаете данные до завершения вызова API.
  2. Вы создаете список строк на каждой итерации вашего массива заголовков
  3. Вы не уведомляете адаптер об изменении списка.
  4. Не используйте блок «Попробовать» в своем ответе, потому что в случае возникновения ошибок в вашем коде будет полезно, чтобы приложение вышло из строя, чтобы получать уведомления об этих ошибках.
     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);
                }
            }
        }
    }
    }
     

Обратите внимание на некоторые вещи: Я переместил объявления adapter и arrayListMovies в начало класса.
Я инициализирую адаптер перед вызовом api.
В ответ на сетевой вызов я создаю arrayListMovies ОДИН РАЗ.
В конце я вызываю MyAdapter.notifyDataSetChanged(); для обновления данных адаптера.