当使用asynctask加载图像时,Android listview中的行为异常

费格斯

我希望有人能帮助我解决我遇到的ListView问题。昨天我一直在用铁墙砸头,因为我不知道是什么问题。原来不是我的项目使它变得更加困难。

我有一个列表视图,我想在其中加载联系人行。在每行的左侧,我想(向下)加载图像异步。为此,我正在使用以下ArrayAdapter和ListItem布局,请忽略不推荐使用的函数。

这是一个视频http://www.youtube.com/watch?v=aMqI9_y3pag&feature=youtu.be

问题:每当列表加载时,所有图像就会相互加载,然后将蜜蜂放置在正确的位置。它看起来确实有故障,即使响应速度很快,而且看起来也很恐怖。我在arrayadapter中添加了一个计数器,以计算getView被调用的时间。

  • 没有异步图像的4个项目-大约 38时代
  • 带有异步图像的4个项目-大约 180时代

希望有人可以帮助我!

阵列适配器

    public class ChatContactListArrayAdapter extends ArrayAdapter<ChatContact>{

    private Context context;
    private ArrayList<ChatContact> chatContacts;

    public static DiskImageLoaderHelper diskImageLoader;

    public int count = 0;

    public ChatContactListArrayAdapter(Context context, int resource, ArrayList<ChatContact> chatContacts) {
        super(context, resource, chatContacts);

        this.chatContacts = chatContacts;
        this.context = context;
        diskImageLoader = new DiskImageLoaderHelper(context, "ChatListImages", (1024 * 1024 * 10), CompressFormat.JPEG, 90);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        count++;
        Log.e(DebugHelper.TAG_DEBUG, "Count: " + count + " Position: " + position);
        ChatContact chatContact = chatContacts.get(position);

        View view = convertView;

        if (view == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.chat_contact_list_row, null);
        }

        ImageView contactImageView = (ImageView) view.findViewById(R.id.contact_image);
        if (chatContact.Picture != null) {
            BitmapWorkerTask bitmapWorker = new BitmapWorkerTask(contactImageView, diskImageLoader);
            bitmapWorker.execute(chatContact.Picture);
        } else {
            contactImageView.setVisibility(View.INVISIBLE);
        }

        TextView fromTextView = (TextView) view.findViewById(R.id.fromName);
        fromTextView.setText(chatContact.Name);

        Boolean l_blToMe = false;
        if (chatContact.From == chatContact.Id) {
            l_blToMe = true;
        }

        LinearLayout chatContactRow = (LinearLayout) view.findViewById(R.id.chatContactRow);
        ImageView imageViewStatusMessage = (ImageView) view.findViewById(R.id.lastMessageStatusImg);

        TextView lastMessage = (TextView) view.findViewById(R.id.lastMessage);
        if (CommonUtilities.isNullOrEmpty(chatContact.Message) && !CommonUtilities.isNullOrEmpty(chatContact.MessageId)) {
            lastMessage.setText("<afbeelding>");
        } else {
            lastMessage.setText(chatContact.Message);
        }

        imageViewStatusMessage.setImageResource(0);

        if (!CommonUtilities.isNullOrEmpty(chatContact.Received)) {
            imageViewStatusMessage.setImageDrawable(context.getResources().getDrawable(R.drawable.chat_double_check));
            chatContactRow.setBackgroundColor(Color.parseColor("#F2F2F2"));
            lastMessage.setTypeface(null, Typeface.NORMAL);
        } else if (!CommonUtilities.isNullOrEmpty(chatContact.Sent) && !l_blToMe) {
            imageViewStatusMessage.setImageDrawable(context.getResources().getDrawable(R.drawable.chat_single_check));
            chatContactRow.setBackgroundColor(Color.parseColor("#F2F2F2"));
            lastMessage.setTypeface(null, Typeface.NORMAL);
        } else if (!CommonUtilities.isNullOrEmpty(chatContact.Sent) && l_blToMe) {
            imageViewStatusMessage.setImageDrawable(context.getResources().getDrawable(R.drawable.chat_arrow));
            chatContactRow.setBackgroundColor(Color.parseColor("#F4E0CC"));
            lastMessage.setTypeface(null, Typeface.BOLD);
        } else {
            imageViewStatusMessage.setVisibility(View.INVISIBLE);
        }

        TextView receivedDate = (TextView) view.findViewById(R.id.receivedDate);

        if (!CommonUtilities.isNullOrEmpty(chatContact.Sent) && CommonUtilities.isNullOrEmpty(chatContact.Received)) {
            try {
                SimpleDateFormat l_dbDateFormatter = new SimpleDateFormat("yyyyMMddHHmmss");
                Date l_dOrgDate = (Date) l_dbDateFormatter.parse(chatContact.Sent);
                SimpleDateFormat l_showDateFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");

                String newDateStr = l_showDateFormatter.format(l_dOrgDate);
                receivedDate.setText(newDateStr);
            } catch (ParseException e) {
                Log.e(DebugHelper.TAG_ERROR, "ChatContactListAdapter::" + e.toString());
//              ACRA.getErrorReporter().handleSilentException(e);
            }
        } else if (!CommonUtilities.isNullOrEmpty(chatContact.Received)) {
            try {
                SimpleDateFormat l_dbDateFormatter = new SimpleDateFormat(
                        "yyyyMMddHHmmss");
                Date l_dOrgDate = (Date) l_dbDateFormatter.parse(chatContact.Received);
                SimpleDateFormat l_showDateFormatter = new SimpleDateFormat(
                        "dd-MM-yyyy HH:mm");

                String newDateStr = l_showDateFormatter.format(l_dOrgDate);
                receivedDate.setText(newDateStr);
            } catch (ParseException e) {
                Log.e(DebugHelper.TAG_ERROR, "ChatContactListAdapter::" + e.toString());
//              ACRA.getErrorReporter().handleSilentException(e);
            }
        } else {
            receivedDate.setVisibility(View.INVISIBLE);
        }

        return view;
    }

    @Override
    public void clear() {
        count = 0;
        super.clear();
    }

    class BitmapWorkerTask extends AsyncTask<String, Void, Drawable> {

        private final WeakReference<ImageView> contactImageView;
        private DiskImageLoaderHelper diskImageLoader;

        public BitmapWorkerTask(ImageView imageView, DiskImageLoaderHelper diskImageLoader) {
            this.contactImageView = new WeakReference<ImageView>(imageView);
            this.diskImageLoader = diskImageLoader;
        }

        @Override
        protected Drawable doInBackground(String... params) {
            String imageUrl = params[0];
            Bitmap bitmap = null;
            if (!diskImageLoader.containsKey(CommonUtilities.filePathToCacheKey(imageUrl, false)) || false) {
                bitmap = CommonUtilities.getCroppedBitmap(CommonUtilities.createBitmapFromImageLocation(CommonUtilities.mStrBasePath + imageUrl), 50);
                if(bitmap != null) {
                    diskImageLoader.put(CommonUtilities.filePathToCacheKey(imageUrl, true), bitmap);
                }
            } else {
                bitmap = diskImageLoader.getBitmap(CommonUtilities.filePathToCacheKey(imageUrl, false));
            }

            return new BitmapDrawable(context.getResources(), bitmap);
        }

        @Override
        protected void onPostExecute(Drawable drawable) {
            ImageView view = contactImageView.get();
            if (view != null && drawable != null) {
                view.setBackgroundDrawable(drawable);
//              contactImageView.setImageBitmap(bitmap);
                view.setImageDrawable(context.getResources().getDrawable(R.drawable.image_round_overlay_grey));
            }
        }
    }
}

