Android: о ListView и SimpleAdapter

Я пытался использовать SimpleAdapter для заполнения ListView, но только безуспешно.

Я прочитал много случаев, но до сих пор не могу найти полезный метод.

Вот Кодекс. Интересно, в чем проблема.

ArrayList<HashMap<String,Object>> listdata=new ArrayList<HashMap<String,Object>>();

    for (int i=0;i<3;i++){
        HashMap<String, Object> hm = new HashMap<String, Object>();
        hm.put("title", "title");
        hm.put("context", "context");

        listdata.add(hm);
    }

    String[] from = {"title", "context"};
    int[] to={R.id.title,R.id.context};

    SimpleAdapter adapter = new SimpleAdapter(this, listdata, R.layout.list_item, from, to);
    ListView lv=(ListView)this.findViewById(R.id.listView1);
    lv.setAdapter(adapter);

//код для list_item

<LinearLayout
<ListView android:layout_height="wrap_content" android:id="@+id/listV1" android:layout_width="match_parent">
<LinearLayout>
<TextView android:layout_height="wrap_content" android:id="@+id/title" android:text="TextView" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
<TextView android:text="TextView" android:id="@+id/context" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>
</ListView>

I do appreciate if anyone can help!


person Yuhao_Zhu    schedule 28.07.2011    source источник
comment
Можете ли вы обновить свой вопрос с помощью двух файлов макета, опубликованный вами Xml выглядит плохо вырезанием и вставкой   -  person Rob    schedule 28.07.2011


Ответы (2)


Я подозреваю, что проблема связана с вашим Xml, попробуйте объявить второй файл макета для элемента списка. например

ваша_активность.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <ListView android:layout_height="wrap_content" android:id="@+id/listView1" android:layout_width="fill_parent" />   
</LinearLayout>

и list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <TextView android:layout_height="wrap_content" android:id="@+id/title" android:text="TextView" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
    <TextView android:text="TextView" android:id="@+id/context" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>    
</LinearLayout>

Ваш код выглядит нормально и должен работать правильно, если вы используете два вышеуказанных файла макета.

person Rob    schedule 28.07.2011
comment
Спасибо за ваш комментарий. Это действительно работает после того, как я изменил list_item - person Yuhao_Zhu; 28.07.2011

Я всегда помещал элементы списка в отдельный XML-файл. Возможно, попробуйте поместить LinearLayout с двумя TextView в файл (возможно, назовите его listrow.xml).

В качестве примера:

Вот элемент списка (list_stat_item.xml):

<LinearLayout android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView android:text="" android:id="@+id/txtKey"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dp" android:textSize="16sp"></TextView>
    <TextView android:text="" android:id="@+id/txtValue"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dp" android:textSize="16sp"></TextView>

</LinearLayout>

А вот основной вид (view_stats.xml):

<LinearLayout android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">

    <ListView android:id="@android:id/list" android:layout_width="fill_parent"
        android:layout_height="0dip" android:layout_weight="1"
        android:transcriptMode="normal" android:divider="@drawable/list_divider"
        android:dividerHeight="1px" />


</LinearLayout>

А вот код:

Создайте список ArrayList и добавьте в него элементы, а затем привяжите его к пользовательскому адаптеру.

ArrayList<StatItem> lst = new ArrayList<StatItem>();

        lst.add(new StatItem("Current Week: ", String.valueOf(currentWeek)));
        lst.add(new StatItem("Weeks Left: ", String.valueOf(GeneralUtils.daysUntilBirth(this, pregnancyID) / 7)));
        lst.add(new StatItem("Days Left: ", String.valueOf(GeneralUtils.daysUntilBirth(this, pregnancyID))));
        lst.add(new StatItem("Current Trimester: ", String.valueOf(currentTrimester)));
        lst.add(new StatItem("Posts: ", String.valueOf(blogCount)));
        lst.add(new StatItem("Baby Names: ", String.valueOf(babyNamesCount)));



        getListView().setSelector(android.R.color.transparent);
        StatListAdapter sa = new StatListAdapter(this, R.layout.list_stat_item, lst );
        setListAdapter(sa);

Если вы хотите увидеть код адаптера (StatListAdapter расширяет ArrayAdapter):

public class StatListAdapter extends ArrayAdapter<StatItem>
    {
        public ArrayList<StatItem> items;
        public StatListAdapter(Context context, int textViewResourceId, ArrayList<StatItem> objects) {
            super(context, textViewResourceId, objects);
            this.items = objects;

        }

        public View getView(int position, View convertView, ViewGroup parent)
        {
            View v = convertView;
            if (v == null)
            {
                LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = li.inflate(R.layout.list_stat_item, null);

            }
            StatItem i = items.get(position);
            if (i != null)
            {
                TextView kt = (TextView)v.findViewById(R.id.txtKey);
                TextView vt = (TextView)v.findViewById(R.id.txtValue);

                            kt.setText(i.key);
                            vt.setText(i.value);

            }


            return v;

        }

    }
person Jack    schedule 28.07.2011
comment
Спасибо за ваши усилия. Вы действительно делаете большую работу. Это еще один метод решения этой проблемы. Я нашел свою ошибку. Это вызвано list_item.xml. - person Yuhao_Zhu; 28.07.2011