繁体   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