2012-02-08 102 views
2

我有一個ListView與自定義BaseAdapter.Every列表項有一個可點擊的按鈕。 private List items = new ArrayList();如何停止凍結listView

public View getView(final int position, View convertView, ViewGroup parent) { 

     View v = null; 
     try { 
      v = inflater.inflate(R.layout.row, null); 

      TextView name = (TextView)v.findViewById(R.id.textView); 
      name.setText(items.get(position).getName()); 


      imageButton = (ImageButton) v.findViewById(R.id.Button); 
      imageButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // do something 
       } 
      }); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return v; 
    } 

我的問題是,當我滾動列表時,應用程序凍結。 我該如何解決它?

回答

3

您每次都創建一個新視圖,它與listview完全相反,它重用視圖。

View v = null取出並使用convertView參數傳入。

public View getView(final int position, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     convertView = inflater.inflate(R.layout.row, null); 
    } 

    TextView name = (TextView)convertView.findViewById(R.id.textView); 
    name.setText(items.get(position).getName()); 

    imageButton = (ImageButton) convertView.findViewById(R.id.Button); 
    /* NB 
    For efficiency sake see the link in Sparky's answer about itemClickListeners 
    instead of using onClickListeners 
    */ 
    imageButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // do something 
     } 
    }); 

    return convertView; 
} 
+1

這對每次調用getView()時都會創建一個新的'OnClickListener',即至少對每一行。 – 2012-02-08 20:04:49

+0

啊,是的,我會編輯並記下它 – triggs 2012-02-08 20:07:08

+2

你甚至可以通過使用ViewHolder模式來改善。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html – 2012-02-08 20:09:51