
如标题所示,在某些设备上,当调用notifydatasetchanged时,图像会闪烁.
这是我的BaseAdapter子类中的getVIEw方法:
@OverrIDepublic VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup arg2) { String infService = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater li = (LayoutInflater)context.getSystemService(infService); VIEw v = arg1; final VIEwHolder holder; if(v == null) { v = li.inflate(R.layout.row_history_settings, arg2, false); holder = new VIEwHolder(); holder.flag = (ImageVIEw) v.findVIEwByID(R.ID.row_history_settings_image_flag); holder.currency = (TextVIEw) v.findVIEwByID(R.ID.row_history_settings_text_currency); holder.tb = (Togglebutton) v.findVIEwByID(R.ID.row_history_settings_tb); v.setTag(holder); } else { holder = (VIEwHolder) v.getTag(); } Account account = accounts.get(arg0); int resID = enabled == true ? Utils.getFlagResIDForCurrency(account.currency()) : Utils.getFlagInactiveResIDForCurrency(account.currency()); if(resID != holder.resID) { holder.resID = resID; holder.flag.setTag(resID); new AsyncImageLoader(holder.flag, context).execute(); } holder.currency.setText(account.currency()); if(currency!=null) { holder.tb.setChecked(currency.equals(account.currency())); holder.tb.setEnabled(true); } else { holder.tb.setChecked(false); holder.tb.setEnabled(false); } holder.tb.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { currency = holder.currency.getText().toString(); notifyDataSetChanged(); } }); Utils.enabledisableVIEw(v, enabled); return v;}每次单击togglebutton时,holder.flag图像会在不同的短时间内闪烁.这似乎只发生在Sony Xperia U或HTC Desire Z等设备上.
这是我的行布局:
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="@dimen/row_List_standard_height" androID:background="@drawable/List_item_background" androID:gravity="center_vertical" androID:orIEntation="horizontal" > <ImageVIEw androID:ID="@+ID/row_history_settings_image_flag" androID:layout_wIDth="@dimen/row_List_flag_wIDth" androID:layout_height="wrap_content" androID:layout_centerVertical="true" androID:layout_marginleft="10dp" androID:adjustVIEwBounds="true" androID:contentDescription="@string/none" androID:src="@drawable/flag_pln" /> <com.aliorbank.components.customFont.CustomFontTextVIEw androID:ID="@+ID/row_history_settings_text_currency" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_centerVertical="true" androID:layout_gravity="left|center_vertical" androID:layout_marginleft="20dp" androID:layout_toRightOf="@ID/row_history_settings_image_flag" androID:text="@string/universal_currency_pln" androID:textSize="@dimen/Font_size_big" /> <Togglebutton androID:ID="@+ID/row_history_settings_tb" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_alignParentRight="true" androID:layout_centerVertical="true" androID:layout_marginRight="10dp" androID:background="@drawable/btn_radio_standard" androID:checked="true" androID:text="@string/none" androID:textOff="@string/none" androID:textOn="@string/none" /></relativeLayout>和我的AsyncIMageLoader类:
public class AsyncImageLoader extends AsyncTask<Object, VoID, Bitmap> {private final WeakReference<ImageVIEw> imageVIEwReference;private Context context;private int resID;public AsyncImageLoader(ImageVIEw imv, Context context){ imageVIEwReference = new WeakReference<ImageVIEw>(imv); this.context = context; this.resID = (Integer)imv.getTag();}@OverrIDeprotected Bitmap doInBackground(Object... arg0) { return BitmapFactory.decodeResource(context.getResources(), resID);}@OverrIDeprotected voID onPostExecute(Bitmap result) { if (imageVIEwReference != null && result != null) { final ImageVIEw imageVIEw = imageVIEwReference.get(); if (imageVIEw != null) { imageVIEw.setimageBitmap(result); } }}}在我看来,convertVIEw与getVIEw方法中的位置不对应.有没有办法获得对应于ListvIEw的行位置的convertVIEw?
或者也许有另一种解决方案?
解决方法:
您应该从已回收的视图中取消AsyncImageLoader.
你想要实现的目标真的很难.你可以在这里找到一个非常详细的例子:http://developer.android.com/training/displaying-bitmaps/display-bitmap.html.
除非你真的希望在生活中实现这一目标,否则一个好的选择就是使用一个库.
以下是一些选项:
>排球及其NetworkImageView
> RoboSpice UI SpiceList module
我认为普通的商品也像这样的lib.当然,甚至还有其他选择.
PS:我必须说我更喜欢第二种选择,但作为RoboSpice的贡献者,我可能不那么公平;)
总结以上是内存溢出为你收集整理的Android:在某些设备上调用notifyDataSetChanged时,listview中的图像闪烁全部内容,希望文章能够帮你解决Android:在某些设备上调用notifyDataSetChanged时,listview中的图像闪烁所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)