2010-12-19 103 views
1

伊夫用這個至今:Android的發展:列表視圖圖像

setListAdapter(new ArrayAdapter<String>(this,R.layout.list, R.id.label, names)); 

list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" android:layout_width="match_parent"> 

    <ImageView android:id="@+id/icon" 
    android:layout_height="wrap_content" 
    android:src="@drawable/icon" 
    android:layout_width="22px" 
    android:layout_marginTop="15px" 
    android:layout_marginRight="4px" 
    android:layout_marginLeft="4px"> 
     </ImageView> 

    <TextView android:text="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
     android:id="@+id/label" android:textSize="35px"></TextView> 



</LinearLayout> 

這一工程然而我的問題是如何使每一個項目獨特的(我有很多的圖片在R.drawable)

所以在項目狗我想要一個狗的圖片和貓項目將成爲一隻貓。現在每個項目都是默認的應用程序圖標。

謝謝!

+0

我覺得carefacerz,你可以使用定製的類擴展ArrayAdapter併爲getView方法中的不同行指定不同的圖像。 – 2010-12-19 04:42:20

+0

這是一個與您的問題無關的建議,但嘗試在定義尺寸時避免使用像素。您的觀點不能在具有不同屏幕密度的不同設備上進行擴展。出於這個原因,總是使用sp來表示文字,而其他所有東西都使用dip – jagsaund 2010-12-19 05:30:58

+0

好的,謝謝@ jagsaund我應該用什麼sp? DP? – carefacerz 2010-12-19 11:40:20

回答

1

您當前的實現應該將文本數據從您的名稱數據對象綁定到textview。圖像視圖不顯示正確圖像的原因是因爲適配器無法與圖像視圖進行通信。數組適配器的底層實現將使您的list.xml視圖充滿活力,並從該list.xml中拉出R.id.label表示的視圖。它會檢查該視圖是textview還是imageview。如果不是,它會拋出異常。然後它會將名稱數據對象中的數據綁定到textview。

您需要的是指定一個自定義適配器,並確保您的數據模型包含名稱的字符串和對圖像資源的引用 - 在您的情況下它將是一個整數。

這裏有一個樣品名稱的對象可能爲你工作:

public class Name 
{ 
    private String _name; 
    private int _imageResourceId; 

    public void Name(String name, int resId) 
    { 
     _name = name; 
     _imageResourceId = resId; 
    } 

    public void setImageResId(int resId) 
    { 
     _imageResrouceId = resId; 
    } 

    public void setName(String name) 
    { 
     _name = name; 
    } 

    public int getImageResId() 
    { 
     return _imageResourceId; 
    } 

    public String getName() 
    { 
     return _name; 
    } 
} 

通過創建類和擴展BaseAdapter開始和落實getView爲getPosition,getCount將等

這裏有一個樣品適配器這可能爲你工作得好:

public class NameAdapter extends BaseAdapter 
{ 
    private Name[] _data; 
    private LayoutInflater _inflater; 

    public NameAdapter(Context context, Name[] data) 
    { 
     _data = data; 
     _inflater = LayoutInflater.from(context); 
    } 

    public int getCount() 
    { 
     if(_data != null) 
     { 
      return _data.length; 
     } 
     else 
     { 
      return 0; 
     } 
    } 

    public Object getItem(int position) 
    { 
     if(_data != null) 
     { 
      return _data[position]; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public long getItemId(int position) 
    { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder = null; 

     if(convertView == null) 
     { 
      convertView = _inflater.inflate(R.layout.list, parent); 
      holder = new ViewHolder(); 
      holder._image = (ImageView) convertView.findViewById(R.id.icon); 
      holder._label = (TextView) convertView.findViewById(R.id.label); 

      convertView.setTag(holder); 
     } 

     if(holder == null) 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder._image.setImageResource(_data[position].getImageResourceId()); 
     holder._label.setText(_data[position].getName()); 
    } 

    static class ViewHolder 
    { 
     TextView _label; 
     ImageView _image; 
    } 

} 

*注:我沒有測試過這一點,所以你可能需要調整這一點。

此外,作爲優化我建議改變你的list.xml到:

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/label" 
    android:textSize="16sp" /> 

隨着TextView的,您可以使用「setCompoundDrawable」或「setCompoundDrawablesWithIntrinsicBounds」,真正優化您的佈局。複合繪圖允許您將圖像放置在文本視圖的左側或右側或上方或下方。我建議你看看api文檔中的進一步實現細節。

希望有幫助!

+0

謝謝,有一些錯誤,介意給我鏈接,你發現這個? – carefacerz 2010-12-19 09:30:01