2010-12-22 16 views
6

tipos Tengo un problema con mi lista de lista. Funciona tan lento cuando se puede desplazar alguien puede ayudarme. Mi vista de lista es diseño personalizado usando relativa con 3 textview y 1 imageview cada fila con todo el contenido es recuperar de la web. Uso un adaptador personalizado y un titular de vista.android lista de visualización personalizada muy lenta cuando se desplaza

a continuación son mis códigos sobre cómo uso el adaptador.

public class MessageList extends ListActivity { 


    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
     setContentView(R.layout.listarticle); 

     loadFeed(link); 
     setListAdapter(new IconAdapter(this)); 

    } 

/* This method load xml file and parse it into message object*/ 
private void loadFeed(String link){ 
    try{ 
     BaseFeedParser parser = new BaseFeedParser(link); 
     messages = parser.parse(); 
     titles = new ArrayList<String>(messages.size()); 
     image = new ArrayList<String>(messages.size()); 
     date_post = new ArrayList<String>(messages.size()); 
     descs = new ArrayList<String>(messages.size()); 
     for (Message msg : messages){ 
     titles.add(msg.getTitle()); 
     image.add(msg.getImageLink().toString()); 
     date_post.add(msg.getDate()); 
     descs.add(msg.getDescription()); 

     } 
     } catch (Throwable t){ 
     Log.e("AndroidNews",t.getMessage(),t); 
    } 
    } 

/*this is my custom baseadapter */ 
class IconAdapter extends BaseAdapter{ 
    private LayoutInflater mInflater; 


    public IconAdapter(Context cxt){ 
    mInflater = LayoutInflater.from(cxt); 


    } 

    public class ViewHolder{ 
    private TextView title; 
    private TextView date; 
    private TextView desc; 
    private ImageView thumb; 
    } 

    public View getView(int positiion, View convertView, ViewGroup parent){ 
    ViewHolder holder; 

    if (convertView==null){ 
    convertView = mInflater.inflate(R.layout.row, null); 

    holder = new ViewHolder(); 

    holder.title = (TextView) convertView.findViewById(R.id.title); 
    holder.date = (TextView) convertView.findViewById(R.id.date); 
    holder.desc = (TextView) convertView.findViewById(R.id.deskripsi); 
    holder.thumb = (ImageView) convertView.findViewById(R.id.thumbnail); 

    convertView.setTag(holder); 
    }else{ 

    holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.title.setText(titles.get(positiion)); 
    holder.date.setText(date_post.get(positiion)); 
    holder.desc.setText(descs.get(positiion).substring(0, 55)+"..."); 
    Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 

    holder.thumb.setImageDrawable(draw); 

    return convertView; 
    } 
    /* this method take image from url that retrieve from xml*/ 
    public Drawable LoadImageFromWebOperation(String url){ 
    try{ 
    InputStream is = (InputStream) new URL(url).getContent(); 
    Drawable d = Drawable.createFromStream(is, "src name"); 
    return d; 
    }catch (Exception e){ 
    Log.d("image", url, e); 
    return null; 
    } 
    } 

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

    @Override 
    public Object getItem(int position) { 
    return messages.get(position); 
    } 

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

} 
+0

Edite y formatee el código en su pregunta para comprender mejor su problema. –

+0

thx. eliminé un código Espero que puedas entender el problema – Rahadyanteja

+0

@Raha, en tu constructor, haz todas tus solicitudes URL y guárdalas en una matriz, en el 'getView' no las cargues nuevamente ... eso lo acelerará. – st0le

Respuesta

12
public View getView(int positiion, View convertView, ViewGroup parent){ 
     ... 
     Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 
     ... 
    } 

Este es el problema. Nunca deberías hacer redes en el hilo de UI. Implemente alguna tarea asíncrona para el trabajo. Además, puede usar la herramienta traceview http://developer.android.com/guide/developing/tools/traceview.html para determinar los cuellos de botella de rendimiento.

+0

gracias por las puntas de boulder. – Rahadyanteja

4

este es su problema, aquí ..

Drawable draw = LoadImageFromWebOperation(image.get(positiion)); 

En lugar de hacer peticiones de URL repetidas en su getView(), Haga todas sus peticiones a la vez y almacenar el Drawables en una matriz, y luego usar la matriz en el interior el getView. Esto lo hará considerablemente más rápido ...

+0

yup. Lo hice y funciona perfectamente. thx para la solución. – Rahadyanteja

0
Please use View Holder pattern in getview. 

ViewHolder holder = null; 

String fileName = arrfiles.get(position); 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      LayoutInflater inflator = ((Activity) context).getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.unsubmited_row, parent, 
        false); 
      convertView.setClickable(false); 
     } 
     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.txtFileName = (TextView) convertView 
       .findViewById(R.id.txtFileName); 
     holder.txtisActive = (TextView) convertView 
       .findViewById(R.id.txtIsActive); 
     holder.txtFileName.setText(fileName); 
     convertView.setTag(holder); 
Cuestiones relacionadas