2017-08-29 84 views
1

當我的android應用程序更改片段或將設備位置更改爲橫向時,我正面臨一個問題。列表視圖中的內容將被刪除或刪除。我已經閱讀了一些關於它的信息,我將需要在「onSaveInstanceState」下保存listview的內容/數據,並在片段重新創建時使用「onCreate」將保存的內容/數據放回到列表視圖中。但我不確定要在「onSaveInstnceState」部分下鍵入什麼內容。請幫助我做到這一點。從我讀到的有些人說這很容易克服,但對我來說,它似乎是一個巨大的壁壘來克服。如何在更改片段後在listview中保留內容

下面是代碼。有些部分已經改變。

public class Tab extends Fragment { 

    ArrayList<ExpaneseModel> beta1; 
    ListView listView; 
    private static ExpansesCustomAdapter adapter; 

    @Override 
    public void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState==null){ 

     }else{ 

     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 


     View rootview = inflater.inflate(R.layout.tab2, container, false); 

     Button Add = (Button)rootview.findViewById(R.id.btnAdd); 

     listView=(ListView)rootview.findViewById(R.id.list); 

     beta1= new ArrayList<>(); 

     listView.setAdapter(adapter); 

     Add.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final Dialog dialogsetting = new Dialog(getActivity()); 
       dialogsetting.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       dialogsetting.setContentView(R.layout.entry_input); 
       final EditText one = (EditText)dialogsetting.findViewById(R.id.et_one); 
       final EditText two = (EditText)dialogsetting.findViewById(R.id.et_two); 
       Button ok = (Button)dialogsetting.findViewById(R.id.btnOK); 
       Button cancel = (Button)dialogsetting.findViewById(R.id.btnCancel); 

       ok.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
      dataModels.add(new ExpaneseModel(one.getText().toString(), two.getText().toString())); 
         adapter.notifyDataSetChanged();      
         dialogsetting.dismiss(); 
        } 
       }); 

       cancel.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialogsetting.dismiss(); 
        } 
       }); 
       dialogsetting.show(); 
      } 

     }); 
     return rootview; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     //I am not sure what code to type in here 

    } } 

下面是ExpaneseModel:

公共類ExpaneseModel {

String one; 
String two; 


public ExpaneseModel(String one, String two) { 
    this.one=one; 
    this.two=two; 

} 

public String getOne() { 
    return one; 
} 

public String getTwo() { 
    return two; 
}} 

下面是自定義適配器類:

public class ExpansesCustomAdapter extends ArrayAdapter<ExpaneseModel> implements View.OnClickListener{ 

    private ArrayList<ExpaneseModel> dataSet; 
    Context mContext; 

    // View lookup cache 
    private static class ViewHolder { 
     TextView txtOne; 
     TextView txtTwo; 
    } 

    public ExpansesCustomAdapter(ArrayList<ExpaneseModel> data, Context context) { 
     super(context, R.layout.expanses_row_item, data); 
     this.dataSet = data; 
     this.mContext=context; 

    } 

    @Override 
    public void onClick(View v) { 

     int position=(Integer) v.getTag(); 
     Object object= getItem(position); 
     ExpaneseModel dataModel=(ExpaneseModel) object; 

    } 

    private int lastPosition = -1; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     ExpaneseModel dataModel = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     ViewHolder viewHolder; // view lookup cache stored in tag 

     final View result; 

     if (convertView == null) { 

      viewHolder = new ViewHolder(); 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.expanses_row_item, parent, false); 
      viewHolder.txtOne = (TextView) convertView.findViewById(R.id.one); 
      viewHolder.txtTwo = (TextView) convertView.findViewById(R.id.two) 

      result=convertView; 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
      result=convertView; 
     } 

     Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); 
     result.startAnimation(animation); 
     lastPosition = position; 

     viewHolder.txtName.setText(dataModel.getName()); 
     viewHolder.txtType.setText(dataModel.getAmount()); 
     viewHolder.info.setOnClickListener(this); 
     viewHolder.info.setTag(position); 
     // Return the completed view to render on screen 
     return convertView; 
    } 
} 
+0

我看不到您在哪裏創建適配器。考慮使arraylist靜態。在改變方向時,活動不必被破壞:[我們如何在任何活動中使用onNewIntent()?](https://stackoverflow.com/questions/8357200/how-we-can-use-onnewintent-in-任何活動)和[活動重新啓動Android](https://stackoverflow.com/questions/456211/activity-restart-on-rotation-android) – RonTLV

回答

0

問題是,當你回FragmentonCreateView()會打電話。所以一切都可能出錯。我通過以下步驟解決此問題:

  1. 保存rootView變量作爲類變量。所以你已經保存了rootView
  2. onCreateView()rootview = inflater.inflate(R.layout.tab2, container, false);之前,檢查rootView是否爲空。如果不是,則返回rootView

這種方式片段不會被重新創建,也不會改變。您的最終代碼應該是這樣的:

public class Tab extends Fragment { 

    ArrayList<ExpaneseModel> beta1; 
    ListView listView; 
    private static ExpansesCustomAdapter adapter; 
    private View rootView; 

    @Override 
    public void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState==null){ 

     }else{ 

     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     if (rootView != null) 
      return rootView; 
     rootview = inflater.inflate(R.layout.tab2, container, false); 

     Button Add = (Button)rootview.findViewById(R.id.btnAdd); 

     listView=(ListView)rootview.findViewById(R.id.list); 

     beta1= new ArrayList<>(); 

     listView.setAdapter(adapter); 

     Add.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final Dialog dialogsetting = new Dialog(getActivity()); 
       dialogsetting.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       dialogsetting.setContentView(R.layout.entry_input); 
       final EditText one = (EditText)dialogsetting.findViewById(R.id.et_one); 
       final EditText two = (EditText)dialogsetting.findViewById(R.id.et_two); 
       Button ok = (Button)dialogsetting.findViewById(R.id.btnOK); 
       Button cancel = (Button)dialogsetting.findViewById(R.id.btnCancel); 

       ok.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
      dataModels.add(new ExpaneseModel(one.getText().toString(), two.getText().toString())); 
         adapter.notifyDataSetChanged();      
         dialogsetting.dismiss(); 
        } 
       }); 

       cancel.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialogsetting.dismiss(); 
        } 
       }); 
       dialogsetting.show(); 
      } 

     }); 
     return rootview; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     //I am not sure what code to type in here 

    } 
} 
+0

感謝您的答覆。 我應該添加的代碼將在下面? if(rootView!= null) return rootView; – GFr33d0m

+0

是的,並把onCreateView()外的rootView聲明。所以,它會被保存。讓我知道它是否有效。 –

+0

我試過你的代碼。當我切換片段之間的listview將不會是破壞性的,但當我檢查設備更改爲景觀,它得到了destory – GFr33d0m

相關問題