2010-12-22 32 views
6

Tôi gặp sự cố với chế độ xem danh sách của mình. Nó chạy rất chậm khi cuộn ai cũng có thể giúp tôi. Chế độ xem danh sách của tôi là bố cục tùy chỉnh sử dụng tương đối với 3 lần xem văn bản và 1 lần xem mỗi hàng với tất cả nội dung được truy xuất từ ​​web. Tôi sử dụng bộ điều hợp tùy chỉnh và bộ giữ chế độ xem.chế độ xem danh sách tùy chỉnh android rất chậm khi cuộn

dưới đây là mã của tôi về cách tôi sử dụng bộ điều hợp.

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

Chỉnh sửa và định dạng mã trong câu hỏi của bạn để hiểu rõ hơn vấn đề của bạn. –

+0

thx. Tôi đã xóa một số mã. hy vọng bạn có thể hiểu được vấn đề – Rahadyanteja

+0

@Raha, trong hàm tạo của bạn, Thực hiện tất cả các yêu cầu URL của bạn và lưu trữ chúng trong một mảng, trong 'getView' không tải chúng lại ... mà sẽ tăng tốc nó lên. – st0le

Trả lời

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

Đây là vấn đề. Bạn không bao giờ nên thực hiện kết nối mạng trong chuỗi giao diện người dùng. Triển khai một số tác vụ không đồng bộ cho công việc. Ngoài ra, bạn có thể sử dụng công cụ traceview http://developer.android.com/guide/developing/tools/traceview.html để xác định tắc nghẽn hiệu suất.

+0

cảm ơn vì những lời khuyên tảng đá. – Rahadyanteja

4

Đây là vấn đề của bạn, ngay tại đây ..

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

Thay vì làm cho yêu cầu URL lặp đi lặp lại trong getView() bạn, Làm cho tất cả các yêu cầu của bạn cùng một lúc và lưu trữ các Drawables trong một mảng, và sau đó sử dụng mảng bên trong số getView. Điều này sẽ làm cho nó nhanh hơn đáng kể ...

+0

yup. Tôi đã làm điều đó và nó hoạt động hoàn hảo. thx cho giải pháp. – 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); 
Các vấn đề liên quan