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