【问题标题】:retain listview items when user rotate phone and keep all data in ArrayAdapter用户旋转手机时保留列表视图项目并将所有数据保留在 ArrayAdapter
【发布时间】:2014-07-27 17:15:47
【问题描述】:

我有一个带有 Listview 的应用程序,我通过按钮插入新行,但是当我旋转手机时,ListView 内的所有内容都消失了,我试图保留数据并重新创建 ListView,但没有成功。 .. 具有正确数据的数组 userArray,但是当我调用 userAdapter.notifyDataSetChanged(); 时,ListView 没有填充数据...

public class Page1 extends Fragment
{
    ListView userList;
        private ItemsListAdapter userAdapter=null;
        ArrayList<User> userArray = new ArrayList<User>();


        @Override
        public void onSaveInstanceState(Bundle outState) {
            Log.d(TAG, "onSaveInstanceState");
            super.onSaveInstanceState(outState);
            outState.putParcelableArrayList("key_userArray", userArray);
            outState.putParcelable("key_ListView", userList.onSaveInstanceState());

        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (savedInstanceState != null) {
                // Restore last state.
                userArray = savedInstanceState.getParcelableArrayList("key_userArray");  
            }
        }    

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.page1, container, false);
            Log.d(TAG, "onCreateView");  

            appContext = getActivity().getBaseContext();
            appContextDialog = getActivity();
            GappContext = appContext.getApplicationContext();
            dBRicette = new ItemsSave();
            thisFrag = this;
            userList = null;
            userListIng = null;         
            //userAdapter = null;         
            userAdapterIng = null;
            myPref.loadPreference(appContext,MainActivity.DATABASE_INGR, MainActivity.ACCOUNT_PREFS_NAME);  

            init(rootView, savedInstanceState); 

            String myTag = getTag();        
            ((MainActivity)getActivity()).setTabFragPage1(myTag);
            int val = InitListaIngredienti();
            if(val == 0){
            }else
                Toast.makeText(getActivity().getBaseContext(), getResources().getString(R.string.msg_problem_db), Toast.LENGTH_LONG).show();

            return rootView;
        }

       void init(View rootView, Bundle savedInstanceState){
            if(userAdapter == null ){
                if(savedInstanceState == null || !savedInstanceState.containsKey("key_userArray")) {
                    userArray = new ArrayList<User>();
                    //userAdapter = new UserCustomAdapter(getActivity().getBaseContext(), R.layout.row, userArray);
                    userAdapter = new ItemsListAdapter(getActivity().getBaseContext(), userArray);
                    userList = (ListView) rootView.findViewById(R.id.listView);
                        userList.setItemsCanFocus(false);
                        userList.setClickable(true);
                        userList.setLongClickable(true);


                        userList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

                            public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long id) {
                                // TODO Auto-generated method stub
                                RelativeLayout listItem = (RelativeLayout) v;
                                TextView clickedItemView = (TextView) listItem.findViewById(R.id.tv_prodotto);
                                String clickedItemString = clickedItemView.getText().toString();
                                Log.v(TAG,"DisplayListCustom LongClick detected " + clickedItemString + ", position " + Integer.toString(position));
                                if (currentActionMode != null) { 
                                    return false; 
                                }

                                currentListItemIndex = position;//(User)v.getTag();
                                currentActionMode = getActivity().startActionMode(modeCallBack);
                                v.setSelected(true);
                                return true;
                            }
                        }); 

                        //userList.setOnItemSelectedListener(this);
                        userAdapter.notifyDataSetChanged();
                        userList.setAdapter(userAdapter);  
                }else {
                    //recupero i valori
                    mListInstanceState = savedInstanceState.getParcelable("key_ListView");
                    userArray = savedInstanceState.getParcelableArrayList("key_userArray");
                    userAdapter = new ItemsListAdapter(getActivity().getBaseContext(), userArray);
                    userList = (ListView) rootView.findViewById(R.id.listView);
                    userList.onRestoreInstanceState(mListInstanceState);
                    userList.setAdapter(userAdapter);
//                  int size = userArray.size();
//                  for(int i = 0; i < size; i++){
//                      userAdapter.UpdateIng(userArray.get(i).qta, userArray.get(i).name, TotVar);
//                  }
                    userAdapter.notifyDataSetChanged();
                }
            }else        
                userAdapter.notifyDataSetChanged();   


