Android:在某些设备上调用notifyDataSetChanged时,listview中的图像闪烁

Android:在某些设备上调用notifyDataSetChanged时,listview中的图像闪烁,第1张

概述如标题所示,在某些设备上,当调用notifydatasetchanged时,图像闪烁.这是我的BaseAdapter子类中的getView方法:@OverridepublicViewgetView(intposition,ViewconvertView,ViewGrouparg2){StringinfService=Context.LAYOUT_INFLATER_SERVICE;LayoutInflater

如标题所示,在某些设备上,当调用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中的图像闪烁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1119014.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存