2013-07-25 92 views
0

我以前工作的PHP和JS,最近我在Android的ListView 工作然而,我在列表視圖中創建一個自定義適配器遇到問題如何添加例如5個元素到android中的10行listview?

public View getView(int arg0, View arg1, ViewGroup arg2) { 
     // TODO 
     if (arg1 == null) { 
      arg1 = myInflater.inflate(R.layout.grid, arg2, false); 
     } 
     TextView name = (TextView) arg1.findViewById(R.id.text1); 
     TextView desc = (TextView) arg1.findViewById(R.id.text2); 
     ImageView image = (ImageView) arg1.findViewById(R.id.image1); 
     if (arg0 < images.length) { 
      image.setImageResource(images[arg0]); 
     } 
     name.setText(names[arg0]); 
     desc.setText(description[arg0]); 
     return arg1; 
    } 

問題是我有3個數組的內容傳遞給listview網格,對於前兩個數組,有10個元素,最後一個只有5個。所以,它是最後一個界限。我添加了一個條件來檢查它是否超過5,但args0似乎沒有根據行增加?

if (arg0 < images.length) { 
       image.setImageResource(images[arg0]); 
      } 

前五行和其他一些行也有圖像設置,爲什麼是這樣以及如何解決這個問題?感謝

+0

(1)如何使用陣列?你是否試圖同時顯示所有3個數據?或一次只有一個? (2)你設置的args0是對象的位置,那麼它將如何超出你傳入的數組的長度? – Rarw

+0

感謝您的回覆。前兩個數組是名稱和性別,最後一個數組是照片的成員,有10個memebrs,但只有前5個memebers有照片 – user782104

+0

每行有3個項目 – user782104

回答

1

一般來說

,因爲要顯示Data到您的列表,PLX創建一個代表數據的對象。

就像你在您的評論上面提到:

public class ListEntry { 
    String name = ""; 
    String gender = "";//use enum here perhaps -.- 
    String photoUrl = null; //or use byte[] photo or whatever you've stored in your array before 
    // write getters/setters for your members 
} 

那麼你可以使用一個陣列ListEntry[](或列表<一個ListEntry >)訪問所有數據。這樣你可以繞過你的indexOutOfBoundsException。

在線查找任何listadapter教程,例如一個來自Vogella

爲什麼超過前五個條目有一個圖像?

Androids適用於Listviews的適配器實現了一種緩存機制,以將新列表項(例如行)的膨脹(性能/內存成本密集型)降到最低。因此只有儘可能多的行(或者更多)被創建,如列表所示。由於您只設置圖像(如果有),但不會從行中移除已設置的圖像,則會導致某些行重放不應該顯示的圖像。這些行是從先前滾動的行緩存的。

因此添加像

if (listItem.photo != null) { 
    image.setImageResource(images[arg0]); 
} else { 
    image.setVisibility(View.GONE); 
} 

爲列表視圖,參考和他們的緩存機制的東西看Romain Guy on ListViews

編輯關於Listadapter的使用

你上面貼的getView(..)是你ListAdapter裏面執行,最好你已經延長了ArrayAdapter<T>。如果是這樣,你的T現在應該說明ListEntry,你有任何代碼行

MyArrayAdapter myAdapter = new MyArrayAdapter()或類似的東西。

現在你有一個像List<ListEntry> myCollection = new ArrayList<ListEntry>()ListEntry[] listEntries = new ListEntry[10]一個ListEntry數組或列表,並使用

myAdapter.addAll(listEntries);

進去你getView(..)您可以使用您的列表的項目:

ListEntry currentEntry = getItem(arg0);

並引用currentEntry的單個成員來設置它們;-)

+1

該死的快速upvote wtf :-) ty –

+0

對不起,我對此感到陌生,我創建了一個新的ListEntry類,該如何設置ListEntry數組? – user782104

+1

沒問題,稍等片刻plx –

0

什麼

if (images[arg0] != null) image.setImageResource(images[arg0]); 

+0

不工作,仍java.lang.ArrayIndexOutOfBoundsException:length = 5;索引= 5 – user782104

相關問題