代码之家  ›  专栏  ›  技术社区  ›  Moises Jimenez

自定义ListView未填充

  •  0
  • Moises Jimenez  · 技术社区  · 13 年前

    我已经处理这个问题好几个星期了。我已经看到了所有其他相关的问题,但这并没有帮助。我正在尝试填充一个自定义 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);
    }
    

    注意:我很抱歉发布这样的帖子,但我很绝望。我已经调试到最后一行了,所有内容都已加载,没有异常。但它就是不会出现。

    [编辑]

    除了选择的答案,我还有不同的编号数组和id。我生成的ID是从1开始的,而不是从0开始的。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Blackbelt    13 年前

    您永远不会将数据集传递给超级类。改变

    super(context, rowResourceId);
    

    具有

    super(context, rowResourceId, devices);
    

    通过这种方式,ArrayAdapter的getCount返回设备长度,并调用getView。此外,为了避免内存浪费和更好的性能,您应该只膨胀convertView一次。

    编辑super需要设备对象的Array或ArrayList。取而代之的是字符串数组中的设备。你的选择应该是一致的。你可以改变

    extends ArrayAdapter<Device>
    

    具有

    extends ArrayAdapter<String>
    

    或作为参数a传递 Device[] 作为自定义适配器的参数。例如

    public DeviceArrayAdapter(Context context, int rowResourceId, Device[] devices) {
    
        2
  •  0
  •   akelix    13 年前