class ItemsListAdapter extends BaseAdapter {

     private LayoutInflater vi;
     private ArrayList<User> data = new ArrayList<User>();
     Context context;
     User tmp = new User();
     NumberFormat numberFormat0  = new DecimalFormat("#0.0");

     public ItemsListAdapter(Context context, /*int layoutResourceId,*/ ArrayList<User> data) {
        super();
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.data = data;
        this.context = context;
     }

     /** Add white line */
     public void addItem(User item) {
        data.add(item);
         notifyDataSetChanged();
     }

     public ArrayList<User> getData() {
        return data;
    }

    public void setData(ArrayList<User> data) {
        this.data = data;
        notifyDataSetChanged();
    }

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

         if (convertView == null) {

            holder = new ViewHolder();
            convertView = vi.inflate(R.layout.row3, parent, false);//null);

            holder.grid = (GridLayout) convertView.findViewById(R.id.GridLayout);
            holder.row = (TextView) convertView.findViewById(R.id.tv_row);
            holder.name = (TextView) convertView.findViewById(R.id.tv_prodotto);
            holder.quantity = (TextView) convertView.findViewById(R.id.tv_qta);
            holder.textPercT = (TextView) convertView.findViewById(R.id.tv_perc_T);
            holder.textPercZ = (TextView) convertView.findViewById(R.id.tv_perc_Z);
            holder.textPercG = (TextView) convertView.findViewById(R.id.tv_perc_G);
            holder.textUm = (TextView) convertView.findViewById(R.id.tv_grm);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }

【问题讨论】:

    标签: android listview


    【解决方案1】:

    发生这种情况是因为 onCreat 在方向更改时被调用,有一种简单的方法可以停止调用 onCreate。

    只需将 configChanges 属性添加到您的 AndroidManifest.xml,如下所示:

    更多信息请参考以下帖子

    Activity restart on rotation Android

    How do I disable orientation change on Android?

    http://developer.android.com/guide/topics/manifest/activity-element.html#config

    【讨论】:

    • 我不想禁用旋转,我已经为横向和纵向模式实现了不同的布局......
    • 它不会禁用旋转它只会阻止活动一次又一次地重新创建 onOrientationChanges
    【解决方案2】:

    onCreateView 的东西太多了。此方法应尽快返回膨胀视图。当您旋转屏幕时,您应该简单地使用您在包中检索到的数据集重新创建适配器,重新创建适配器并在 ListView 的实例上再次调用 setAdapter。活动使用onSavedInstanceState/onRestoreInstanceState 对。正如您所注意到的,Fragment 没有 onRestoreInstancedState。你应该代表它使用onActivityCreated

    【讨论】:

    • 是的,里面的东西太多了,但是怎么分呢?有更好的方法吗?
    • 不,你可能不能。但是您可以使用其他回调来轻量 onCreateView。理想情况下,onCreateView 应该只包含 return 语句。您可以将 onViewCreated 用于其他目的
    • 问题,我认为是ListView的刷新,因为数组和适配器里面有正确的数据,但不显示。 ItemsListAdapter 中的方法 getView 未被调用。我已经用 ItemsListAdapter 的代码编辑了我的问题。
    • 我不知道发生了什么..对不起
    • 我已经调试了程序,并且从Bundle中正确检索了数据,但是在ItemsListAdapter内部的getView()方法内部没有被调用,它只是在旋转之前调用,当一切正常时。
    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2022-10-13
    相关资源
    最近更新 更多