从 Android 中的 ListView 获取更新的数据
Posted
技术标签:
【中文标题】从 Android 中的 ListView 获取更新的数据【英文标题】:Fetch updated data from ListView in Android 【发布时间】:2013-09-13 19:17:51 【问题描述】:在 MainActivity 我有一个 ListView 显示如下:
[复选框] [文本视图] [按钮]
在右上角有一个添加按钮。当我单击该按钮时,它会在列表视图中添加一项。
MyItem item = new MyItem(itemName);
myItemsList.add(item);
adapter.notifyDataSetChanged();
“MyItem”是 pojo 类,“itemName”是 String 值。 “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());
【问题讨论】:
你能把你的代码贴在你在列表视图中显示数据的地方吗.. 你不想显示动态添加的项目 问题在于您的共享偏好。 不。我想在添加它和重新启动应用程序时显示它。 我认为你很不清楚你的目标是什么。将新项目添加到列表视图并重新启动应用程序后,您是否希望新项目仍然存在于列表视图中? 【参考方案1】:您的意思是说下次加载活动时不应显示新添加的项(在您的列表视图中)?
假设以上:- 当您再次加载活动时(onCreate() 被调用),理想情况下,只有您在 ArrayList 中加载的内容才会出现在列表视图中。 因此,请确保每次重新加载您的活动时,您的数组列表也会刷新(或重新加载),并且您不会永久存储任何添加的项目。
【讨论】:
是的@Amit。你说的对。但是,有什么办法可以解决这个问题吗? @Lawrance 你能分享一些用于 itemList 的代码吗?您的代码中是否有任何地方存储此 itemList 数据?你在哪里加载它? @Lawrance 很明显,在 onCreate(...) 中,您正在设置数组列表。所以实际上每当应用程序重新加载时,它不应该显示旧数据(它应该只有“A”、“B”、“C”而不是一些可能新添加的“D”)。当您说重新加载活动/重新启动应用程序时,您确定您的 onCreate(...) 被调用了吗?我现在唯一能想到的就是在 logcat 中显示整个数组,在设置之后查看它是否正确显示“A”、“B”、“C”。【参考方案2】:如果我正确理解您的问题,您指的是更一般的问题 - 保存状态。
有几种方法可以保存您的活动状态:
如果你不需要你的列表状态是持久的,你描述的技术here如果您需要保持列表状态(下次启动应用程序时,您的列表将具有相同的项目),您可以覆盖 onPause 和 onResume 方法,并将数据保存在某种persistent storage 中。见以下代码:
@覆盖 受保护的无效 onPause() 超级.onPause(); // 将 ArrayList 保存到持久存储
@覆盖 受保护的无效 onResume() 超级.onResume(); // 加载你的 ArrayList
为了将 Collection 保存到持久数据中,您应该让您的集合实现 Parcelable 并使用 SharedPreferences,或者使用 SQLite 表...请参阅上面有关持久存储的 android 链接...
【讨论】:
以上是关于从 Android 中的 ListView 获取更新的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从存储在数据库中的 Listview 获取值到另一个活动?使用 Android 和 Mysql
如何在单击android中的listview项目时从数据库中获取id