2012-02-06 32 views
9

Tôi biết có vài câu hỏi liên quan đến vấn đề này 'getView được gọi là vài lần' nhưng vấn đề của tôi có chút khác biệt.ListView - getView được gọi là quá nhiều lần

Tôi có danh sách tùy chỉnhXem với hàng tùy chỉnh (đã sử dụng row_layout.xml). Nó thường hoạt động tốt. Lúc đầu, tôi đã có một vấn đề với nhiều cuộc gọi đến getView và nó đã được cố định bằng cách sử dụng một trong những phương pháp tôi thấy ở đây trong stackoverflow. (sử dụng mảng 'usedPositions').

bây giờ, tôi thấy trong nhật ký trường hợp này: getView pos 0, getView pos 1, getView pos 0, getView pos 1. Điều này khiến hàng của tôi tăng gấp đôi. Nó chỉ xảy ra khi tôi gọi một hoạt động mới bao gồm hoạt động hiện tại và sau đó đóng hoạt động đó. (ví dụ, mở hoạt động của máy ảnh và sau đó đóng nó).

tôi sẽ hiển thị mã của tôi:

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View row = convertView; 
    Toast toast = Toast.makeText(this.context, "getView " + position, 1000); 
    toast.show(); 
    String pos = Integer.toString(position); 
    if (!usedPositions.contains(pos)) { 

     CardHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new CardHolder(); 
      //holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtCouponTitle = (TextView)row.findViewById(R.id.txtTitle); 
      holder.txtBusinessName = (TextView)row.findViewById(R.id.txtBusinessName); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (CardHolder)row.getTag(); 
     } 

     Card card = data.get(position); 
     holder.txtCouponTitle.setText(card.couponTitle); 
     holder.txtBusinessName.setText(card.businessName); 
     //holder.imgIcon.setImageResource(card.icon); 

     TableLayout table = (TableLayout)row.findViewById(R.id.imagesTable); 
     for (int r=1; r<=1; r++){ 
      TableRow tr = new TableRow(this.context); 
      for (int c=1; c<=10; c++){ 
       ImageView im = new ImageView (this.context); 
       im.setImageDrawable(this.context.getResources().getDrawable(c<= card.numberOfStamps ? R.drawable.stamp_red :R.drawable.stamp_grey)); 
       im.setPadding(6, 0, 0, 0); //padding in each image if needed 
       //add here on click event etc for each image... 
       //... 
       tr.addView(im, 40,40); 
      } 
      table.addView(tr); 
     } 

     // Your code to fill the imageView object content 
     usedPositions.add(pos); // holds the used position 
    } 
    else 
     usedPositions.remove(pos); 

    return row; 
} 

Bạn có thể cho tôi biết chuyện gì vậy?

+0

Bản sao có thể có của [phương pháp getView bộ điều hợp danh sách tùy chỉnh được gọi nhiều lần và không có thứ tự nhất quán] (http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called- nhiều lần và không có đồng) – engincancan

Trả lời

10

Quoting kỹ sư android RomainGuy

Đây không phải là một vấn đề, đó là hoàn toàn không có sự bảo đảm về trình tự trong mà getView() sẽ được gọi và cũng không bao nhiêu lần.

Vì vậy, tốt nhất bạn có thể xử lý là re-using the existing views (bố cục hàng) đúng cách.

Here is another bài đăng tốt.

+0

bạn có thể đề xuất cách sử dụng lại nó không? –

+0

xem [liên kết thứ hai] (http://android.amberfog.com/?p=296) .. –

+0

Tôi nhận lỗi stackoverflow trong listview và theo @LalitPoptani gọi đệ quy đến một phương thức tạo ngoại lệ này. Tôi đang sử dụng Android 2.3. Hãy chia sẻ quan điểm của bạn. – MKJParekh

Các vấn đề liên quan