我的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;
}
有什么建议吗?
答案 0 :(得分:1)
notifyDataSetChanged()
是ListAdapter上用于刷新ListView的函数。
<强>
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适配器。重新创建适配器并将其替换为旧适配器。希望这会有所帮助。