之前遇到這個問題,如果你使用以下語法時
mGrid.setAdapter(new ApplicationsAdapter(this, arylistInfo));
無法動態改變你的GridView 顯示的內容時,請看一下此Adapter是繼承於何物若是ArrayAdapter 是無法做到動態更新的,必須改為BaseAdapter再自已實作
原ArrayAdapter為
/**
* GridView adapter to show the list of all installed applications.
*/
private class ApplicationsAdapter extends ArrayAdapter<ApplicationInfo> {
private Rect mOldBounds = new Rect();
public ApplicationsAdapter(Context context, ArrayList<ApplicationInfo> apps) {
super(context, 0, apps);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ApplicationInfo info = mApplications.get(position);
if (convertView == null) {
final LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.application1, parent, false);
}
Drawable icon = info.icon;
if (!info.filtered) {
//final Resources resources = getContext().getResources();
int width = 48;//(int) resources.getDimension(android.R.dimen.app_icon_size);
int height = 48;//(int) resources.getDimension(android.R.dimen.app_icon_size);
final int iconWidth = icon.getIntrinsicWidth();
final int iconHeight = icon.getIntrinsicHeight();
if (icon instanceof PaintDrawable) {
PaintDrawable painter = (PaintDrawable) icon;
painter.setIntrinsicWidth(width);
painter.setIntrinsicHeight(height);
}
if (width > 0 && height > 0 && (width < iconWidth || height < iconHeight)) {
final float ratio = (float) iconWidth / iconHeight;
if (iconWidth > iconHeight) {
height = (int) (width / ratio);
} else if (iconHeight > iconWidth) {
width = (int) (height * ratio);
}
final Bitmap.Config c =
icon.getOpacity() != PixelFormat.OPAQUE ?
Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
final Bitmap thumb = Bitmap.createBitmap(width, height, c);
final Canvas canvas = new Canvas(thumb);
canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, 0));
// Copy the old bounds to restore them later
// If we were to do oldBounds = icon.getBounds(),
// the call to setBounds() that follows would
// change the same instance and we would lose the
// old bounds
mOldBounds.set(icon.getBounds());
icon.setBounds(0, 0, width, height);
icon.draw(canvas);
icon.setBounds(mOldBounds);
icon = info.icon = new BitmapDrawable(thumb);
info.bmp=thumb;
info.filtered = true;
}
}
final TextView textView = (TextView) convertView.findViewById(R.id.label);
//textView.setCompoundDrawablesWithIntrinsicBounds(null, icon, null, null);
textView.setText(info.title);
final ImageView image = (ImageView) convertView.findViewById(R.id.icon_app);
image.setImageDrawable(icon);
return convertView;
}
}
改為BaseAdapter為
public class Applications_Adapter extends BaseAdapter {
private static final String TAG = "Applications_Adapter";
private ArrayList<ApplicationInfo> arylistApp;
private Context myContext;
private LayoutInflater mInflater;
int mGalleryItemBackground;
public Applications_Adapter(Context c, ArrayList<ApplicationInfo> app)
{
myContext =c;
arylistApp = app;
mInflater = LayoutInflater.from(myContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return arylistApp.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return arylistApp.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Rect mOldBounds = new Rect();
final ApplicationInfo info = arylistApp.get(position);
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.application1, parent, false);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon_app);
holder.txt = (TextView) convertView.findViewById(R.id.label);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
Drawable icon = info.icon;
if (!info.filtered) {
//final Resources resources = getContext().getResources();
int width = 48;//(int) resources.getDimension(android.R.dimen.app_icon_size);
int height = 48;//(int) resources.getDimension(android.R.dimen.app_icon_size);
final int iconWidth = icon.getIntrinsicWidth();
final int iconHeight = icon.getIntrinsicHeight();
if (icon instanceof PaintDrawable) {
PaintDrawable painter = (PaintDrawable) icon;
painter.setIntrinsicWidth(width);
painter.setIntrinsicHeight(height);
}
if (width > 0 && height > 0 && (width < iconWidth || height < iconHeight)) {
final float ratio = (float) iconWidth / iconHeight;
if (iconWidth > iconHeight) {
height = (int) (width / ratio);
} else if (iconHeight > iconWidth) {
width = (int) (height * ratio);
}
final Bitmap.Config c =
icon.getOpacity() != PixelFormat.OPAQUE ?
Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
final Bitmap thumb = Bitmap.createBitmap(width, height, c);
final Canvas canvas = new Canvas(thumb);
canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, 0));
// Copy the old bounds to restore them later
// If we were to do oldBounds = icon.getBounds(),
// the call to setBounds() that follows would
// change the same instance and we would lose the
// old bounds
mOldBounds.set(icon.getBounds());
icon.setBounds(0, 0, width, height);
icon.draw(canvas);
icon.setBounds(mOldBounds);
icon = info.icon = new BitmapDrawable(thumb);
info.bmp=thumb;
info.filtered = true;
}
}
holder.txt.setText(info.title);
holder.icon.setImageDrawable(icon);
return convertView;
}
public class ViewHolder
{
ImageView icon;
TextView txt;
}
}
就可以動態新增了^^