0

在 MainActivity 我有一个 ListView 显示如下:

[复选框] [文本视图] [按钮]

在右上角有一个添加按钮。当我单击该按钮时,它会在列表视图中添加一项。

MyItem item = new MyItem(itemName);
myItemsList.add(item);
adapter.notifyDataSetChanged();

“MyItem”是 pojo 类,“itemName”是字符串值。“myItemList”是 ArrayList。

所以这个项目完美地添加到 ListView 但是当我再次加载活动或重新启动应用程序时,不应显示值。

我怎么解决这个问题?

提前致谢。

编辑

这是 ArrayAdapter getView方法

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    MyItem cell = (MyItem) getItem(position);
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    SharedPreferences sharedPrefs = context.getSharedPreferences(
            "sharedPrefs", Context.MODE_PRIVATE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.listitem, null);
        holder = new ViewHolder();
        holder.txtItemName = (TextView) convertView
                .findViewById(R.id.tvItemName);
        holder.chkItem = (CheckBox) convertView.findViewById(R.id.chkItem);
        holder.chkItem
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        int getPosition = (Integer) buttonView.getTag();
                        // Here we get the position that we have set for the
                        // checkbox using setTag.
                        itemList.get(getPosition).setSelected(
                                buttonView.isChecked());
                        editor.putBoolean("CheckValue" + getPosition,
                                buttonView.isChecked());
                        editor.commit();

                        // Set the value of checkbox to maintain its state.
                    }
                });
        convertView.setTag(holder);
        convertView.setTag(R.id.tvItemName, holder.txtItemName);
        convertView.setTag(R.id.chkItem, holder.chkItem);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    editor = sharedPrefs.edit();
    holder.chkItem.setTag(position); // This line is important.

    holder.txtItemName.setText(itemList.get(position).getName());
    holder.chkItem.setChecked(sharedPrefs.getBoolean("CheckValue"
            + position, false));

    return convertView;

}

编辑

public String[] items = new String[]{"A","B","C"};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lvItemName = (ListView) findViewById(R.id.lvItemName);
    imgAdd = (ImageView) findViewById(R.id.imgAdd);
    myItemsList = new ArrayList<MyItem>();

    for (int i = 0; i < items.length; i++) {
        MyItem item = new MyItem(items[i]);
        myItemsList.add(item);
    }

    adapter = new ItemAdapter(this, R.layout.listitem, myItemsList);
    lvItemName.setAdapter(adapter);
    lvItemName.setOnItemClickListener(this);

    // ImageView Add Click
    imgAdd.setOnClickListener(this);

}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    MyItem planet = adapter.getItem(position);
    planet.toggleChecked();
    ViewHolder viewHolder = (ViewHolder) view.getTag();
    viewHolder.getCheckBox().setChecked(planet.isSelected());

    Log.i("Checked::", "" + viewHolder.getCheckBox().isChecked());

}
4

2 回答 2

0

如果我正确理解您的问题,您指的是更一般的问题 - 保存状态。

有几种方法可以保存您的活动状态:

  • 如果你不需要你的列表状态是持久的,你在这里描述的技术
  • 如果您需要保持列表状态(下次启动应用程序时,您的列表将具有相同的项目),您可以覆盖 onPause 和 onResume 方法,并将数据保存在某种持久存储中。请参见下面的代码:

    @Override protected void onPause(){ super.onPause(); // 将 ArrayList 保存到持久存储 }

    @Override protected void onResume(){ super.onResume(); // 加载你的 ArrayList }

为了将 Collection 保存到持久数据,您应该使您的集合实现Parcelable并使用 SharedPreferences,或者使用 SQLite 表...请参阅上面有关持久存储的 android 链接...

于 2013-09-10T08:02:59.233 回答
0

您的意思是说下次加载活动时不应显示新添加的项目(在您的列表视图中)?

假设上述情况:- 当您再次加载活动时(onCreate() 被调用),理想情况下,只有您在 ArrayList 中加载的内容才会出现在列表视图中。因此,请确保每次重新加载活动时也刷新(或重新加载)您的数组列表,并且您不会永久存储任何添加的项目。

于 2013-09-10T07:32:53.587 回答