ListViewItem布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/chat_contact_list_selector"
    android:orientation="horizontal"
    android:id="@+id/chatContactRow" >

    <ImageView
        android:id="@+id/contact_image"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:src="@drawable/image_round_overlay_grey"/>

    <LinearLayout
        android:id="@+id/TextualHolder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" 
        android:baselineAligned="false">

        <RelativeLayout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" 
            android:baselineAligned="false">
            <TextView
                android:id="@+id/fromName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dip"
                android:layout_marginTop="10dp"
                android:paddingBottom="10dip"
                android:textColor="#222222"
                android:ellipsize="end"
                android:singleLine="true"
                android:textSize="18sp" />

            <TextView
                android:id="@+id/receivedDate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="15dp"
                android:layout_marginTop="10dp"
                android:layout_alignParentRight="true"
                android:paddingBottom="10dip"
                android:textColor="#777777"
                android:textSize="10sp"
                android:textStyle="bold" />
        </RelativeLayout>

        <LinearLayout
            android:id="@+id/statusMessageHolder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginLeft="10dip"
            android:paddingBottom="10dip" >

            <ImageView
                android:id="@+id/lastMessageStatusImg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical" />

            <TextView
                android:id="@+id/lastMessage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#777777"
                android:textSize="15sp"
                android:ellipsize="end"
                android:singleLine="true"
                android:textStyle="bold"/>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

在我的sherlockFragment中创建

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        context = getActivity().getApplicationContext();

        mLvContactList = (ListView) getView().findViewById(R.id.listContacts);
        if(mDbDataBase == null)
            mDbDataBase = nl.w3s.hulpverlener.JohelpenApplication.mDbDataBase;
        if(mCurDB == null)
            mCurDB = nl.w3s.hulpverlener.JohelpenApplication.mCurDB;

        mCursor = mCurDB.query(mTblChatContacts.mTable, mDbDataBase.dbFieldsToString(mTblChatContacts.mFields), null, null, null, null, null);
        chatContacts = CommonUtilities.getContactsFromCursor(mCursor);
        mCursor.close();

        chatContactArrayAdapter = new ChatContactListArrayAdapter(getActivity(), R.layout.chat_contact_list_row, chatContacts);
        mLvContactList.setAdapter(chatContactArrayAdapter);

        mLvContactList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent,
                            final View view, int position, long id) {

                        ChatContact chatContact = (ChatContact) parent.getItemAtPosition(position);
                        ChatFragment chatFragment = new ChatFragment(chatContact.Id);
                        mMainObject.switchContent(chatFragment, true);
                    }
                });

        getSherlockActivity().getSupportActionBar().setIcon(R.drawable.icon_ab_chat);
        getSherlockActivity().getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        MainActivity.mMenuLayout = -1;
        getSherlockActivity().invalidateOptionsMenu();
        setStatusMessage();

        mMainObject.setTitle(mTitle);
    }
用户名

实际上,主要问题是您没有自定义适配器的方法中的大多数条件语句添加else条件语句ifgetView()

喜欢,

  1. 放在else这里

    if (chatContact.Picture != null) {
            BitmapWorkerTask bitmapWorker = new BitmapWorkerTask(contactImageView, diskImageLoader);
            bitmapWorker.execute(chatContact.Picture);
    }
    else
    {
            contactImageView.setImageResource(R.id.icon); // only for your reference.. add default image
    } 
    
  2. else在您的所有if-else if语句中添加语句以获取列表项行视图。要么使它们不可见,要么分配空白文本或默认图像。

更新:我怀疑这种情况是由于列表行的引用视图。

删除此代码,

 View view = convertView;

 if (view == null) {
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     view = inflater.inflate(R.layout.chat_contact_list_row, null);
 }

随便用

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.chat_contact_list_row, null);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法使用AsyncTask在ListView中加载图像

来自分类Dev

Android中的HashMap异常行为

来自分类Dev

使用DiskBasedCache时未加载Android Volley ListView图像

来自分类Dev

使用DiskBasedCache时未加载Android Volley ListView图像

来自分类Dev

Android ListView中的JSONParser异常

来自分类Dev

使用AsyncTask在Listview中显示图像

来自分类Dev

Listview中的ImageView在Android中抛出异常

来自分类Dev

使用多个按钮时,SwiftUI Form容器中的异常行为

来自分类Dev

AsyncTask异常行为

来自分类Dev

ListView中的Ratingbar样式,行为异常

来自分类Dev

ListView中的Ratingbar样式,行为异常

来自分类Dev

打印数组时,SimpleXMLElement对象中的异常行为

来自分类Dev

如何在AsyncTask中从html加载图像

来自分类Dev

图像和文本分别在listview中显示-Android使用图像加载器

来自分类Dev

使用AsyncTask将图像下载到AppWidget中的ListView中

来自分类Dev

使用robospice延迟加载Listview中的图像

来自分类Dev

使用robospice延迟加载Listview中的图像

来自分类Dev

WPF - 在 ListView 中禁用按钮时的奇怪行为

来自分类Dev

从 Internet 加载图像时 Android Studio 中的 HttpURLConnection 问题

来自分类Dev

使用Universal Image Loader Android在ListView中加载错误的图像?

来自分类Dev

Android:使用滑行在ListView中加载图像的问题

来自分类Dev

Android Listview异步图像加载

来自分类Dev

Android ListView缓慢加载图像

来自分类Dev

在ListView Android中加载图像

来自分类Dev

Android ListView搜索导致索引超出片段中的异常范围

来自分类Dev

如何避免使用android-volley在连续listview中重新加载远程图像?

来自分类Dev

快速滚动时图像未加载到ListView中

来自分类Dev

刷新Android片段视图时的行为异常

来自分类Dev

使用Aquery加载Listview图像

Related 相关文章

  1. 1

    无法使用AsyncTask在ListView中加载图像

  2. 2

    Android中的HashMap异常行为

  3. 3

    使用DiskBasedCache时未加载Android Volley ListView图像

  4. 4

    使用DiskBasedCache时未加载Android Volley ListView图像

  5. 5

    Android ListView中的JSONParser异常

  6. 6

    使用AsyncTask在Listview中显示图像

  7. 7

    Listview中的ImageView在Android中抛出异常

  8. 8

    使用多个按钮时,SwiftUI Form容器中的异常行为

  9. 9

    AsyncTask异常行为

  10. 10

    ListView中的Ratingbar样式,行为异常

  11. 11

    ListView中的Ratingbar样式,行为异常

  12. 12

    打印数组时,SimpleXMLElement对象中的异常行为

  13. 13

    如何在AsyncTask中从html加载图像

  14. 14

    图像和文本分别在listview中显示-Android使用图像加载器

  15. 15

    使用AsyncTask将图像下载到AppWidget中的ListView中

  16. 16

    使用robospice延迟加载Listview中的图像

  17. 17

    使用robospice延迟加载Listview中的图像

  18. 18

    WPF - 在 ListView 中禁用按钮时的奇怪行为

  19. 19

    从 Internet 加载图像时 Android Studio 中的 HttpURLConnection 问题

  20. 20

    使用Universal Image Loader Android在ListView中加载错误的图像?

  21. 21

    Android:使用滑行在ListView中加载图像的问题

  22. 22

    Android Listview异步图像加载

  23. 23

    Android ListView缓慢加载图像

  24. 24

    在ListView Android中加载图像

  25. 25

    Android ListView搜索导致索引超出片段中的异常范围

  26. 26

    如何避免使用android-volley在连续listview中重新加载远程图像?

  27. 27

    快速滚动时图像未加载到ListView中

  28. 28

    刷新Android片段视图时的行为异常

  29. 29

    使用Aquery加载Listview图像

热门标签

归档