如何根据对象的字段设置列表项的不同顶行和底行?

时间:2014-07-14 22:14:35

标签: android listview android-listview listitem

我有一个名为Vendible的对象有idnameString个)。为了表示其中的几十个而不实际存储数十个内存,我有一个名为CondensedVendible的类,它扩展Vendible并添加count变量(byte)。

目前,我正在填写我的列表,例如示例代码:

    setListAdapter(
            new ArrayAdapter<Vendibles.Vendible>(
                getActivity(),
                android.R.layout.simple_list_item_activated_1,
                android.R.id.text1,
                Vendibles.ITEMS
            )
    );

但是,这只是使用CondensedVendible#toString()的返回来填充每个列表项。相反,我希望它们看起来像:

[CondensedVendible#name]
[CondensedVendible#count] left

与大多数Android设置屏幕在每个列表项中都有设置名称和简短描述的方式大致相同。

我看过blogsother SO answers,但我无法理解它们! 任何人都可以帮我理解如何做到这一点吗?

更新


我想我已经接近了。这就是我现在所拥有的:

爪哇

    setListAdapter(
            new SimpleAdapter(
                    getActivity(),
                    Vendibles.toMapList(),
                    android.R.layout.two_line_list_item,
                    new String[] { Vendibles.MAP_NAME, Vendibles.MAP_COUNT },
                    new int[] { R.id.list_item_line_1, R.id.list_item_line_2 }
            )
    );

[meanwhile, in Vendibles.java...]

public static final String MAP_COUNT = "count", MAP_NAME = "name";
public static List<Map<String, String>> toMapList()
{
    List<Map<String, String>> ret = new ArrayList<Map<String, String>>();
    for(Vendible v : ITEMS) {
        if (v == null) continue; // no use trying to process notyhing
        Map<String, String> uselesslySmallMap = new HashMap<String, String>();
        uselesslySmallMap.put(MAP_COUNT,
            (v instanceof CondensedVendible
                ? ((CondensedVendible) v).count
                : (byte)1
            )+"" // safer than toString, shorter than String.valueOf
        );
        uselesslySmallMap.put(MAP_NAME, v.name);

        ret.add(uselesslySmallMap);
    }
    return ret;
}

XML

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Line 1"
        android:id="@+id/list_item_line_1"
        android:textColor="@android:color/primary_text_dark" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Line 2"
        android:id="@+id/list_item_line_2"
        android:textColor="@android:color/secondary_text_dark" />
</LinearLayout>

但它现在呈现空白列表项目!它不像我传递一个空列表,因为它有正确数量的它们,它们只是没有&#39 ; t显示任何文字!

2 个答案:

答案 0 :(得分:1)

你有没有看过android sdk中的simple_list_item_activated_1.xml?它在下面:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

这是一个TextView。如果您想要更复杂的自定义项目,则需要提供自己的自定义项目布局和列表适配器 一个快速的谷歌将提出许多关于如何实现自己的自定义项目的教程: http://www.ezzylearning.com/tutorial.aspx?tid=1763429
http://hmkcode.com/android-custom-listview-items-row/
http://www.vogella.com/tutorials/AndroidListView/article.html
http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/
http://codehenge.net/blog/2011/05/customizing-android-listview-item-layout/

答案 1 :(得分:1)

注意:我正在添加第二个答案,因为您的更新确实在问第二个问题。

SimpleList构造函数中的第二个参数是List of Maps。这些地图中的每一个都包含项目的数据 在您的情况下,每个映射将包含2个条目。第一个将项目的名称映射到键“name”,第二个将计数映射到键“count”。

比如说,您的Vendible类有一个名称字段和一个计数字段,如下所示:

public class Vendible {
    public String name;
    public int count;
}

且vendibles是您的Vendible类的SparseArray。然后,您可以使用您的项目填充HashMaps列表:

SparseArray<Vendible> vendibles = new SparseArray<Vendible>;
ArrayList<HashMap<String,String>> vendibleList = new ArrayList<HashMap<String,String>>();
...

HashMap<String, String> vendibleItem;
Vendible vendible;
for(int i = 0; i < vendibles.size(); i++) {
    vendibleItem = new HashMap<String, String>;

    vendible = vendibles.valueAt(i);
    vendibleItem.put("name", vendible.name);
    vendibleItem.put("count", vendible.count);

    vendibleList.add(vendibleItem)
}

然后,您可以将此填充列表传递给SimpleAdapter的构造函数:

setListAdapter(
       new SimpleAdapter(
                getActivity(),
                vendibleList,
                android.R.layout.two_line_list_item,
                new String[] { "name", "count" },
                new int[] { R.id.list_item_line_1, R.id.list_item_line_2 }
        )
);

如果您仍然遇到问题,请将代码发布到填充列表的位置,然后传递给SimpleAdapter构造函数。