0

listView를 사용하여 로컬 리소스에서 수백 개의 이미지를 표시하는 데 문제가 있으며 이미지를 전체 화면으로 설정합니다. 각 항목의 imageView와 TextView가있는 항목입니다.하지만 다음 항목으로 슬라이드하면 부드럽게 움직이지 않습니다. ImageFactory.options를 사용하여 이미지의 크기를 조정합니다. 그러나 문제는 여전히 존재합니다. 어쩌면 이 문제를 해결하려면 asynctask로드 및 이미지 캐시를 사용해야합니다. 여기 내 코드입니다, 친구들이 내 문제를 지적하시기를 바랍니다. 대단히 감사합니다. 저는 Asynctask 방식으로 이미지를로드하고 listViewAdapter에서로드하는 방법을 배우고 싶습니다.

private void init() { 
     listView = (ListView) getActivity().findViewById(R.id.lst_pic); 
     list = new ArrayList<Map<String,Object>>(); 
     for(int i=0;i < texts.length;i++){ 
      Map<String, Object> map = new HashMap<String, Object>(); 
      map.put("image", R.drawable.img0+ i); 
      map.put("text", texts[i]); 
      list.add(map); 
     } 
     listView.setAdapter(new PicListViewAdapter(getActivity(), list)); 
    } 

이 item.xml입니다 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
> 

    <ImageView android:id="@+id/img_pic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     /> 
    <TextView android:id="@+id/txt_pic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="15dp" 
     android:gravity="center_horizontal" 
     android:layout_gravity="center_horizontal" 
     /> 


</LinearLayout> 

답변

0

나는 그 목록 어댑터를 사용하지만 그 안에 picasso 라이브러리를 사용하여 이미지를로드합니다. Picasa는 UI 스레드에 이미지를로드하지 않습니다. 그래서이 오류가 발생합니다. 라이브러리를 추가 한 후 getView()을 다음과 같이 작성하십시오.

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

    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.item_pic, null); 
     holder = new ViewHolder(); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic); 
     holder.textView = (TextView) convertView.findViewById(R.id.txt_pic); 
     convertView.setTag(holder); 

    }else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    int resID = (Integer) list.get(position).get("image"); 
    String text = (String) list.get(position).get("text"); 
    //Picasso code 
    Picasso.Builder builder = new Picasso.Builder(context); 
    Picasso picasso = builder.build(); 
    picasso.load(resID).into(holder.imageView); 
    //End Picasso code 
    holder.textView.setText(text); 
    notifyDataSetChanged(); 
    return convertView; 
} 
+0

괜찮아요 almyz125을 배우게됩니다, 거기에 피카소 라이브러리의 링크입니다. – Jafir

+0

https://github.com/square/picasso – almyz125

0

안드로이드 공식 사이트에 포괄적 인 가이드가있다, http://developer.android.com/training/displaying-bitmaps/index.html

그것을 참조하십시오
package com.jafir.project.adapter; 


import java.util.List; 
import java.util.Map; 

import com.jafir.project.porunacabeza.R; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Handler; 
import android.os.Message; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView.RecyclerListener; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class PicListViewAdapter extends BaseAdapter { 
    private Context context; 
    private Resources resources; 
    private LayoutInflater inflater; 
    private ViewHolder holder; 
    private List<Map<String, Object>> list; 
    public PicListViewAdapter(Context context,List<Map<String, Object>> list) { 
     this.list = list; 
     this.context = context; 
     this.inflater = LayoutInflater.from(context); 
     resources = context.getResources(); 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

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

     if(convertView == null) { 
      convertView = inflater.inflate(R.layout.item_pic, null); 
      holder = new ViewHolder(); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.img_pic); 
      holder.textView = (TextView) convertView.findViewById(R.id.txt_pic); 
      convertView.setTag(holder); 

     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     int resID = (Integer) list.get(position).get("image"); 
     String text = (String) list.get(position).get("text"); 
     holder.imageView.setImageBitmap(decodeBitmap(resources, resID, holder.imageView.getWidth(),   holder.imageView.getHeight())); 
     holder.textView.setText(text); 
     notifyDataSetChanged(); 
     return convertView; 
    } 

    public Bitmap decodeBitmap(Resources res,int id,int width,int height){ 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(res,id,options); 
     options.inSampleSize = getInSampleSize(options,width,height); 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(res,id,options); 
    } 

    public int getInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){ 
     final int width = options.outWidth; 
     final int height = options.outHeight; 
     int inSampleSize = 1; 
     if(height > reqHeight || width > reqWidth) { 
      int radioWidth = Math.round((float)width/(float)reqWidth); 
      int radioHeight = Math.round((float)height/(float)reqHeight); 
      inSampleSize = radioHeight < radioWidth ?radioHeight:radioWidth; 
     } 
     return inSampleSize; 
    } 

     final static class ViewHolder{ 
      ImageView imageView; 
      TextView textView; 
     } 
} 

활동입니다

세션에는 다음 주제가 포함되어 있습니다.

큰 비트 맵을 효율적으로로드 이 단원에서는 응용 프로그램 메모리 한도를 초과하지 않고 큰 비트 맵을 디코딩하는 과정을 안내합니다. 인터페이스 스레드 비트 맵 처리 오프

비트 맵 처리 메인 UI 스레드에서 발생하지 않아야 (등, 원격 소스로부터 다운로드 리사이징). 이 단원에서는 AsyncTask를 사용하여 백그라운드 스레드의 비트 맵을 처리하고 동시성 문제를 처리하는 방법을 설명합니다.

캐싱 비트 맵 이 단원에서는 여러 비트 맵을로드 할 때 당신의 UI의 응답 성 및 유동성을 개선하기 위해 메모리와 디스크 비트 맵 캐시를 사용을 안내합니다.

비트 맵 메모리 관리 이 단원에서는 비트 맵 메모리를 관리하여 응용 프로그램의 성능을 최대화하는 방법을 설명합니다. 귀하의 UI 이 단원에서 비트 맵을 표시

어떻게 백그라운드 스레드 및 비트 맵 캐시를 사용하여 ViewPager와의 GridView 같은 구성 요소에 여러 비트 맵을로드하는 방법을 보여, 모든 것을 함께 제공합니다.

+0

예, 고맙습니다. 배우고 있습니다. – Jafir

0

당신의 추측은 맞습니다. 2 년 전쯤에 tomgibara의 ViewRenderer (https://gist.github.com/tomgibara/1084229)을 사용하여 구현을 테스트 한 결과 매우 부드러운 결과물을 얻었습니다. 잘됐다.

나는 그것을 시도하려고 노력할 것이다. 나는 스스로 메커니즘을 만들려고 노력할 것이다. 참조 용 몇 가지 고려 사항 : 당신이 OutOfMemoryError를 얻을하지 않도록

  • 는 LRUCache에 디코딩 된 비트 맵을 넣습니다. 사실 개의 이미지가로드 될 때 이러한 현상이 발생할 수 있습니다.
  • 원하는대로 AsyncTask/Loader/Raw Thread를 사용하십시오. 아니 많은 본질 차이.
+0

더 나은 Shao 감사합니다. 내가 열린 프로젝트 – Jafir

관련 문제