![](/img/trans.png)
[英]No Adapter Attached Skipping layout error with RecyclerView Adapter
[英]Error: recyclerview No adapter attached; skipping layout | when try to feth data
我收到錯誤消息:recyclerview 沒有附加適配器; 當我嘗試獲取數據並存儲到 recyclerview 時跳過布局
這是我的代碼:
公共 class MainActivity 擴展 AppCompatActivity {
private DataAdapter dataAdapter;
private ArrayList<OrderListArray> orderListArrays=new ArrayList<>();
private RecyclerView mRecyclerView;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
mProgressBar=(ProgressBar)findViewById(R.id.progress_bar);
mProgressBar.setVisibility(View.VISIBLE);
mRecyclerView=(RecyclerView)findViewById(R.id.order_list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
public void getData(){
String userToken = Preferences.getUserToken(getBaseContext());
Log.d("[DEBUG]", "userToken: " + userToken);
Call<List<OrderListArray>> getDataCall = ApiClient.getUserService().getJson("Bearer " + userToken);
getDataCall.enqueue(new Callback<List<OrderListArray>>() {
@Override
public void onResponse(Call<List<OrderListArray>> call, Response<List<OrderListArray>> response) {
mProgressBar.setVisibility(View.GONE);
if (response.isSuccessful() && response.body()!=null) {
orderListArrays = new ArrayList<>(response.body());
dataAdapter=new DataAdapter(orderListArrays,MainActivity.this);
mRecyclerView.setAdapter(dataAdapter);
}
}
@Override
public void onFailure(Call<List<OrderListArray>> call, Throwable t) {
mProgressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"Failure",Toast.LENGTH_SHORT).show();
}
});
}
}
使用此代碼:
public class MainActivity extends AppCompatActivity {
private DataAdapter dataAdapter;
private ArrayList<OrderListArray> orderListArrays=new ArrayList<>();
private RecyclerView mRecyclerView;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
mProgressBar=(ProgressBar)findViewById(R.id.progress_bar);
mProgressBar.setVisibility(View.VISIBLE);
mRecyclerView=(RecyclerView)findViewById(R.id.order_list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//change here
dataAdapter=new DataAdapter(orderListArrays,this);
mRecyclerView.setAdapter(dataAdapter);
}
public void getData(){
String userToken = Preferences.getUserToken(getBaseContext());
Log.d("[DEBUG]", "userToken: " + userToken);
Call<List<OrderListArray>> getDataCall = ApiClient.getUserService().getJson("Bearer " + userToken);
getDataCall.enqueue(new Callback<List<OrderListArray>>() {
@Override
public void onResponse(Call<List<OrderListArray>> call, Response<List<OrderListArray>> response) {
mProgressBar.setVisibility(View.GONE);
if (response.isSuccessful() && response.body()!=null) {
orderListArrays = new ArrayList<>(response.body());
//change here
dataAdapter.notifyDataSetChanged()
}
}
@Override
public void onFailure(Call<List<OrderListArray>> call, Throwable t) {
mProgressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,"Failure",Toast.LENGTH_SHORT).show();
}
});
}
}
我猜是因為你有一些操作必須在主線程中運行,但是你在后台線程中編寫代碼(onResponse方法),為了解決這個問題,你可以創建一個接口回調,並在onResponse中調用你的回調方法和在主線程中更新您的 UI。
public interface MyCallBack {
void onGetResponse(Object response);
}
讓您的 MainActivity 從 MyCallBack 實施
public class MainActivity extends AppCompatActivity implements MyCallBack
在您的活動中創建一個這樣的字段
public class MainActivity extends AppCompatActivity implements MyCallBack {
private MyCallback myCallback;
並在您的主要活動的 onCreate 中初始化它
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myCallback = this;
setContentView(R.layout.activity_main);
在您的 onResponse 中執行以下操作:
public void onResponse(Call<List<OrderListArray>> call, Response<List<OrderListArray>> response) {
if (response.isSuccessful() && response.body()!=null) {
myCallback.onGetResponse(response.body());
}
}
onGetResponse 方法更新你的用戶界面:
@Override
public void onGetResponse(Object response) {
mProgressBar.setVisibility(View.GONE);
orderListArrays = new ArrayList<>(response.body());
dataAdapter=new DataAdapter(orderListArrays,MainActivity.this);
mRecyclerView.setAdapter(dataAdapter);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.