2010-12-22 18 views
6

faceci Mam problem z moim listview. Działa tak wolno, gdy przewijanie może mi pomóc. Moja lista jest niestandardowym układem przy użyciu wartości względnej z 3 widokiem tekstowym i 1 widokiem każdego wiersza, a cała zawartość jest pobierana z internetu. Używam niestandardowego adaptera i uchwytu widoku.Android niestandardowy listview bardzo powolny podczas przewijania

Poniżej znajdują się moje kody dotyczące korzystania z adaptera.

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

Edytuj i sformatuj kod w swoim pytaniu, aby lepiej zrozumieć swój problem. –

+0

thx. Usunąłem kod. mam nadzieję, że możesz zrozumieć problem – Rahadyanteja

+0

@Raha, w swoim konstruktorze, Utwórz wszystkie żądania URL i zapisz je w tablicy, w 'getView' nie ładuj ich ponownie ... to przyspieszy. – st0le

Odpowiedz

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

To jest problem. Nigdy nie powinieneś nigdy tworzyć sieci w wątku UI. Zaimplementuj jakieś asynchroniczne zadanie dla zadania. Można również użyć narzędzia traceview http://developer.android.com/guide/developing/tools/traceview.html do określenia wąskich gardeł wydajności.

+0

dzięki za napiwek boulder. – Rahadyanteja

4

To jest twój problem, tutaj ..

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

Zamiast wielokrotnych próśb URL w getView(), Pozwól wszystkich żądań naraz i zapisać Drawables w tablicy, a następnie użyć tablicę wewnątrz getView. To sprawi, że będzie to znacznie szybsze ...

+0

tak. Zrobiłem to i działa idealnie. thx za rozwiązanie. – 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); 
Powiązane problemy