【问题标题】:How to retain content in listview after changing fragment更改片段后如何在列表视图中保留内容
【发布时间】:2017-08-29 15:06:57
【问题描述】:

当我的 android 应用更改片段或将设备位置更改为横向时,我遇到了问题。列表视图中的内容将销毁/删除。我已经阅读了一些关于它的信息,我需要将列表视图的内容/数据保存在“onSaveInstanceState”下,并在片段被重新创建时使用“onCreate”将这些保存的内容/数据放回列表视图中。但我不确定在“onSaveInstnceState”部分下输入什么。请帮我解决这个问题。据我所知,有人说这很容易克服,但对我来说,这似乎是一堵巨大的墙。

下面是代码。部分内容已更改。

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;
    }
}

【问题讨论】:

标签: android listview android-fragments


【解决方案1】:

问题是当你回到Fragment 时,onCreateView() 会调用。所以一切都可能出错。我通过以下步骤解决了这个问题:

  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

    } 
}

【讨论】:

  • 感谢您的回复。我应该添加的代码如下? if (rootView != null) return rootView;
  • 是的,并将 rootView 的声明放在 onCreateView() 之外。因此,它将被保存。让我知道它是否有效。
  • 我已经尝试了你的代码。当我在片段之间切换时,列表视图不会被破坏,但是当我检查设备更改为横向时,它会被破坏
  • 是的,如果它保持在一个方向上它可以工作,但如果它改变了列表视图,则会重新创建
  • 看看这个,我想你会得到答案,如果它完成了标记我的答案。 stackoverflow.com/questions/10634854/….
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多