我正在使用Reform向API发出GET请求,我的应用程序在我获得响应时成功地发出了请求,但我想将该响应显示到ListView中,但该响应没有显示在ListView中。我的代码如下:
MainActivity.java:-
public class MainActivity extends AppCompatActivity {
ListView myListView;
List<Todo> myArrayList = new ArrayList<Todo>();
ArrayAdapter<Todo> myArrayAdapter;
private static final String TAG = "MainActivity";
ApiInterface apiInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myArrayAdapter = new ArrayAdapter<Todo>(MainActivity.this , android.R.layout.simple_list_item_1 , myArrayList);
myListView = (ListView) findViewById(R.id.myListView);
myListView.setAdapter(myArrayAdapter);
apiInterface = ApiClient.getClient().create(ApiInterface.class);
}
public void getTodo(View view) {
Call<List<Todo>> getCall = apiInterface.getTodo();
getCall.enqueue(new Callback<List<Todo>>() {
@Override
public void onResponse(Call<List<Todo>> call, Response<List<Todo>> response) {
Log.e(TAG , "onResponse : "+response.body());
myArrayList = response.body();
myArrayAdapter.notifyDataSetChanged();
// Log.e(TAG , "arraylist : "+myArrayList); // This Log is printing data in arraylist which means myArrayList contains data.
}
@Override
public void onFailure(Call<List<Todo>> call, Throwable t) {
Log.e(TAG , "onFailure : "+t.getLocalizedMessage());
}
});
}
}
我的Todo.java类如下:
Todo.java:-
public class Todo {
private String _id;
private String name;
private String added_date;
private int __v;
public Todo(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Todo{" +
"_id='" + _id + ''' +
", name='" + name + ''' +
", added_date='" + added_date + ''' +
", __v=" + __v +
'}';
}
}
样本响应如下:
onResponse : [Todo{_id='5f9140a5827320001796726f', name='Attend Meeting',
added_date='2021-04-30T08:19:49.400Z', __v=0}]
将myArrayList = response.body();
更改为myArrayList.addAll(response.body());
并将您的toString更新为类似的内容
@Override
public String toString() {
return name;
}
这样,您的ListView看起来很整洁,而不是一个大的令人困惑的String。
我没有看到您在任何地方使用收到的数据。将空列表myArrayList
传递给适配器构造函数。
myArrayAdapter = new ArrayAdapter<Todo>(MainActivity.this , android.R.layout.simple_list_item_1 , myArrayList);
当您从API获取数据时,只需将其分配给列表,而不将其传递给适配器。移动代码的这一部分
myArrayAdapter = new ArrayAdapter<Todo>(MainActivity.this , android.R.layout.simple_list_item_1 , myArrayList); myListView.setAdapter(myArrayAdapter);
对于on response方法,在将数据分配给列表后,或将方法添加到适配器中,适配器可以更新列表,然后调用myArrayAdapter.notifyDataSetChanged();