单击列表视图行中的按钮时如何更新使用 CursorAdapter 的 ListView
How to update a ListView that use CursorAdapter when click a button in listview's row
当我单击 "Save" 按钮时,我得到了 EditText 的文本,该文本被保存到数据库,光标 returns 形成数据库,然后显示在列表视图中。所有的保存和获取操作都没有问题。当我单击保存按钮时,列表已动态刷新但是当我单击列表行中的 "Delete" 按钮时,尽管光标已更新,但列表视图不会自行刷新。
我不知道怎么了...
非常感谢您的帮助...
MainActivity 的创建:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DB = new DataBase(this,"CursorDatas",null,1);
ContextWrapper.setContext(getApplicationContext());
editText =(EditText) findViewById(R.id.edittext);
btnSave = (Button)findViewById(R.id.btn_save);
recordsList = (ListView)findViewById(R.id.list);
cursor = DB.getRecords();
listAdapter = new ListAdapter(this,cursor);
recordsList.setAdapter(listAdapter);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = editText.getText().toString();
DB.addRecord(str);
cursor = DB.getRecords();
listAdapter = new ListAdapter(getApplicationContext(),cursor);
recordsList.setAdapter(listAdapter);
}
});
}
我的列表适配器class
public class ListAdapter extends CursorAdapter {
LayoutInflater inf;
ViewHolder vHolder;
DataBase DB;
Cursor cursor;
ListView lW;
ListeAdaptor listAdapter;
Context context;
public ListeAdaptor(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
inf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inf.inflate(R.layout.activity_main, null);
lW = (ListView)v.findViewById(R.id.list);
DB = new DataBase(context,"CursorDatas",null,1);
this.context = context;
}
@Override
public void bindView(View arg0, Context arg1, Cursor arg2) {
// TODO Auto-generated method stub
vHolder = (ViewHolder)arg0.getTag();
vHolder.tV.setText(arg2.getString(arg2.getColumnIndex("Name")));
vHolder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = vHolder.tV.getText().toString();
DB.deleteRecords(isim);
cursor = DB.getRecords();
listAdapter = new ListAdapter(ContextWrapper.getContext(),cursor);
cursor.requery();
listAdapter.notifyDataSetChanged();
lW.setAdapter(listAdapter);
}
});
}
@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
View v = inf.inflate(R.layout.list_item,null);
ViewHolder viewHolder = new ViewHolder(v);
v.setTag(viewHolder);
return v;
}
}
列表Item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="match_parent"
/>
<Button
android:id="@+id/btn_delete"
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_toRightOf="@id/name"
android:layout_toEndOf="@id/name"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:text="Delete"></Button>
对此有一个最佳解决方案,您不必费心更新和重新分配您的适配器并将其一次又一次地设置到您的列表视图。
您应该将 'CursorLoader' 与 CursorAdapter 一起使用,它会自动管理对您的 listview.here 的更新是 link。
http://developer.android.com/reference/android/content/CursorLoader.html
当我单击 "Save" 按钮时,我得到了 EditText 的文本,该文本被保存到数据库,光标 returns 形成数据库,然后显示在列表视图中。所有的保存和获取操作都没有问题。当我单击保存按钮时,列表已动态刷新但是当我单击列表行中的 "Delete" 按钮时,尽管光标已更新,但列表视图不会自行刷新。
我不知道怎么了... 非常感谢您的帮助...
MainActivity 的创建:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DB = new DataBase(this,"CursorDatas",null,1);
ContextWrapper.setContext(getApplicationContext());
editText =(EditText) findViewById(R.id.edittext);
btnSave = (Button)findViewById(R.id.btn_save);
recordsList = (ListView)findViewById(R.id.list);
cursor = DB.getRecords();
listAdapter = new ListAdapter(this,cursor);
recordsList.setAdapter(listAdapter);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = editText.getText().toString();
DB.addRecord(str);
cursor = DB.getRecords();
listAdapter = new ListAdapter(getApplicationContext(),cursor);
recordsList.setAdapter(listAdapter);
}
});
}
我的列表适配器class
public class ListAdapter extends CursorAdapter {
LayoutInflater inf;
ViewHolder vHolder;
DataBase DB;
Cursor cursor;
ListView lW;
ListeAdaptor listAdapter;
Context context;
public ListeAdaptor(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
inf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inf.inflate(R.layout.activity_main, null);
lW = (ListView)v.findViewById(R.id.list);
DB = new DataBase(context,"CursorDatas",null,1);
this.context = context;
}
@Override
public void bindView(View arg0, Context arg1, Cursor arg2) {
// TODO Auto-generated method stub
vHolder = (ViewHolder)arg0.getTag();
vHolder.tV.setText(arg2.getString(arg2.getColumnIndex("Name")));
vHolder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = vHolder.tV.getText().toString();
DB.deleteRecords(isim);
cursor = DB.getRecords();
listAdapter = new ListAdapter(ContextWrapper.getContext(),cursor);
cursor.requery();
listAdapter.notifyDataSetChanged();
lW.setAdapter(listAdapter);
}
});
}
@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
View v = inf.inflate(R.layout.list_item,null);
ViewHolder viewHolder = new ViewHolder(v);
v.setTag(viewHolder);
return v;
}
}
列表Item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="match_parent"
/>
<Button
android:id="@+id/btn_delete"
android:layout_width="80dp"
android:layout_height="50dp"
android:layout_toRightOf="@id/name"
android:layout_toEndOf="@id/name"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:text="Delete"></Button>
对此有一个最佳解决方案,您不必费心更新和重新分配您的适配器并将其一次又一次地设置到您的列表视图。 您应该将 'CursorLoader' 与 CursorAdapter 一起使用,它会自动管理对您的 listview.here 的更新是 link。 http://developer.android.com/reference/android/content/CursorLoader.html