Java Android RecyclerView是';t轮着恢复

Java Android RecyclerView是';t轮着恢复,java,android,rotation,android-recyclerview,android-cardview,Java,Android,Rotation,Android Recyclerview,Android Cardview,当我旋转我的应用程序时,内容消失了,我有一个RecyclerView,其中有一个卡片列表,可以使用JSON和webservice从外部数据库获取内容。我正在尝试以以下方式保存内容: @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if(items != null) { outSta

当我旋转我的应用程序时,内容消失了,我有一个
RecyclerView
,其中有一个卡片列表,可以使用JSON和webservice从外部数据库获取内容。我正在尝试以以下方式保存内容:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if(items != null) {
            outState.putParcelableArrayList("ITEMS", items);
            items = null;
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (items == null) {
            items = savedInstanceState.getParcelableArrayList("ITEMS");
            recycler.setAdapter(adapter);
        }
    }
但同样的问题仍然存在

我的
MainActivity.java
文件:

public class MainActivity extends AppCompatActivity {

    DrawerLayout drawerLayout;
    Toolbar toolbar;
    ActionBar actionBar;
    Intent intent;

    private SQLiteHandler db;
    private SessionManager session;

    private RecyclerView recycler;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager lManager;

    private ProgressDialog pDialog;

    JSONParser jParser;

    private static final String TAG_SUCCESS = "success";
    private static final String TAG_RECIPES = "recipes";
    private static final String TAG_RECIPE_ID = "recipe_id";
    private static final String TAG_NAME = "name";
    private static final String TAG_USERNAME = "username";
    private static final String TAG_PHOTO = "photo";

    ArrayList<Recipe> items;

    HashMap<String, String> user;

    String uns;

    TextView usernamesessionTV;

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

        //uns = session.getUsername();

        Intent i = getIntent();
        if (i.hasExtra("user")) {
            Bundle bd = getIntent().getExtras();
            if (!bd.getString("user").equals(null) || bd.getString("user").trim().length() > 0) {
                uns = bd.getString("user");
            }
        }

        usernamesessionTV = (TextView) findViewById(R.id.navigation_view).findViewById(R.id.usernameSession);

        items = new ArrayList<>();

        new LoadAllRecipes().execute();

        recycler = (RecyclerView) findViewById(R.id.recycler);
        recycler.setHasFixedSize(true);

        lManager = new LinearLayoutManager(this);
        recycler.setLayoutManager(lManager);


