Android 在recyclerview上更改方向期间再次从internet加载数据

Android 在recyclerview上更改方向期间再次从internet加载数据,android,Android,有RecyclerView,在方向更改期间,我希望数据不会再次从internet加载。你是怎么做到的 这是密码 package picodiploma.dicoding.database.picodiploma.dicoding.database.tv; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; import android.provider.Setti

有RecyclerView,在方向更改期间,我希望数据不会再次从internet加载。你是怎么做到的

这是密码

    package picodiploma.dicoding.database.picodiploma.dicoding.database.tv;


import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;

import java.util.ArrayList;
import java.util.List;

import picodiploma.dicoding.database.ApiClient;
import picodiploma.dicoding.database.ApiInterface;
import picodiploma.dicoding.database.R;
import retrofit2.Call;
import retrofit2.Callback;

import static android.view.View.VISIBLE;


/**
 * A simple {@link Fragment} subclass.
 */
public class TvShow extends Fragment  {

    private static RecyclerView recyclerView;
    private static final String API_KEY = "2e08750083b7e21e96e915011d3f8e2d";
    private static final String TAG = TvShow.class.getSimpleName();
    private static ProgressBar progressBar;
    private static List<ResultsItem> resultsTv = new ArrayList<>();
    private static TvShowRecyclerAdapter recyclerAdapter;


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    public TvShow() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_tv_show, container, false);

        recyclerView = view.findViewById(R.id.recycler_tv);
        progressBar = view.findViewById(R.id.progress_bar);

        progressBar.setVisibility(VISIBLE);


        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        getData();

        if (savedInstanceState == null) {
            getData();
        }
        else  {
            resultsTv = savedInstanceState.getParcelableArrayList("tv");
            recyclerAdapter.refill(resultsTv);
        }


        return view;
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putParcelableArrayList("tv", (ArrayList<? extends Parcelable>) resultsTv);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_change_settings){
            Intent mIntent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
            startActivity(mIntent);
        }
        return super.onOptionsItemSelected(item);
    }

    public void getData() {
        ApiInterface apiInterface = ApiClient.getList().create(ApiInterface.class);

        Call<Response> responseCall = apiInterface.getTvList(API_KEY);
        responseCall.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
                resultsTv = response.body().getResults();
                recyclerAdapter = new TvShowRecyclerAdapter(resultsTv, getContext());
                recyclerView.setAdapter(recyclerAdapter);
                recyclerView.setVisibility(VISIBLE);
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onFailure(Call<Response> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
                Log.d(TAG, t.toString());
            }
        });
    }


}
包picodiploma.dicoding.database.picodiploma.dicoding.database.tv;
导入android.content.Intent;
导入android.os.Bundle;
导入android.os.Parcelable;
导入android.provider.Settings;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.support.v4.app.Fragment;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ProgressBar;
导入java.util.ArrayList;
导入java.util.List;
导入picodiploma.dicoding.database.ApiClient;
导入picodiploma.dicoding.database.api接口;
导入picodiploma.dicoding.database.R;
2.电话;;
2.回拨;
导入静态android.view.view.VISIBLE;
/**
*一个简单的{@link Fragment}子类。
*/
公共类电视节目扩展片段{
私有静态RecyclerView RecyclerView;
私有静态最终字符串API_KEY=“2E0875083B7E21E96E915011D3F8E2D”;
私有静态最终字符串标记=TvShow.class.getSimpleName();
私有静态ProgressBar ProgressBar;
私有静态列表resultsTv=new ArrayList();
私人静态TvShowRecyclerAdapter recyclerAdapter;
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
公共电视节目{
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
最终视图=充气机。充气(R.layout.fragment\u tv\u show,容器,假);
recyclerView=view.findViewById(R.id.recycler\u tv);
progressBar=view.findviewbyd(R.id.progress\u-bar);
progressBar.setVisibility(可见);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
getData();
如果(savedInstanceState==null){
getData();
}
否则{
resultsTv=savedInstanceState.getParcelableArrayList(“tv”);
回收器适配器。重新填充(结果TV);
}
返回视图;
}
@凌驾
SAVEInstanceState上的公共无效(@NonNull Bundle outState){

putParcelableArrayList(“tv”)(ArrayList处理此类情况的推荐方法-处理方向变化-无需从网络中重新提取数据,是使用谷歌Android架构组件中的ViewModel

ViewModel
可以如下所示

public class YourViewModel extends ViewModel {

private MutableLiveData<List<ResultsItem>> resultsItem;

public LiveData<List< ResultsItem >> getData() {
    if (resultsItem == null) {
        resultsItem = new MutableLiveData<List<resultsItem>>();
        loadData();
    }
    return resultsItem;
}

private void loadData() {
    // Request your data from network
}
}

。当设备的方向发生变化时,android会创建特定活动或片段的新实例。因此数据将丢失。但您可以覆盖活动/片段的
onSaveInstanceState
方法,然后将数据写入实现
可打包或可序列化接口的捆绑包中
ResultItem
cla在
oncreate
中,您需要检查数据是否可用,否则需要从服务器加载数据。

关于recyclerview的内容如何?是否在此处加载?
model.getData()。观察(此,resultsItem->{
是的。应该初始化回收器视图和适配器,并在
观察
中设置适配器中的数据和
notifyDatasetChanged()
java.util.ArrayList不能强制转换为android.arch.lifecycle.MutableLiveData
尝试将检索到的数据设置为Mutable时,应使用
setValue()
将值设置为MutableLiveData对象
YourViewModel model = ViewModelProviders.of(this).get(YourViewModel.class);
    model.getData().observe(this, resultsItem -> {
        // here you can update UI - passing the list of data
    });