2013-08-20 172 views
0

我已經處理了幾個星期了。我已經看到所有其他相關的問題,並沒有幫助。我試圖填充自定義ListView,並不能讓我的生活得到它的工作。我會發布所有相關信息,希望有人會注意到我的錯誤。自定義ListView未填充

活動佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       tools:context=".MainActivity" 
       android:background="#000000"> 

    <ListView 
    android:id="@+id/deviceListView" 
    android:layout_width="400px" 
    android:layout_height="fill_parent" 
    android:textColor="#ffffff" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true"/> 
</LinearLayout> 

定製行佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:background="#000000"> 
    <TextView android:id="@+id/textId" 
       android:textSize="50sp" 
       android:text="ID" 
       android:textColor="#FFFFFF" 
       android:textStyle="bold" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 
    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
      android:orientation="vertical"> 
    <TextView android:id="@+id/textTimestamp" 
       android:textSize="16sp" 
       android:text="Timestamp" 
       android:textColor="#FFFFFF" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"/> 
       android:layout_height="wrap_content"/> 

    <TextView android:id="@+id/textCoordinates" 
       android:textSize="16sp" 
       android:text="Coordinates" 
       android:textColor="#FFFFFF" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"/> 

    <TextView android:id="@+id/textDistance" 
       android:textSize="16sp" 
       android:text="Distance" 
       android:textColor="#FFFFFF" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"/> 
    </LinearLayout> 
</LinearLayout> 

適配器模型:

public class DeviceList { 
    public static ArrayList<Device> list; 

    public static void loadModel(int quantity) { 
     ArrayList<Device> listTmp = new ArrayList<Device>(); 
     for (int i = 0; i < quantity; i++) { 
      listTmp.add(new Device(System.currentTimeMillis(), i, new float[]{0, 0}, System.currentTimeMillis()/(i + 1))); 
     } 
     list = listTmp; 
    } 

    public static Device GetById(int id){ 
     Device tmp = null; 
     for(Device device : list){ 
      if (device.getID() == id){ 
       tmp = device; 
      } 
     } 
     return tmp; 
    } 
} 

適配器:

public class DeviceArrayAdapter extends ArrayAdapter<Device> { 
    private Context context; 
    private int rowResourceId; 
    private String[] ids; 

    public DeviceArrayAdapter(Context context, int rowResourceId, String[] devices) { 
     super(context, rowResourceId); 
     this.context = context; 
     this.ids = devices; 
     this.rowResourceId = rowResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.device_row, parent, false); 
     TextView idTextview = (TextView) rowView.findViewById(R.id.textId); 
     TextView timeStampTextview = (TextView) rowView.findViewById(R.id.textTimestamp); 
     TextView coordinatesTextview = (TextView) rowView.findViewById(R.id.textCoordinates); 
     TextView distanceTextview = (TextView) rowView.findViewById(R.id.textDistance); 
     int id = Integer.parseInt(ids[position]); 
     timeStampTextview.setText(Long.toString(DeviceList.GetById(id).getTimestamp())); 
     idTextview.setText(DeviceList.GetById(id).getID()); 
     coordinatesTextview.setText(DeviceList.GetById(id).getCoordinates()[0] + "," + DeviceList.GetById(id).getCoordinates()[1]); 
     distanceTextview.setText(DeviceList.GetById(id).getDistance() + ""); 
     return rowView; 
    } 
} 

最後活動的onCreate方法:

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
//  setContentView(R.layout.activity_main); 

//  ArrayList<Device> list = createDummyDeviceList(5); 
     DeviceList.loadModel(5); 
     String[] ids = new String[DeviceList.list.size()]; 
     for (int i= 0; i < ids.length; i++){ 

      ids[i] = Integer.toString(i+1); 
     } 
     ListView listView = (ListView) findViewById(R.id.deviceListView); 
     DeviceArrayAdapter adapter = new DeviceArrayAdapter(this, R.layout.device_row, ids); 
     listView.setAdapter(adapter); 
} 

注:我很抱歉張貼這樣的,但我絕望。我已經將它調試到最後一行,並且一切都已加載,並且沒有例外。但它只是不會填充。

[編輯]

與所選擇的回答我也有不同編號的數組和IDS

一起。我生成的ID從1開始,而不是從0開始。

+0

您從不實際添加要顯示的適配器的內容。您的適配器認爲它有一個空的數據集。你需要調用adapter.addAll(DeviceList.list); – dymmeh

+0

你在適配器中覆蓋'getCount()'方法嗎?在你的實現中它應該看起來像'int getCount(){return ids。長度;} – Vladimir

+0

刪除 android:layout_centerVertical =「true」 android:layout_alignParentLeft =「true」 – bashu

回答

2

您從不將數據集傳遞給超類。更改

super(context, rowResourceId); 

super(context, rowResourceId, devices); 

這樣一個ArrayAdapter的getCount將返回該設備的長度和getView將被調用。另外爲了避免浪費內存和提高性能,您只應該使convertView膨脹一次。

編輯。 super期望Device對象的Array或ArrayList。而不是你的設備在一個字符串數組。你的選擇應該是一致的。您可以更改

extends ArrayAdapter<Device> 

extends ArrayAdapter<String> 

或通過作爲一個放慢參數爲Device[]參數自定義適配器。例如

public DeviceArrayAdapter(Context context, int rowResourceId, Device[] devices) { 
+0

試過這樣做,並沒有該簽名的構造函數。 –