        adapter = new RecipeAdapter(this, items);
        recycler.setAdapter(adapter);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NewRecipe.class);
                intent.putExtra("usersession", (String)uns);
                startActivity(intent);
            }
        });

        actionBar = getSupportActionBar();
        actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
        actionBar.setDisplayHomeAsUpEnabled(true);

        drawerLayout = (DrawerLayout) findViewById(R.id.navigation_drawer_layout);

        NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);

        TextView usersession = (TextView) findViewById(R.id.navigation_view).findViewById(R.id.usernameSession);
        usersession.setText(uns);


        if (navigationView != null) {
            setupNavigationDrawerContent(navigationView);
            View header = (View) getLayoutInflater().inflate(R.layout.navigation_drawer_header, null);
            usernamesessionTV.setText(uns);
        }

        setupNavigationDrawerContent(navigationView);

        adapter.notifyDataSetChanged();

        db = new SQLiteHandler(getApplicationContext());

        session = new SessionManager(getApplicationContext());

        if (!session.isLoggedIn()) {
            logoutUser();
        }

        user = db.getUserDetails();

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if(items != null) {
            outState.putParcelableArrayList("ITEMS", items);
            items = null;
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (items == null) {
            items = savedInstanceState.getParcelableArrayList("ITEMS");
            recycler.setAdapter(adapter);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                drawerLayout.openDrawer(GravityCompat.START);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void setupNavigationDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        switch (menuItem.getItemId()) {
                            case R.id.item_navigation_drawer_allrecipes:
                                menuItem.setChecked(true);
                                drawerLayout.closeDrawer(GravityCompat.START);
                                intent = new Intent(MainActivity.this, MainActivity.class);
                                intent.putExtra("usersession", (String)uns);
                                startActivity(intent);
                                return true;
                            case R.id.item_navigation_drawer_myrecipes:
                                menuItem.setChecked(true);
                                drawerLayout.closeDrawer(GravityCompat.START);
                                intent = new Intent(MainActivity.this, MyRecipes.class);
                                intent.putExtra("usersession", (String)uns);
                                startActivity(intent);
                                return true;
                            case R.id.item_navigation_drawer_logout:
                                menuItem.setChecked(true);
                                drawerLayout.closeDrawer(GravityCompat.START);
                                logoutUser();
                                return true;
                        }
                        return true;
                    }
                });
    }

    public static Drawable LoadImageFromWebOperations(String url) {
        try {
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        } catch (Exception e) {
            return null;
        }
    }

    private void logoutUser() {
        session.setLogin(false);

        db.deleteUsers();

        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }

    class LoadAllRecipes extends AsyncTask<String, String, String> {

        /**
         * Muestra Progress Dialog mientras carga.
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if (pDialog != null) {
                pDialog = null;
            }
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage(getResources().getString(R.string.loadingRecipes));
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * Obtiene todas las recetas desde una URL
         */
        protected String doInBackground(String... args) {
            // Construye los parámetros a enviar
            List<NameValuePair> params = new ArrayList<NameValuePair>();

            JSONArray recipes = new JSONArray();
            // Obtiene un JSON string desde la URL
            jParser = new JSONParser();
            JSONObject json = jParser.makeHttpRequest(AppConfig.URL_GET_ALL_RECIPES, "GET", params);

            Log.d("All recipes: ", json.toString());

            try {
                // Comprueba si devolvió SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // recetas encontradas
                    // Obtiene array de recetas
                    recipes = json.getJSONArray(TAG_RECIPES);

                    // recorre todas las recetas agregándolas al List
                    for (int i = 0; i < recipes.length(); i++) {
                        JSONObject c = recipes.getJSONObject(i);
                        items.add(new Recipe(c.getInt(TAG_RECIPE_ID), c.getString(TAG_PHOTO), c.getString(TAG_NAME), c.getString(TAG_USERNAME)));
                    }
                    pDialog.dismiss();
                } else {
                    // no se han encontrado recetas
                    Intent i = new Intent(getApplicationContext(), NewRecipe.class);
                    // Cierra todas las activities previas
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

    }
}
public类MainActivity扩展了AppCompatActivity{
抽屉布局抽屉布局;
工具栏;
ActionBar ActionBar;
意图;
私有SQLiteHandler数据库;
私人会话管理器会话;
私人废物回收公司;
专用循环视图适配器;
private RecyclerView.LayoutManager lManager;
私人对话;
JSONParser-jParser;
私有静态最终字符串标记_SUCCESS=“SUCCESS”;
私有静态最终字符串标记_RECIPES=“RECIPES”;
私有静态最终字符串标记\u RECIPE\u ID=“RECIPE\u ID”;
私有静态最终字符串标记_NAME=“NAME”;
私有静态最终字符串标记\u USERNAME=“USERNAME”;
私有静态最终字符串标记_PHOTO=“PHOTO”;
数组列表项;
HashMap用户;
字符串uns;
TextView用户名会话电视;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//uns=session.getUsername();
Intent i=getIntent();
如果(i.hasExtra(“用户”)){
Bundle bd=getIntent().getExtras();
如果(!bd.getString(“用户”).equals(null)| | bd.getString(“用户”).trim().length()>0){
uns=bd.getString(“用户”);
}
}
usernamesessionTV=(TextView)findviewbyd(R.id.navigation\u视图)。findviewbyd(R.id.usernameSession);
items=newarraylist();
新建LoadAllRecipes().execute();
recycler=(RecyclerView)findViewById(R.id.recycler);
回收商。setHasFixedSize(真);
L经理=新的直线布局经理(本);
回收商。setLayoutManager(lManager);
适配器=新的RecipeAdapter(此,项);
回收器。设置适配器(适配器);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
findviewbyd(R.id.fab).setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
意向意向=新意向(MainActivity.this、NewRecipe.class);
intent.putExtra(“用户会话”,“字符串”uns);
星触觉(意向);
}
});
actionBar=getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.ic\u菜单\u白色\u 24dp);
actionBar.setDisplayHomeAsUpEnabled(true);
抽屉布局=(抽屉布局)findViewById(R.id.navigation\u抽屉布局);
NavigationView NavigationView=(NavigationView)findViewById(R.id.navigation\u视图);
TextView用户会话=(TextView)findViewById(R.id.navigation_view).findViewById(R.id.usernameSession);
usersession.setText(uns);
if(navigationView!=null){
setupNavigationDrawerContent(navigationView);
视图标题=(视图)GetLayoutFlater()。充气(R.layout.navigation\u drawer\u标题,空);
usernamesessionTV.setText(uns);
}
setupNavigationDrawerContent(navigationView);
adapter.notifyDataSetChanged();
db=新的SQLiteHandler(getApplicationContext());
session=newsessionmanager(getApplicationContext());
如果(!session.isLoggedIn()){
logoutUser();
}
user=db.getUserDetails();
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
如果(项!=null){
outState.putParcelableArrayList(“项目”,项目);
items=null;
}
}
@凌驾
RestoreInstanceState上的受保护无效(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
if(items==null){
items=savedInstanceState.getParcelableArrayList(“items”);
回收器。设置适配器(适配器);
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例android.R.id.home:
抽屉布局。打开抽屉(重力compat.START);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
私有无效设置NavigationDrawerContent(NavigationView NavigationView){
navigationView.setNavigationItemSelectedListener(
新建NavigationView.OnNavigationItemSelectedListener(){
@凌驾
公共布尔值onNavigationItemSelected(MenuItem MenuItem){
开关(menuItem.getItemId()){
案例R.id.项目\导航\抽屉\所有配方:
menuItem.setChecked(true);
抽屉布局。关闭抽屉(重力公司启动);
意图=新意图(MainActivity.this、MainActivity.class);
intent.putExtra(“用户会话”,“字符串”uns);
星触觉(意向);
返回true;
案例R.id.项目\导航\抽屉\我的食谱:
menuItem.setChecked(true);
抽屉布局。关闭抽屉(重力公司启动);
意图=新意图(MainActivity.this、MyRecipes.class);
intent.putExtra(“用户会话”,“字符串”uns);
星触觉(意向);
返回true;
案例R.id.项目\导航\抽屉\注销:
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.RecipeViewHolder> {

    private ArrayList<Recipe> items;
    private static Context context;
    public View view;

    public static class RecipeViewHolder extends RecyclerView.ViewHolder {
        public int recipe_id;
        public ImageView image;
        public TextView name;
        public TextView userName;
        //public TextView method;
        public TextView username;
        public Recipe currentItem;

        public RecipeViewHolder(View v) {
            super(v);
            v.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    Intent intent = new Intent(context, RecipeActivity.class);
                    intent.putExtra("recipe_id", currentItem.getRecipe_id());
                    context.startActivity(intent);
                }
            });
            image = (ImageView) v.findViewById(R.id.recipeImage);
            name = (TextView) v.findViewById(R.id.recipeName);
            //userName = (TextView) v.findViewById(R.id.userName);
            //method = (TextView) v.findViewById(R.id.recipeMethod);
            username = (TextView) v.findViewById(R.id.username);
        }

        /*@Override
        public void onClick(AdapterViewCompat<?> parent, View view, int position, long id) {
            Intent intent = new Intent(context, RecipeActivity.class);
            context.startActivity(intent);
        }*/

    }

    public RecipeAdapter(Context context, ArrayList<Recipe> items) {
        this.context = context;
        this.items = items;
    }

    private String[] mDataset;

    public RecipeAdapter(String[] dataset) {
        mDataset = dataset;
    }


    public interface OnItemClickListener {
        public void onItemClick(View view , int position);
    }

    @Override
    public RecipeViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recipe_card, viewGroup, false);
        RecipeViewHolder vh = new RecipeViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(RecipeViewHolder viewHolder, int i) {
        viewHolder.recipe_id = items.get(i).getRecipe_id();
        //viewHolder.image.setImageResource(items.get(i).getImage());
        new DownloadImageTask((ImageView) viewHolder.image).execute(items.get(i).getImage());
        viewHolder.name.setText(items.get(i).getName());
        viewHolder.username.setText(context.getResources().getString(R.string.userTag)+" "+String.valueOf(items.get(i).getUsername()));
        viewHolder.currentItem = items.get(i);
    }

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap imageBM = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                imageBM = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return imageBM;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }

    @Override
    public int getItemCount() {

        return items.size();
    }
}


Recipe.java:

public class Recipe implements Parcelable {
    private int recipe_id;
    private String image;
    private String name;
    private String username;
    private String method;

    public Recipe(int recipe_id, String imagen, String name, String username) {
        this.recipe_id = recipe_id;
        this.image = imagen;
        this.name = name;
        this.username = username;
        this.method = method;
    }

    public int getRecipe_id() {

        return recipe_id;
    }

    public String getName() {

        return name;
    }

    public String getUsername() {

        return username;
    }

    public String getMethod() {
        return method;
    }

    public String getImage() {

        return image;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeString(method);
        parcel.writeString(username);
        parcel.writeString(image);
    }
}