Java 无法将数据绑定到recyclerView
我使用来自URL的GET请求获取值。当我试图将这些值绑定到RecyclerView中时,我得到一个空值。从getValue方法中,它返回空的'si'值。为什么?Java 无法将数据绑定到recyclerView,java,android,android-recyclerview,okhttp,Java,Android,Android Recyclerview,Okhttp,我使用来自URL的GET请求获取值。当我试图将这些值绑定到RecyclerView中时,我得到一个空值。从getValue方法中,它返回空的'si'值。为什么? public class ShipmentLists extends AppCompatActivity { List < ShipmentInfo > si; RecyclerView recList; @Override protected void onCreate(Bundle s
public class ShipmentLists extends AppCompatActivity {
List < ShipmentInfo > si;
RecyclerView recList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_lists);
si = new ArrayList < > ();
recList = (RecyclerView) findViewById(R.id.cardList);
LinearLayoutManager lim = new LinearLayoutManager(ShipmentLists.this);
lim.setOrientation(LinearLayoutManager.VERTICAL);
recList.setHasFixedSize(true);
recList.setLayoutManager(lim);
ShipmentAdapter sa = new ShipmentAdapter(ShipmentLists.this, getData());
sa.notifyDataSetChanged();
recList.setAdapter(sa);
}
private List < ShipmentInfo > getData() {
String url = "URL HERE";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).header("Accept", "application/json")
.header("Content-Type", "application/json").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
String mMessage = e.getMessage().toString();
Log.w("failure Response", mMessage);
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String mMessage = response.body().string();
try {
final JSONArray myResponse = new JSONArray(mMessage);
for (int i = 0; i < myResponse.length(); i++) {
String receiver = myResponse.getJSONObject(i).getString("receivername");
String address = myResponse.getJSONObject(i).getString("AddressLine1");
String city = myResponse.getJSONObject(i).getString("city");
String phone = myResponse.getJSONObject(i).getString("contactnumber");
String shipmentDate = myResponse.getJSONObject(i).getString("date");
String status = myResponse.getJSONObject(i).getString("status");
si.add(new ShipmentInfo(receiver, address, city, shipmentDate, phone, status));
Log.e("SI DATA", "" + si.size());
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.e("RESULTS ARE", "" + mMessage);
}
});
Log.e("LIST SIZE", "" + si.size());
return si;
}
这是一个很好的例子。这意味着,它将同时在一个单独的线程中执行。因此,si在向其添加响应之前将返回null
看
这给了一些关于异步的想法这是getData方法的错误。当new ShipmentAdapterShipmentList.this时,getData被称为si,即列表为空。是的,我知道。请告诉我如何解决它并获取返回值。最好的做法是使用LiveData,因为它确实是最好的。只需在适配器构造函数中使用列表而不是getData。并使用相同的列表在成功后更新,然后调用notifyDataSetChangedI建议您使用适当的体系结构,如MVVM或类似的东西。Ok。我得到了它。我现在就试试。谢谢
client.newCall(request).enqueue(new Callback()