2010-12-22 1 views
6

ребята У меня проблема с моим списком. Он работает так медленно, когда прокрутка может помочь мне. My listview - это настраиваемый макет с использованием относительного с 3 текстовыми полями и 1 обрамлением каждой строки со всем содержимым, извлекаемым из Интернета. Я использую пользовательский адаптер и держатель вида.android custom listview очень медленно при прокрутке

Ниже приведены мои коды о том, как я использую адаптер.

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

Редактировать и форматировать код в своем вопросе, чтобы лучше понять вашу проблему. –

+0

thx. Я удаляю код. надеюсь, что вы поймете проблему. – Rahadyanteja

+0

@Raha, в вашем конструкторе, сделайте все ваши URL-запросы и сохраните их в массиве, в 'getView' не загрузите их снова ... это ускорит его. – st0le

ответ

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

Это проблема. Вы никогда не должны создавать сети в потоке пользовательского интерфейса. Реализовать некоторую асинхронную задачу для задания. Кроме того, вы можете использовать инструмент traceview http://developer.android.com/guide/developing/tools/traceview.html, чтобы определить узкие места производительности.

+0

спасибо за советы валуна. – Rahadyanteja

4

Это ваша проблема, здесь ..

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

Вместо того, чтобы повторные запросы URL в вашем getView(), сделать все ваши запросы на один раз и хранить Drawables в массиве, а затем использовать массив внутри getView. Это сделает его значительно быстрее ...

+0

yup. Я сделал это, и он отлично работает. thx для решения. – 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^