我对 android 编程相当陌生,我有一个 Listview,其值被填充到我的代码中,但是每当方向更改或恢复时,列表条目都会被重新填充(导致条目重复)我该如何解决这个问题
5 回答
在这里,根据您的要求,您可以看到一个使用 ViewHolder 作为 ListView 的示例适配器:
public class AllCustomerListCustomAdapter extends SimpleCursorAdapter {
private Cursor c; // Passed in cursor
private Activity context;
public CustomAdapter(Activity context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.c = c;
this.context = context;
c.moveToFirst();
}
static class ViewHolder
{
public TextView rowView1;
public TextView rowView2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View rowView = convertView;
c.moveToPosition(position);
if (rowView == null)
{
LayoutInflater inflater = (context).getLayoutInflater();
rowView = inflater.inflate(R.layout.listview_row, null, true);
holder = new ViewHolder();
holder.rowView1 = (TextView) rowView.findViewById(R.id.txtListItem1);
holder.rowView2 = (TextView) rowView.findViewById(R.id.txtListItem2);
rowView.setTag(holder);
}
else
{
holder = (ViewHolder) rowView.getTag();
}
holder.rowView1.setText(c.getString(c.getColumnIndex(DBAdapter.KEY_VIEW1)));
holder.rowView2.setText(c.getString(c.getColumnIndex(DBAdapter.KEY_VIEW2)));
return rowView;
}
对于您的活动中高于 13 in 的 API,manifest.xml
只需添加android:configChanges="orientation|screenSize"
,对于较低的 API,只需android:configChanges="orientation"
如果您的应用程序以 API 级别 13 或更高级别为目标(由 minSdkVersion 和 targetSdkVersion 属性声明),那么您还应该声明“screenSize”配置,因为当设备在纵向和横向之间切换时它也会发生变化。
您可以使用清单文件上的活动定义中android:configChanges
的值设置属性,以防止在方向更改时重新创建活动。orientation
<Activity
...
...
android:configChanges="orientation"
/>
ListView 有一个用于填充数据的适配器。我想你已经在你的代码中使用了它?因此您必须在将适配器设置为列表视图之前清除适配器中的数据以避免重复项。我有同样的问题,通过使用它解决了......如果你把你的代码也给你提了......
这是 android 中的预期行为,当您更改方向时,它将启动一个新活动您可以使用android:configChanges
列出活动将自行处理的配置更改。当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用此属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并调用其 onConfigurationChanged() 方法。
像这样将它添加到您的manifest.xml
文件中android:configChanges="orientation"