2013-06-10 3 views
0

그래서 GridView와 비슷한 사용자 정의보기를 만들었습니다. 응용 프로그램 내부의 리소스 일 때 이미지를로드하고 스크롤하지만 HTTP 요청을 통해 들어오는 이미지를 사용하고 있기 때문에 이미지가 제대로로드되지 않습니다. 스크롤 한 후 이미지가 기본값으로 재설정 됨 - Android 사용자 정의보기

앱이 시작되면 : 그 다시 스크롤 한 후 (좋은)

을 이미지가로드를 올바르게 : 모든 이미지가

해당 셀을지나 스크롤하고 즉시 다시 스크롤 한 후 (나쁜) 기본값으로 설정되어 있습니다 언젠가 나중에 동일한 셀 : 이미지가 기본값 (불량)으로 다시 설정되었습니다.

이 오류의 원인에 대한 아이디어가있는 사람이 있습니까? 나는 그것이 일종의 재활용 문제라고 추측하지만 나는 그것을 고칠 수 없었다. 크게 도움이 될 올바른 방향으로

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final LayoutParams lp; 
    int viewType = getItemViewType(position); 
    ImageView img; 
    PulseTextView title; 
    Resources res = getContext().getResources(); 
    int height = (int) res.getDimension(R.dimen.icon_main_size); 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.element_item, parent, false) 

     LayoutParams layp = new LayoutParams(height); 
     convertView.setLayoutParams(layp); 
    } 
    img = ViewHolder.get(convertView,R.id.catalog_image); 
    title = ViewHolder.get(convertView,R.id.title); 


    final CatalogItem channel = getCatalogItem(position); 

    // find the url of the associated image then set image 
    String url = null; 
    try { 
     url = mCatalogHandler.getImageUrl(CatalogHandler.VALUE_ICON, channel.mPrimaryKey, 100, 100); 
    } catch (CatalogException e) { 
     e.printStackTrace(); 
    } 
    if (url == null || TextUtils.isEmpty(url) || url.equals("null")) { 
     img.setImageBitmap(mDefaultPic); 
    } else { 
     // downloads the image to img 
     mImageDownloader.download(url, img, mDefaultPic, false); 
    } 
    title.setText(channel.mDomain); 
    img.setScaleType(ScaleType.FIT_XY); 
    img.setTag(RAMImageCache.KEY_URL, url); 

    // set the gradient behind the text 
    View grad = convertView.findViewById(R.id.text_gradient); 
    ViewUtils.setHeight(grad, height * 3/5); 
    grad.getBackground().setDither(true); 
    View solid = convertView.findViewById(R.id.solid); 
    ViewUtils.setHeight(solid, height/5); 

    // set the padding based on the position on the screen 
    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    ((Activity)getContext()).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int width = displaymetrics.widthPixels; 
    if (convertView.getRight() == width && convertView.getLeft() == 0) { 
     convertView.setPadding(0, 0, 0, 1); 
    } else if (convertView.getRight() == width) { 
     //convertView.setPadding(1, 0, 0, 1); 
     convertView.setPadding(0, 0, 1, 1); 
    } else if (convertView.getLeft() == 0) { 
     //convertView.setPadding(0, 0, 1, 1); 
     convertView.setPadding(1, 0, 0, 1); 
    } 

    // set the onclicklistener to jump to the next fragment 
    convertView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Bundle bundle = new Bundle(); 
      bundle.putString("channelitem", channel.getMetadata().toString()); 
      ChannelFragment fragment = new ChannelFragment(); 
      fragment.setArguments(bundle); 
      ((PulseFragmentActivity)mContext.get()).openFragment(fragment); 
     } 
}); 
    return convertView; 
} 

static class ViewHolder { 
    ImageView img; 
    TextView title; 

    public ViewHolder(ImageView i, PulseTextView t) { 
     img = i; 
     title = t; 
    } 

    public static <T extends View> T get(View view, int id) { 
     SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
     if (viewHolder == null) { 
      viewHolder = new SparseArray<View>(); 
      view.setTag(viewHolder); 
     } 
     View childView = viewHolder.get(id); 
     if (childView == null) { 
      childView = view.findViewById(id); 
      viewHolder.put(id, childView); 
     } 
     return (T) childView; 
    } 
} 

모든 점 : 여기

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:paddingBottom="1dip" 
    android:background="@color/white" 
    android:id="@+id/highlight_counter_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:gravity="center" > 

    <ImageView 
     android:id="@+id/catalog_image" 
     android:layout_width="match_parent" 

     android:layout_height="match_parent"/> 

    <View 
     android:id="@+id/solid" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:background="@android:color/black" /> 

    <View 
     android:id="@+id/text_gradient" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@id/solid" 
     android:background="@drawable/highlight_text_gradient" /> 

     <TextView 
      android:id="@+id/title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:padding="@dimen/highlight_text_padding" 
      android:ellipsize="end" 
      android:gravity="bottom" 
      android:maxLines="2" 
      android:textColor="@color/white" 
      android:textSize="@dimen/text_large" /> 
</RelativeLayout> 

내 어댑터에서 발췌 (내가 생각하는 경우 문제가 아마 거짓말)입니다 : 여기

내 XML 파일입니다 ! 다른 코드 스 니펫이 필요하면 알려주십시오.

+0

이 링크를 확인하면 유니버설 이미지 로더를 사용하여 listview에서 이미지를 표시 할 수 있습니다. listview 대신 gridview를 사용하십시오. http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285 – Raghunandan

답변

0

디버그 방법 중 하나는 다른 이미지 다운로드 라이브러리를 사용하여 오류가 코드에 있는지 확인하는 것입니다. https://github.com/koush/UrlImageViewHelper을 사용했는데 셀이 재사용 될 때 잘 작동하며 API는 현재 사용한 것과 비슷합니다.

0

동작은 다운로드 한 이미지를 처리하는 방법과 용도에 따라 달라집니다.

대부분의 경우 LRU 캐시 구현은 다운로드 한 이미지를 저장하는 데 사용될 수 있으며이 캐시에는 할당 된 최대 바이트 값이 있습니다. 캐시 된 이미지가이 값을 초과하면 이전 비트 맵이 삭제되므로 기본 이미지가 표시되는 이유와 다시 다운로드해야합니다.

내 제안은 가능한 한 작은 크기로 조정하여 가능한 한 많은 비트 맵을 캐시 할 수있게하는 것입니다.

안드로이드가 메모리 제한 때문에 다운로드 한 모든 이미지를 캐시 할 수있는 방법은 없습니다.

관련 문제