ListView不刷新

时间:2013-05-22 16:20:19

标签: android listview adapter

我的Custom ListView包含一些Views。当我点击一个名为'deleteRow'的ImageView时,应该从Database以及ListView

中删除所选项目

我已成功从数据库中删除该项,但ListView未刷新,这是我的getView()代码:

public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    if (convertView==null)
    {
        holder=new ViewHolder();
        convertView = inflater.inflate(R.layout.espaceclientuploadsource, null);
        holder.nomduProduit = (TextView)convertView.findViewById(R.id.UploadedProductName);
        holder.prixDuProduit = (TextView)convertView.findViewById(R.id.UplodedProductPrice);
        holder.imageDuProduit = (ImageView)convertView.findViewById(R.id.Uplodimage);
        holder.status = (ImageView)convertView.findViewById(R.id.UploadedStatus);
        holder.deleteRow=(ImageView)convertView.findViewById(R.id.ImageViewDeleteRow);
        convertView.setTag(holder);
    }

    else
    {
        holder = (ViewHolder) convertView.getTag();
    }

    Bitmap bitmapImage = BitmapFactory.decodeFile(path+File.separator+lesProduits.get(position).getImage());

    Drawable drawableImage = new BitmapDrawable(bitmapImage);
    holder.imageDuProduit.setImageDrawable(drawableImage);
    holder.nomduProduit.setText(lesProduits.get(position).getNomDuProduit());
    holder.prixDuProduit.setText(lesProduits.get(position).getPrixDuProduit());
    holder.deleteRow.setImageResource(R.drawable.deleteRow);


    holder.deleteRow.setOnClickListener(new OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
        Context ctx = v.getContext();
        produitSource=new ProductsDataSource(ctx);
        produitSource.open();
        produitSource.deleteUpload(lesProduits.get(position));          
        produitSource.close();

        }
    });


    switch (lesProduits.get(position).getStatus())
    {

    case 3://annonce Accepté
    holder.status.setImageResource(R.drawable.accepte); 
    break;

    case 2://annonce en Attente
    holder.status.setImageResource(R.drawable.enattente);   
    break;

    case 1://annonce refusé
    holder.status.setImageResource(R.drawable.refuse);
    break;

    case 0://produit vendu
    holder.status.setImageResource(R.drawable.vendu);
    break;
    }
    return convertView;
}

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

notifyDataSetChanged() 是ListAdapter上用于刷新ListView的函数。

来自documentation

的例外情况
  

<强> public void notifyDataSetChanged ()

     

通知附属观察员   基础数据已更改,任何视图都反映数据集   应该刷新自己。

答案 1 :(得分:1)

您的ContentProvider需要在数据库写入操作运行时通知数据集已更改,即:

@Override
public int delete(Uri uri, String where, String[] whereArgs) {
    //Some delete code
    getContext().getContentResolver().notifyChange(uri, null);
}

您还需要在插入和更新方法中调用notifyChange。


此外,由于您的数据明显依赖于数据库。您应该使用CursorAdapter而非普通ArrayAdapter。使用支持包中包含的那个是最好的。

CursorAdapter的一个例子:

public class MyCursorAdapter extends CursorAdapter {

    public MyCursorAdapter(Context context, Cursor c, boolean autoRequery) {
        super(context, c, autoRequery);
    }

    @Override
    public void bindView(View v, Context con, Cursor c) {
        //set the data on your view
    }

    @Override
    public View newView(Context con, Cursor c, ViewGroup vg) {
        //just create your view, no need to set the data, it will be called again in bindview
    }
}

现在,每当您的数据库更新时,ListView将自动更新,您可以通过使用CursorAdapter获得一些内存优化。

答案 2 :(得分:0)

您应该刷新listView适配器。重新创建适配器并将其替换为旧适配器。希望这会有所帮助。