2013-08-20 2 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); 
} 

Примечание: Я сожалею, чтобы получить возможность отправлять как это, но я в отчаянии. Я уже отлаживал его до последней строки, и все загружено и исключений нет. Но он просто не заселен.

[EDIT]

Вместе с выбранным ответом Я также имел различные массивы и пронумерованные идентификаторы. Ид, сгенерированный мной, начинался с 1, а не 0.

+0

Вы никогда не добавляете контент для своего адаптера. Ваш адаптер считает, что у него есть пустой набор данных. Вам нужно вызвать adapter.addAll (DeviceList.list); – dymmeh

+0

Вы переопределили метод getCount() 'в вашем адаптере? В вашей реализации он должен выглядеть как 'int getCount() {return ids.length;} – Vladimir

+0

удалить android: layout_centerVertical = "true" android: layout_alignParentLeft = "true" – bashu

ответ

2

Вы никогда не передаете набор данных в суперкласс. Изменение

super(context, rowResourceId); 

с

super(context, rowResourceId, devices); 

таким образом GetCount из ArrayAdapter, возвращает длину устройства и GetView будет вызван. Кроме того, чтобы избежать потери памяти и повышения производительности, вы должны раздуть convertView только один раз.

Редактировать. Супер ожидает объекты Array или ArrayList устройства. Вместо этого ваши устройства в массиве String. Ваш выбор должен быть последовательным. Вы можете либо изменить

extends ArrayAdapter<Device> 

с

extends ArrayAdapter<String> 

или передать в качестве параметра Я Device[] в качестве параметра пользовательского адаптера. Например

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

Пробовал это, и нет конструктора с этой подписью. –

Смежные вопросы