Mar*_*nts 5 android android-listfragment
我有一个listfragment,显示数据库中的列表.除了一件我无法清理的小物品外,我还能正常工作.列表视图看起来像这样.
-----------------------------------------------------
text text text | some more text | delete row button |
-----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我的问题:当用户按下删除行按钮行从数据库中删除,但不会从屏幕上,直到活动被停止并再次启动被删除.
我知道这notifyDataSetChanged()是更新这些列表的首选方法,但它似乎没有做任何事情......无论如何,下面是我notifyDataSetChanged()调用的游标适配器的代码.
public class CalcCursorAdapter extends SimpleCursorAdapter{
private Context mContext;
private ListView mListView;
private int mLayout;
private Cursor mcursor;
protected static class ViewHolder {
protected TextView text;
protected ImageButton button;
private int position;
}
@SuppressWarnings("deprecation")
public CalcCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
{
super(context, layout, c, from, to);
this.mContext = context;
this.mLayout = layout;
this.mcursor = c;
//mListView = .getListView();
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView summary = (TextView)view.findViewById(R.id.calctvPrice);
TextView savings = (TextView)view.findViewById(R.id.calctvSavings);
TextView percentOff = (TextView)view.findViewById(R.id.calctvpercentOff);
summary.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcFinalPrice")));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.calc_list_item, parent, false);
holder.button = (ImageButton) v.findViewById(R.id.qcbtnDelete);
holder.button.setOnClickListener(deleteButton);
holder.position = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));
bindView(v, context, cursor);
v.setTag(holder);
return v;
}
private OnClickListener deleteButton = new OnClickListener() {
@SuppressWarnings("deprecation")
public void onClick(View v){
View view = (View) v.getParent();
ViewHolder holder = (ViewHolder) view.getTag();
int position = holder.position;
DbHelper mDbHelper;
mDbHelper = new DbHelper(mContext);
mDbHelper.open();
mDbHelper.deleteCalc(position);
mDbHelper.close();
String test = Integer.toString(position);
Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show();
notifyDataSetChanged();
//ListView list = getListView();
}
};
public long qcItemId(int position) {
return position;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
更新:
我的适配器中的新按钮代码:
private OnClickListener deleteButton = new OnClickListener() {
@SuppressWarnings("deprecation")
public void onClick(View v){
v.invalidate();
View view = (View) v.getParent();
view.invalidate();
ViewHolder holder = (ViewHolder) view.getTag();
int position = holder.position;
DbHelper mDbHelper;
mDbHelper = new DbHelper(mContext);
mDbHelper.open();
mDbHelper.deleteCalc(position);
mDbHelper.close();
String test = Integer.toString(position);
Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show();
Cursor newCursor = getCursor();
changeCursor(newCursor);
notifyDataSetChanged();
//ListView list = getListView();
}
};
Run Code Online (Sandbox Code Playgroud)
我之前遇到过同样的问题,我不认为在这种情况下notifyDataSetChanged可以帮助你.更改的实际上是您的光标,因此您需要使用自定义适配器上的函数changeCursor重新加载它.这是一个例子:
changeCursor(yourCursor);
notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
以下是我在Fragment类中如何管理它的完整代码:
ImageButton newCat = (ImageButton)categoriesListTitle.findViewById(R.id.new_category);
newCat.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
categoriesDialog.dismiss();
AlertDialog.Builder newCatAlert = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AlertDialogStyle));
newCatAlert.setTitle("New category");
// Set an EditText view to get user input
final EditText newCatET = new EditText(v.getContext());
newCatAlert.setView(newCatET);
newCatAlert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String newCatName = newCatET.getText().toString();
db.addCategory(newCatName);
mAdapter.changeCursor(db.getAllCategoriesByRate(currentRate));//Here I update the cursor used in my adapter
//In your case (you do not use a dialog), you have to add this line I think:
//mAdapter.notifyDataSetChanged();
categoriesDialog.show();
}
});
newCatAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
newCatAlert.show();
}
});
categoriesLV.setAdapter(mAdapter);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4667 次 |
| 最近记录: |