问题
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