遇到问题的列表视图状态恢复 [英] Having trouble restoring state on listview
问题描述
我有一个应用程序,允许用户选择一个选项,并显示在ListView一定的清单。我在与得到它的保存和恢复状态的问题。我有被取决于哪个选项,用户选择设置list_mode。到目前为止,我已经把它保存在适配器的状态,但恢复它造成的问题(我知道它的节能,因为当我检查在OnCreate它显示的基础上选择正确的项目customAdapter.onRestoreInstanceState(savedInstanceState),但我有一个很难使其恢复到列表视图,它会崩溃的恢复。这在崩溃和getAllItems.clear .addAll我有甚至很难codeD此的名单之一,但它也不能工作。当我发表评论该行出来,然后它崩溃的主要活动。我是当它涉及到Java和Android和我仍然在学习一个小白,我不知道我怎么关闭或关闭多远我。任何人都可以对我有什么洞察做错了,我怎么能得到它的工作?谢谢
表适配器:
公共类ListAdapter延伸BaseAdapter {
私有静态最后弦乐KEY_ADAPTER_STATE =ListAdapter.KEY_ADAPTER_STATE;
公共枚举的listmode {
IMAGES_AND_TEXT,
IMAGES_ONLY,
TEXT_ONLY
}私人的listmode mListMode = ListMode.IMAGES_AND_TEXT;私人的ArrayList<项目> mItems;私人的ArrayList<项目> mImages;私人的ArrayList<项目> mTexts;@覆盖
公众诠释的getCount(){
开关(mListMode){
案例IMAGES_AND_TEXT:
返回mItems == NULL? 0:mItems.size();
案例IMAGES_ONLY:
返回mImages == NULL? 0:mImages.size();
案例TEXT_ONLY:
返回mTexts == NULL? 0:mTexts.size();
}
返回0;
}@覆盖
公共项目的getItem(INT位置){
开关(mListMode){
案例IMAGES_AND_TEXT:
返回mItems == NULL?空:mItems.get(位置);
案例IMAGES_ONLY:
返回mImages == NULL?空:mImages.get(位置);
案例TEXT_ONLY:
返回mTexts == NULL?空:mTexts.get(位置); }
返回null;
}
公众的ArrayList getAllItems(){
开关(mListMode){
案例IMAGES_AND_TEXT:
返回mItems;
案例IMAGES_ONLY:
返回mImages;
案例TEXT_ONLY:
返回mTexts; }
返回null;
}@覆盖
众长getItemId(INT位置){
返回的位置; //没有真正使用
}@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){ 视图V = NULL;
TextView的TN = NULL;
ImageView的IMG = NULL; 如果(convertView == NULL){
LayoutInflater六;
VI = LayoutInflater.from(parent.getContext());
V = vi.inflate(R.layout.list,NULL);
}其他{
V = convertView;
} 项目P =的getItem(位置);
TN =(TextView中)v.findViewById(R.id.tvText);
IMG =(ImageView的)v.findViewById(R.id.thumbnail);
如果(p.getmType()。等于(图像)){
img.setVisibility(View.VISIBLE);
Picasso.with(parent.getContext()).load(p.getmData()).error((R.drawable.placeholder_error)).placeholder(R.drawable.placeholder).resize(90,0).into(img);
tn.setText(ID:+ p.getmID()+\\ n-型:+ p.getmType()+\\ nDate:+ p.getmDate()+\\ nImage网址:+ p.getmData( ));
}其他{
img.setVisibility(View.GONE);
tn.setText(ID:+ p.getmID()+\\ n类型:+ p.getmType()+\\ nDate:+ p.getmDate()+\\ n文字的数据:+ p.getmData( ));
}
返回伏;
}
公共无效setListMode(列表模式列表模式){
mListMode =的listmode;
notifyDataSetChanged();
}公共无效setItems(JSONArray JSONArray),其中抛出JSONException { mItems =新的ArrayList<>();
mImages =新的ArrayList<>();
mTexts =新的ArrayList<>();
的for(int i = 0; I< jsonArray.length();我++){
项目项目=新的项目((JSONObject的)jsonArray.get(一));
mItems.add(项目);
如果(item.getmType()。等于(图像)){
mImages.add(项目);
}
如果(item.getmType()。等于(文本)){
mTexts.add(项目);
}
} notifyDataSetChanged();
}
公共无效的onSaveInstanceState(捆绑savedInstanceState){
savedInstanceState.putParcelableArrayList(list_items,getAllItems());
}公共无效onRestoreInstanceState(捆绑savedInstanceState){
如果(savedInstanceState.containsKey(list_items)){
// ArrayList的<项目>对象= savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
// getAllItems()清()。
//getAllItems().addAll(objects);
//mImages.clear();
//mImages.addAll(objects);
}
}
}
主要活动:
myListView =(ListView控件)findViewById(R.id.listViewID);
customAdapter =新ListAdapter();
如果(savedInstanceState!= NULL){
//当我把一个断点,在这里我看到它得到正确的列表
customAdapter.onRestoreInstanceState(savedInstanceState);
} 如果(savedInstanceState = NULL&放大器;!&安培; savedInstanceState.containsKey(list_items)){
//当我删除.clear和.addAll它然后崩溃在这一行
myListView.onRestoreInstanceState(savedInstanceState.getParcelable(list_items));
myListView.setAdapter(customAdapter);
}
其他{
如果(isNetworkAvailable()){
的getData theJsonData =新的getData();
theJsonData.execute();
}
其他{
Toast.makeText(getApplicationContext(),没有网络连接,Toast.LENGTH_SHORT).show();
tvNoInet.setVisibility(View.VISIBLE);
}
}
@覆盖
公共无效的onSaveInstanceState(捆绑savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
//不知道我应该把这里如果我有什么是正确的
customAdapter.onSaveInstanceState(savedInstanceState);}
//这是code,它设置list_mode当用户选择一个选项
如果(ID == R.id.all){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
myListView.setSelectionAfterHeaderView();
返回true; }
如果(ID == R.id.images){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
myListView.setSelectionAfterHeaderView();
返回true; }
如果(ID == R.id.text){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
myListView.setSelectionAfterHeaderView();
返回true;
}
和我的Item类:
公共类项目实现Parcelable {
私人字符串MID;
私人字符串MTYPE;
私人字符串mDate;
私人字符串MDATA;公共项目(字符串MID,MTYPE字符串,字符串mDate,字符串MDATA){
this.mType = MTYPE;
this.mID = MID;
this.mDate = mDate;
this.mData = MDATA;
}
公共项目(JSONObject的jsonItem)抛出JSONException {
字符串的itemid = NULL;
字符串ITEMTYPE = NULL;
字符串itemDate = NULL;
字符串的ItemData = NULL; 如果(jsonItem.has(ID)){
ITEMID = jsonItem.getString(ID);
}
如果(jsonItem.has(类型)){
ITEMTYPE = jsonItem.getString(类型);
}
如果(jsonItem.has(DATE)){
itemDate = jsonItem.getString(日期);
}
如果(jsonItem.has(数据)){
的ItemData = jsonItem.getString(数据);
}
this.mID = ITEMID;
this.mType = ITEMTYPE;
this.mDate = itemDate;
this.mData =的ItemData;
}
保护项目(宗地中){
的String []数据=新的String [4];
in.readStringArray(数据);
this.mID =数据[0];
this.mType =数据[1];
this.mDate =数据[2];
this.mData =数据[3];}公共静态最后的造物主<项目> CREATOR =新的创造者和LT;项目>(){
@覆盖
公共项目createFromParcel(包裹中){
返回新的项目(在);
} @覆盖
公共项目[] newArray(INT大小){
返回新产品【规格】;
}
};公共字符串getmID(){
返回MID;
}公共字符串getmType(){
返回MTYPE;
}公共字符串getmDate(){
返回mDate;
}公共字符串getmData(){
返回MDATA;
}@覆盖
公共字符串的toString(){
返回{+
ID ='+ MID +'\\''+
类型='+ M型+'\\''+
日期='+ mDate +'\\''+
数据='+ MDATA +'\\''+
};
}@覆盖
公众诠释describeContents(){
返回0;
}@覆盖
公共无效writeToParcel(DEST包裹,INT标志){ 的String []数据=新的String [4];
数据[0] =中;
数据[1] = MTYPE;
数据[2] = mDate;
数据[3] = MDATA;
dest.writeStringArray(数据);
}
}
UPDATE:这是code样子了。当我选择一个特定的列表,然后旋转它的工作画面。它停留在当前选定的名单上。现在的问题是,当他们选择一个新的列表中的设备旋转后ListView控件是完全空白
如果(savedInstanceState!= NULL){
customAdapter.onRestoreInstanceState(savedInstanceState); 如果(savedInstanceState.containsKey(KEY_LIST_VIEW_STATE)){
myListView.onRestoreInstanceState(savedInstanceState.getParcelable(KEY_LIST_VIEW_STATE));
myListView.setAdapter(customAdapter);
} } 其他{
如果(isNetworkAvailable()){
的getData theJsonData =新的getData();
theJsonData.execute();
tvNoInet.setVisibility(View.GONE);
btnRetry.setVisibility(View.GONE);
}其他{
Toast.makeText(getApplicationContext(),没有网络连接,Toast.LENGTH_SHORT).show();
tvNoInet.setVisibility(View.VISIBLE);
btnRetry.setVisibility(View.VISIBLE);
}
}@覆盖
公共无效的onSaveInstanceState(捆绑savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
customAdapter.onSaveInstanceState(savedInstanceState);
savedInstanceState.putParcelable(KEY_LIST_VIEW_STATE,myListView.onSaveInstanceState());
}
和我的更新列表适配器:
私人的listmode mListMode = ListMode.IMAGES_AND_TEXT;私人的ArrayList<项目> mItems =新的ArrayList<>();私人的ArrayList<项目> mImages =新的ArrayList<>();私人的ArrayList<项目> mTexts =新的ArrayList<>(); 公共无效的onSaveInstanceState(捆绑savedInstanceState){
//savedInstanceState.putParcelableArrayList(\"list_items,getAllItems());
savedInstanceState.putParcelableArrayList(KEY_ADAPTER_STATE,getAllItems());
}公共无效onRestoreInstanceState(捆绑savedInstanceState){
如果(savedInstanceState.containsKey(KEY_ADAPTER_STATE)){
ArrayList的<项目>对象= savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
getAllItems()清()。
。getAllItems()的addAll(对象);
//mImages.clear();
//mImages.addAll(objects);
}
}
这是在切换列表中的选项菜单中的code。如果我没有旋转屏幕还没有工作的。当我旋转屏幕,并选择不同的列表列表视图随后空白。如果我选择全部,这应该会显示所有项目那么无论列表我以前如果恢复的所选。所以,如果我只在第一次选择的图像,旋转屏幕的一切是正确的显示出来,如果我旋转屏幕背部和Only或图片只有再次选择文本,该列表为空,如果我选择全部那么无论列表我拿起第一显示时间(仅在这种情况下,图像)
如果(ID == R.id.all){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
myListView.setSelectionAfterHeaderView();
返回true; }
如果(ID == R.id.images){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
myListView.setSelectionAfterHeaderView();
返回true; }
如果(ID == R.id.text){
item.setChecked(真);
customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
myListView.setSelectionAfterHeaderView();
返回true;
}
好吧,既然我把你进入这个烂摊子....:)
我的东西在这样的情况下做的是在保存的实例状态捆绑
来传递给构造函数适配器。既然你做了项目
类 Parcelable
,一切应该很容易。
公共ListAdapter(捆绑savedInstanceState){ 如果(savedInstanceState!= NULL){ INT序= savedInstanceState.getInt(adapter_mode,0);
mListMode = ListMode.values()[序]; ArrayList的<项目>项目=
savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
如果(项目!= NULL){
setItems(项目);
}
}
}
公共无效的onSaveInstanceState(捆绑outState){
outState.putInt(adapter_mode,mListMode.ordinal());
outState.putParcelableArrayList(KEY_ADAPTER_STATE,mItems);
}
因此,与在构造函数保存实例的状态,你并不需要一个明确的方法来恢复适配器的状态。
公共无效setItems(JSONArray JSONArray),其中抛出JSONException { 清单<项目>项目=新的ArrayList<>();
的for(int i = 0; I< jsonArray.length();我++){
items.add(新项目((JSONObject的)jsonArray.get(I)));
}
setItems(项目);
} 私人无效setItems(列表<项目>项目){ 对于(项目项目:项目){
mItems.add(项目);
如果(item.getmType()。等于(图像)){
mImages.add(项目);
}
如果(item.getmType()。等于(文本)){
mTexts.add(项目);
}
} notifyDataSetChanged();
}
I have an app that allows the user to select an option and a certain list is displayed in a listview. I'm having issues with getting it to save and restore state. I have a list_mode that gets set depending on which option the user selects. so far I have it saving the state of the adapter but restoring it is causing an issue ( I know it's saving because when I examine customAdapter.onRestoreInstanceState(savedInstanceState) in the onCreate it's showing the right items based on selection but I'm having a hard time restoring it to the list view. It will crash on restore. It crashes on getAllItems.clear and .addAll. I have even hard coded this to one of the lists but it didn't work either. When I comment that line out then it crashes in the main activity. I'm a noob when it comes to Java and Android and am still learning. I do not know how close or how far off I am. Can anyone provide insight on what I'm doing wrong and how I can get it to work? Thanks
List Adapter:
public class ListAdapter extends BaseAdapter {
private static final String KEY_ADAPTER_STATE = "ListAdapter.KEY_ADAPTER_STATE";
public enum ListMode {
IMAGES_AND_TEXT,
IMAGES_ONLY,
TEXT_ONLY
}
private ListMode mListMode = ListMode.IMAGES_AND_TEXT;
private ArrayList<Item> mItems;
private ArrayList<Item> mImages;
private ArrayList<Item> mTexts;
@Override
public int getCount() {
switch (mListMode) {
case IMAGES_AND_TEXT:
return mItems == null ? 0 : mItems.size();
case IMAGES_ONLY:
return mImages == null ? 0 : mImages.size();
case TEXT_ONLY:
return mTexts == null ? 0 : mTexts.size();
}
return 0;
}
@Override
public Item getItem(int position) {
switch (mListMode) {
case IMAGES_AND_TEXT:
return mItems == null ? null : mItems.get(position);
case IMAGES_ONLY:
return mImages == null ? null : mImages.get(position);
case TEXT_ONLY:
return mTexts == null ? null : mTexts.get(position);
}
return null;
}
public ArrayList getAllItems() {
switch (mListMode) {
case IMAGES_AND_TEXT:
return mItems;
case IMAGES_ONLY:
return mImages;
case TEXT_ONLY:
return mTexts;
}
return null;
}
@Override
public long getItemId(int position) {
return position; // not really used
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = null;
TextView tn = null;
ImageView img = null;
if (convertView == null) {
LayoutInflater vi;
vi = LayoutInflater.from(parent.getContext());
v = vi.inflate(R.layout.list, null);
} else {
v=convertView;
}
Item p = getItem(position);
tn = (TextView) v.findViewById(R.id.tvText);
img = (ImageView) v.findViewById(R.id.thumbnail);
if (p.getmType().equals("image")) {
img.setVisibility(View.VISIBLE);
Picasso.with(parent.getContext()).load(p.getmData()).error((R.drawable.placeholder_error)).placeholder(R.drawable.placeholder).resize(90,0).into(img);
tn.setText("ID: " + p.getmID()+"\nTYPE: " + p.getmType() +"\nDate: " + p.getmDate()+ "\nImage URL: " + p.getmData());
} else {
img.setVisibility(View.GONE);
tn.setText("ID: " + p.getmID()+"\nTYPE: " + p.getmType() +"\nDate: " + p.getmDate()+ "\nText Data: " + p.getmData());
}
return v;
}
public void setListMode(ListMode listMode) {
mListMode = listMode;
notifyDataSetChanged();
}
public void setItems(JSONArray jsonArray) throws JSONException {
mItems = new ArrayList<>();
mImages = new ArrayList<>();
mTexts = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
Item item = new Item((JSONObject) jsonArray.get(i));
mItems.add(item);
if (item.getmType().equals("image")) {
mImages.add(item);
}
if (item.getmType().equals("text")) {
mTexts.add(item);
}
}
notifyDataSetChanged();
}
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putParcelableArrayList("list_items", getAllItems());
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey("list_items")) {
//ArrayList<Item> objects = savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
//getAllItems().clear();
//getAllItems().addAll(objects);
//mImages.clear();
//mImages.addAll(objects);
}
}
}
Main Activity:
myListView = (ListView) findViewById(R.id.listViewID);
customAdapter = new ListAdapter();
if(savedInstanceState!=null) {
//When I put a breakpoint here I see it's getting the correct list
customAdapter.onRestoreInstanceState(savedInstanceState);
}
if (savedInstanceState != null && savedInstanceState.containsKey("list_items")) {
//When I remove the .clear and .addAll it then crashes on this line
myListView.onRestoreInstanceState(savedInstanceState.getParcelable("list_items"));
myListView.setAdapter(customAdapter);
}
else{
if (isNetworkAvailable()) {
getData theJsonData = new getData();
theJsonData.execute();
}
else{
Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_SHORT).show();
tvNoInet.setVisibility(View.VISIBLE);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
//Not sure what I should put here or if what I have is right
customAdapter.onSaveInstanceState(savedInstanceState);
}
//This is the code that sets the list_mode when the user selects an option
if (id == R.id.all) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
myListView.setSelectionAfterHeaderView();
return true;
}
if (id == R.id.images) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
myListView.setSelectionAfterHeaderView();
return true;
}
if (id == R.id.text) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
myListView.setSelectionAfterHeaderView();
return true;
}
And my Item class:
public class Item implements Parcelable{
private String mID;
private String mType;
private String mDate;
private String mData;
public Item(String mID,String mType, String mDate, String mData) {
this.mType = mType;
this.mID = mID;
this.mDate = mDate;
this.mData = mData;
}
public Item(JSONObject jsonItem) throws JSONException {
String itemID=null;
String itemType=null;
String itemDate=null;
String itemData=null;
if (jsonItem.has("id")) {
itemID=jsonItem.getString("id");
}
if (jsonItem.has("type")) {
itemType=jsonItem.getString("type");
}
if (jsonItem.has("date")){
itemDate=jsonItem.getString("date");
}
if (jsonItem.has("data")){
itemData=jsonItem.getString("data");
}
this.mID=itemID;
this.mType=itemType;
this.mDate=itemDate;
this.mData=itemData;
}
protected Item(Parcel in) {
String[] data = new String[4];
in.readStringArray(data);
this.mID = data[0];
this.mType = data[1];
this.mDate = data[2];
this.mData = data[3];
}
public static final Creator<Item> CREATOR = new Creator<Item>() {
@Override
public Item createFromParcel(Parcel in) {
return new Item(in);
}
@Override
public Item[] newArray(int size) {
return new Item[size];
}
};
public String getmID() {
return mID;
}
public String getmType() {
return mType;
}
public String getmDate() {
return mDate;
}
public String getmData() {
return mData;
}
@Override
public String toString() {
return "{" +
"ID='" + mID + '\'' +
", Type='" + mType + '\'' +
", Date='" + mDate + '\'' +
", Data='" + mData + '\'' +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
String[] data = new String[4];
data[0] = mID;
data[1] = mType;
data[2] = mDate;
data[3] = mData;
dest.writeStringArray(data);
}
}
UPDATE: This is what the code looks like now. When I select a certain list and then rotate the screen it's working. It's staying on the currently selected list. Now the issue is when they select a new list after the device has been rotated the listview is completely blank
if(savedInstanceState!=null) {
customAdapter.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey(KEY_LIST_VIEW_STATE)) {
myListView.onRestoreInstanceState(savedInstanceState.getParcelable(KEY_LIST_VIEW_STATE));
myListView.setAdapter(customAdapter);
}
}
else{
if (isNetworkAvailable()) {
getData theJsonData = new getData();
theJsonData.execute();
tvNoInet.setVisibility(View.GONE);
btnRetry.setVisibility(View.GONE);
} else {
Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_SHORT).show();
tvNoInet.setVisibility(View.VISIBLE);
btnRetry.setVisibility(View.VISIBLE);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
customAdapter.onSaveInstanceState(savedInstanceState);
savedInstanceState.putParcelable(KEY_LIST_VIEW_STATE, myListView.onSaveInstanceState());
}
and my updated list adapter:
private ListMode mListMode = ListMode.IMAGES_AND_TEXT;
private ArrayList<Item> mItems= new ArrayList<>();
private ArrayList<Item> mImages= new ArrayList<>();
private ArrayList<Item> mTexts= new ArrayList<>();
public void onSaveInstanceState(Bundle savedInstanceState) {
//savedInstanceState.putParcelableArrayList("list_items", getAllItems());
savedInstanceState.putParcelableArrayList(KEY_ADAPTER_STATE, getAllItems());
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(KEY_ADAPTER_STATE)) {
ArrayList<Item> objects = savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
getAllItems().clear();
getAllItems().addAll(objects);
//mImages.clear();
//mImages.addAll(objects);
}
}
And this is the code in the options menu that switches the list. If I haven't rotated the screen yet this works. When I rotate the screen and select a different list the listview is then blank. If I select "All" which should display All items then whatever list I had selected before if restored. So If I selected Images Only at first, rotate the screen everything is displayed right, if I rotate the screen back and select Text Only or Images Only again, the list is blank, if I select "All" then whatever list I picked the first time (in this case Images Only) is displayed
if (id == R.id.all) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_AND_TEXT);
myListView.setSelectionAfterHeaderView();
return true;
}
if (id == R.id.images) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.IMAGES_ONLY);
myListView.setSelectionAfterHeaderView();
return true;
}
if (id == R.id.text) {
item.setChecked(true);
customAdapter.setListMode(ListAdapter.ListMode.TEXT_ONLY);
myListView.setSelectionAfterHeaderView();
return true;
}
Well, since I got you into this mess.... :)
Something I do in situations like this is to pass in the saved instance state Bundle
to the constructor for the adapter. Since you made your Item
class Parcelable
, everything else should be easy.
public ListAdapter(Bundle savedInstanceState) {
if (savedInstanceState != null) {
int ordinal = savedInstanceState.getInt("adapter_mode", 0);
mListMode = ListMode.values()[ordinal];
ArrayList<Item> items =
savedInstanceState.getParcelableArrayList(KEY_ADAPTER_STATE);
if (items != null) {
setItems(items);
}
}
}
public void onSaveInstanceState(Bundle outState) {
outState.putInt("adapter_mode", mListMode.ordinal());
outState.putParcelableArrayList(KEY_ADAPTER_STATE, mItems);
}
So with the saved instance state in the constructor, you don't need an explicit method to restore the adapter state.
public void setItems(JSONArray jsonArray) throws JSONException {
List<Item> items = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
items.add(new Item((JSONObject) jsonArray.get(i)));
}
setItems(items);
}
private void setItems(List<Item> items) {
for (Item item : items) {
mItems.add(item);
if (item.getmType().equals("image")) {
mImages.add(item);
}
if (item.getmType().equals("text")) {
mTexts.add(item);
}
}
notifyDataSetChanged();
}
这篇关于遇到问题的列表视图状态恢复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!