我有一个名为Vendible
的对象有id
和name
(String
个)。为了表示其中的几十个而不实际存储数十个内存,我有一个名为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设置屏幕在每个列表项中都有设置名称和简短描述的方式大致相同。
我看过blogs和other 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 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显示任何文字!
答案 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构造函数。