簡體   English   中英

錯誤:recyclerview 沒有附加適配器; 跳過布局 | 當嘗試獲取數據時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM