【问题标题】:Images in listview changes as we scroll in android当我们在 android 中滚动时,listview 中的图像会发生变化
【发布时间】:2014-08-28 09:06:49
【问题描述】:

我正在从服务器获取数据。数据包括图像和文本数据。我想在我的 ListView 中显示该数据。我已经这样做了,但是当我滚动列表视图时,列表视图中的图像会改变它们的位置。如何解决这个问题?

@Override
    public View getView(final int position, View convertview, ViewGroup parent) {
        if (convertview == null) {
            convertview = mInflater.inflate(R.layout.search_result_row, null);
            holder = new ViewHolder();
            holder.rowImagview = (ImageView) convertview.findViewById(R.id.Srch_row_image);
            holder.Name_txtview = (TextView) convertview.findViewById(R.id.Srch_result_NameView);
            holder.Age_txtview = (TextView) convertview.findViewById(R.id.Srch_result_AgeView);
            holder.maritalStatus_txtview = (TextView) convertview.findViewById(R.id.Srch_result_MaaritalView);
            holder.Religion_txtview = (TextView) convertview.findViewById(R.id.Srch_result_Religion);
            holder.Profession_txtview = (TextView) convertview.findViewById(R.id.Srch_result_profession);
            holder.country_txtview = (TextView) convertview.findViewById(R.id.Srch_result_Country);
            holder.description_txtview = (TextView) convertview.findViewById(R.id.Srch_description_textView);
            holder.showDeatil_btn = (Button) convertview.findViewById(R.id.Srch_result_pofDetail_btn);
            convertview.setTag(holder);

        } else {
            holder = (ViewHolder) convertview.getTag();
        }

        if (resultList.get(position).getUser_Gender().equalsIgnoreCase("male")) {
            options = new DisplayImageOptions.Builder().showStubImage(R.drawable.loading).showImageForEmptyUri(R.drawable.m_c1).showImageOnFail(R.drawable.m_c1).cacheInMemory().cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).build();
            maleImgPosition = 0;
        } else {
            options = new DisplayImageOptions.Builder().showStubImage(R.drawable.loading).showImageForEmptyUri(R.drawable.f_c1).showImageOnFail(R.drawable.f_c1).cacheInMemory().cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).build();
            femaleImgPosition = 0;
        }

        /* Image Loader Library to get the images from the server */
        imageLoader.displayImage(Url_Settings.Image_base_Url + resultList.get(position).getUser_defaultImag(), holder.rowImagview, options, animateFirstListener);

【问题讨论】:

  • 只是为了测试从 if (convertView == null) {} 中剪切整个代码并粘贴到它外面然后注释掉 if (convertView == null) {} else {holder = (ViewHolder) convertview. getTag();} 部分并运行。检查会发生什么?

标签: android listview universal-image-loader


【解决方案1】:

发生这种情况的问题是,当显示的新行不再可见时,android 将单元格重用于列表视图(当使用从下到上的手势滚动时,大多数项目用于显示新的底部项目) .由于下载操作很耗时,因此 displayImage 会延迟设置图像 - 在那个时间点,用户可能会向下滚动并且 android 已经将传递的 holder.rowImagview 用于不同的行(当请求下载并在滚动后重用为底部视图时,它是最重要的下载完成时)。

为避免您应该使用带有回调的 displayImage,以便您可以更好地控制设置图像并决定是否应在此特定 rowImageView 实例中设置图像

所以你可以这样做:

@Override
public View getView(final int position, View convertview, ViewGroup parent) {

    ...

    final ImageView rowImageView = holder.rowImageView;
    rowImagview.setTag(position);

    imageLoader.displayImage(imageUri, rowImagview, displayOptions, new SimpleImageLoadingListener()      {
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            ImageView rowImageView = (ImageView)rowImageView;
            if(((Integer)rowImageView.getTag()) == position){
                //the row is still correct, set bitmap
                rowImageView.setImageBitmap(loadedImage);
            }
        ...
        }
    }
    });
....
}

您也可以通过 imageUri 参数检查,仅当来自 onLoadingComplete() 的图像与当前行相同时才设置图像。

【讨论】:

    【解决方案2】:

    试试这个...

     @Override
    public View getView(final int position, View convertview, ViewGroup parent) {
    
            View v = mInflater.inflate(R.layout.search_result_row, null);
    
            ImageView rowImagview = (ImageView) v.findViewById(R.id.Srch_row_image);
            TextView Name_txtview = (TextView) v.findViewById(R.id.Srch_result_NameView);
            TextView Age_txtview = (TextView) v.findViewById(R.id.Srch_result_AgeView);
            TextView maritalStatus_txtview = (TextView) v.findViewById(R.id.Srch_result_MaaritalView);
            TextView Religion_txtview = (TextView) v.findViewById(R.id.Srch_result_Religion);
            TextView Profession_txtview = (TextView) v.findViewById(R.id.Srch_result_profession);
            TextView country_txtview = (TextView) v.findViewById(R.id.Srch_result_Country);
            TextView description_txtview = (TextView) v.findViewById(R.id.Srch_description_textView);
            Button showDeatil_btn = (Button) v.findViewById(R.id.Srch_result_pofDetail_btn);
    
    
        if (resultList.get(position).getUser_Gender().equalsIgnoreCase("male")) {
            options = new DisplayImageOptions.Builder().showStubImage(R.drawable.loading).showImageForEmptyUri(R.drawable.m_c1).showImageOnFail(R.drawable.m_c1).cacheInMemory().cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).build();
            maleImgPosition = 0;
        } else {
            options = new DisplayImageOptions.Builder().showStubImage(R.drawable.loading).showImageForEmptyUri(R.drawable.f_c1).showImageOnFail(R.drawable.f_c1).cacheInMemory().cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).build();
            femaleImgPosition = 0;
        }
    
        /* Image Loader Library to get the images from the server */
        imageLoader.displayImage(Url_Settings.Image_base_Url + resultList.get(position).getUser_defaultImag(), rowImagview, options, animateFirstListener);
    
        return v;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多