How to retain selected item of Recycler view on changing screen orientation android?

纵饮孤独 提交于 2019-12-10 19:16:01

问题


I want to retain the state of the RecyclerView's selected item whenever the screen orientation changes, but whenever I change the orientation, the selected item does not retain its state.
So I save the position of the selected item and on orientation change in onResume().
I get the position and by using the RecyclerView's getChildAt() method I try to get the View of that item, but it returns null.

I am in serious troubles, please help.

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        SelectedMyPosition= savedInstanceState.getInt("selectedItemPosition");
        check=savedInstanceState.getString("demo");
    }
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    setSupportActionBar(toolbar);

    objectRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
    objectRecyclerView.setHasFixedSize(true);
    objectRecyclerView.setItemAnimator(new DefaultItemAnimator());


    mAdapter = new MyAdapter(TITLES, ICONS, NAME, EMAIL, PROFILE, this,SelectedMyPosition);

    mlayoutmanager = new LinearLayoutManager(this);

    objectRecyclerView.setLayoutManager(mlayoutmanager);
    objectRecyclerView.setAdapter(mAdapter);

 @Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (SelectedMyPosition >= 0) {
        View v=objectRecyclerView.getChildAt(SelectedMyPosition);
        if(v!=null)
        {
            v.setSelected(true);
        }
            View lay=mlayoutmanager.getChildAt(SelectedMyPosition);  
            Toast.makeText(getApplicationContext(), "htrfgrg" + SelectedMyPosition+check+v+lay,
                    Toast.LENGTH_SHORT).show();

    }

}
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stubel
        outState.putInt("selectedItemPosition", SelectedPosition);
        outState.putString("demo", "honey");

        super.onSaveInstanceState(outState);
    }

AdapterClass:

public class MyAdapter extends Adapter<MyAdapter.ViewHolder>  {
    private String[] mTitles;
    private int[] mIcons;
    private String mName;
    private String mEmail;
    private int mProfile;
    private static final int TYPE_ITEM = 1;
    private static final int TYPE_HEADER = 0;
    static Context c;
    int selectedpos;
    ViewGroup mrecycerView;
    View old;
static  int count=0;

    /* View Holder Class Start */


    public class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener  {
        int Holderid;

        TextView textView;
        ImageView imageView;
        ImageView profile;
        TextView Name;
        TextView email;
        Context mcontext;


        public ViewHolder(View itemView, int viewType,Context con) {
            // TODO Auto-generated constructor stub

            super(itemView);
            mcontext=con;

            itemView.setOnClickListener(this);

            if (viewType == TYPE_HEADER) {
                Name = (TextView) itemView.findViewById(R.id.name);
                email = (TextView) itemView.findViewById(R.id.email);
                profile = (ImageView) itemView.findViewById(R.id.circleView);
                Holderid = 0;
            } else if (viewType == TYPE_ITEM) {
                textView = (TextView) itemView.findViewById(R.id.rowText);
                imageView = (ImageView) itemView.findViewById(R.id.rowIcon);
                Holderid = 1;
            }
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if(count>0 && old!=null)
            {

                old.setSelected(false);
            }
            old=v;
            v.setSelected(true);
            count++;
            MainActivity.getPositionOfItem(getLayoutPosition(),v);
            Intent i = new Intent(mcontext.getApplicationContext(),NewActivity.class);

            mcontext.startActivity(i);
            Activity activity = (Activity)mcontext;
            activity.overridePendingTransition(R.anim.pull_in_from_left, R.anim.hold);


            Toast.makeText(MyAdapter.c,"hiji" + getLayoutPosition(), Toast.LENGTH_SHORT).show();
        }
    }

    /* View Holder Class End */
    public MyAdapter(String[] tITLES, int[] iCONS, String nAME, String eMAIL,
            int pROFILE, Context applicationContext,int selectedPos) {
        // TODO Auto-generated constructor stub
        mTitles = tITLES;
        mIcons = iCONS;
        mName = nAME;
        mEmail = eMAIL;
        mProfile = pROFILE;
        c=applicationContext;
        this.selectedpos=selectedPos;
    }

    @Override
    public int getItemCount() {
        // TODO Auto-generated method stub
        return mTitles.length -2;
    }

    @Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        if (position == 0) {
            return TYPE_HEADER;
        } else {
            return TYPE_ITEM;
        }

    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(position==selectedpos)
        {

        }
        if (holder.Holderid == 0) {
            holder.profile.setImageResource(mProfile);
            holder.Name.setText(mName);
            holder.email.setText(mEmail);

        } else if (holder.Holderid == 1) {
            holder.textView.setText(mTitles[position -1 ]);

            holder.imageView.setImageResource(mIcons[position -1 ]);
        }
        // TODO Auto-generated method stub

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // TODO Auto-generated method stub
        mrecycerView=parent;

        if (viewType == TYPE_HEADER) {
        View    v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.header, parent, false);
            ViewHolder vh = new ViewHolder(v, viewType,c);
            return vh;
        } else if (viewType == TYPE_ITEM) {
        View     v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.items_row, parent, false);
            ViewHolder vh = new ViewHolder(v, viewType,c);
            return vh;
        }
        return null;
    }
}

来源:https://stackoverflow.com/questions/29983141/how-to-retain-selected-item-of-recycler-view-on-changing-screen-orientation-andr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!