如何使用自定义适配器刷新列表视图

时间:2015-07-05 15:58:56

标签: android listview custom-adapter

从数据库中删除数据后,我需要一些清理listview的解决方案。我意识到我可以通过以下活动功能从数据库中删除数据:

helper.delete(String.valueOf(editID));
adapter.notifyDataSetChanged();
break;

在我的DBHelper中:

public void delete(String id) {
    String[] args = {id};
    getWritableDatabase().delete(TABLE_NAME, "_ID=?", args);
    getWritableDatabase().close();

此代码用于删除数据库和项目,adapter.notifyDataSetChanged();但是listView只在我关闭应用程序时刷新,然后再次打开它。我需要一种如何立即刷新listView的方法。有些人使用adapter.remove(position);,立即刷新,然后拨打.notifyDataSetChanged();。但它不适用于我的自定义适配器。

我使用过这种适配器:

class ListAdapter extends CursorAdapter{
    @SuppressWarnings("deprecation")
    ListAdapter(Cursor c){
        super(MainActivity.this, c);
    }

    @Override
    public void bindView(View row, Context ctxt, Cursor c) {
        // TODO Auto-generated method stub
        ListHolder holder = (ListHolder)row.getTag();
        holder.populateFrom(c, helper);         
    }

    @Override
    public View newView(Context ctxt, Cursor c, ViewGroup parent) {
        // TODO Auto-generated method stub
        LayoutInflater inflater = getLayoutInflater();
        View row = inflater.inflate(R.layout.custom_listview, parent, false);
        ListHolder holder = new ListHolder(row);
        row.setTag(holder);
        return (row);
    }       
}

static class ListHolder {
    private TextView nama = null, kategori=null;
    private ImageView icon=null;
    private View row = null;

    ListHolder(View row){
        this.row=row;

        nama=(TextView)row.findViewById(R.id.main_title_name);
        kategori=(TextView)row.findViewById(R.id.sub_title_name);
        icon=(ImageView)row.findViewById(R.id.thumbnail);
    }

    void populateFrom(Cursor c, DBHelper helper){
        nama.setText(helper.getNamaLok(c));
        kategori.setText(helper.getKatgLok(c));

        byte[] byteArray = helper.getImglok(c);
        Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length);
        icon.setImageBitmap(bm);

    }               
}

抱歉我的英语不好,而且...... 希望有办法解决这个问题..提前谢谢。

1 个答案:

答案 0 :(得分:0)

您需要以正确的方式使用.notifyDataSetChanged();。 请记住,方法.notifyDataSetChanged()表示适配器数据已更改且您需要刷新

  

通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。

所以你需要做的就是更改数据集然后notify更改为适配器。 对于CussorAdapter,数据集为cursor,因此您应该将光标更改为以下方式:

  1. requery()更新光标
  2. 使用changeCursor(Cursor cursor)更改为新光标。
  3. 也许this Link会对您有所帮助。