Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要等待MainActivity中改装请求的答复_Java_Android_Retrofit - Fatal编程技术网

Java 需要等待MainActivity中改装请求的答复

Java 需要等待MainActivity中改装请求的答复,java,android,retrofit,Java,Android,Retrofit,我在为我的数据集字段指定的改装位置返回列表中有请求。我是用回应的方法做的。但MainActivity中循环视图的初始化速度比请求快,并且视图没有显示任何内容。我可以为等待onResponse方法做什么 我在NewsRepository.java类中有这两个方法 private void setNews(){ GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataServic

我在为我的数据集字段指定的改装位置返回列表中有请求。我是用回应的方法做的。但MainActivity中循环视图的初始化速度比请求快,并且视图没有显示任何内容。我可以为等待onResponse方法做什么

我在NewsRepository.java类中有这两个方法

 private void setNews(){
    GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
    Call<ItemsAPI> call = service.getAllItems();
    call.enqueue(new Callback<ItemsAPI>() {
        @Override
        public void onResponse(Call<ItemsAPI> call, Response<ItemsAPI> response) {
            Log.d(TAG, "onResponse");
            items = response.body();
            dataSet = items.getItems();
            Log.d(TAG, dataSet.get(0).getTitle());
        }

        @Override
        public void onFailure(Call<ItemsAPI> call, Throwable t) {
            Log.d(TAG, "onFailure "+ t.getMessage());
        }
    });
}
public MutableLiveData<List<News>> getNews(){
    setNews();
    MutableLiveData<List<News>> data = new MutableLiveData<>();
    data.setValue(dataSet);
    return data;
}
这是MyActivity.java

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private RecyclerView mRecycleView;
private RecycleViewAdapter mAdapter;
private MainActivityViewModel mMainActivityViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecycleView = findViewById(R.id.recyclev_view);

    mMainActivityViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);

    mMainActivityViewModel.init();

    mMainActivityViewModel.getNews().observe((LifecycleOwner) this, new Observer<List<News>>() {
        @Override
        public void onChanged(@Nullable List<News> news) {
            mAdapter.notifyDataSetChanged();
        }
    });

    mMainActivityViewModel.getIsUpdating().observe((LifecycleOwner) this, new Observer<Boolean>() {
        @Override
        public void onChanged(@Nullable Boolean aBoolean) {
            if(aBoolean){
            }
            else{
                mRecycleView.smoothScrollToPosition(mMainActivityViewModel.getNews().getValue().size()-1);
            }
        }
    });

    initRecyclerView();
    Log.d(TAG, "RecycleView is inited");
}

private void initRecyclerView(){
    mAdapter = new RecycleViewAdapter(this, mMainActivityViewModel.getNews().getValue());
    RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this);
    mRecycleView.setLayoutManager(linearLayoutManager);
    mRecycleView.setAdapter(mAdapter);
}

在onResponse中,您应该通知适配器添加以下内容:

        yourAdapter.notifyDataSetChanged();

我认为最好将此代码移到findViewById下面的其他代码之上

initRecyclerView();
Log.d(TAG, "RecycleView is inited");
在此函数中,最好不要使用此构造函数

mAdapter = new RecycleViewAdapter(this, mMainActivityViewModel.getNews().getValue());
改用它(创建此构造函数)

当数据到达时,在适配器中启动此函数

 public void setData( List<News> list) {
    this.list= list
    notifyDataSetChanged()
}
public void setData(列表){
this.list=list
notifyDataSetChanged()
}
所以你的代码是

mMainActivityViewModel.getNews().observe((LifecycleOwner) this, new Observer<List<News>>() {
    @Override
    public void onChanged(@Nullable List<News> news) {
        mAdapter.setData(news)
    }
});
mMainActivityViewModel.getNews().observe((LifecycleOwner)this,new Observer(){
@凌驾
更改后的公共void(@Nullable List news){
mAdapter.setData(新闻)
}
});
恢复时,请致电改装服务, 在响应之后创建一个回调 方法以在Activty类中通知,然后在通知之后 初始化recyclerview


.

我有独立的逻辑,有不同的类:存储库-用于请求和主活动-使用adaptershow进度条,直到您的请求完成并在获得响应时隐藏进度条我有独立的逻辑,我不能只在存储库类中使用进度条,我从API获取数据的地方请确切告诉我您想要什么请先共享您的代码!带有适配器的逻辑位于另一个类中。@flex\u grigorowicz确定发生了什么?@flex\u grigorowicz喂?
 mAdapter = new RecycleViewAdapter(this);
 public void setData( List<News> list) {
    this.list= list
    notifyDataSetChanged()
}
mMainActivityViewModel.getNews().observe((LifecycleOwner) this, new Observer<List<News>>() {
    @Override
    public void onChanged(@Nullable List<News> news) {
        mAdapter.setData(news)
    }
});