我完全同意 CommonsWare。但是您被卡住的部分是您必须为行创建行“模板”的部分ListView
。inflater
用于制作View
一个完整文件的单个layout.xml
文件。所以基本的想法是你创建一个代表每一行的xml,然后通过那段代码对其进行扩充。
在您的情况下,您需要通过代码来做到这一点。也许添加 aLinearLayout
作为具有方向=垂直的父级添加一些宽度或高度属性,然后添加 2TextView
以便成为具有一些附加属性的标题和副标题。然后你应该把它们添加到LinearLayout
你那里。
你LinearLayout
是一堆View
动态创建的s,效果和把上面所有的代码通过一个xml文件膨胀一样。
但我真的不明白在更快、更容易、更直接、更好实施,更不用说最佳实践上大惊小怪了……
编辑:您在适配器内部的某个地方:mInflater.inflate();
使用您提到的资源。正如我之前所说,资源决定了每一行的“模板”如何。因此,将确定列表行的普通 xml 文件将是这样的:
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="vertical" >
<TextView ... /> <! --some properties you want to set -->
<TextView ... /> <! --some properties you want to set -->
</LinearLayout>
此 xml 为 a 生成 2 行列表行ListView
。使用布局充气器,上面的 xml 文件返回一个View
包含所有包的对象。
因此,如果您想从代码创建它,那么代码段将是:
LinearLayout layout = new LinearLayout(context);
//layout set some properties
TextView title = new TextView(context);
//title set some properties
TextView subtitle = new TextView(context);
//subtitle set some properties
layout.add(title);
layout.add(subtitle);
现在不是膨胀 xml 以将内容放入单个View
对象中,而是layout
代码片段中的变量包含以前通过 xml 膨胀的所有逻辑。
如果您之前创建了自定义ListView
适配器,那么您应该熟悉创建自定义列表行及其工作原理。
编辑:适配器的示例代码ListView
这是getView()
通过扩展单个布局的适配器方法的标准过程:
@Override
public View getView(int position, View view, ViewGroup viewgroup) {
ViewHolder holder; //our view holder of the row
if (view == null) {
view = context.getLayoutInflater().inflate(R.layout.static_layout, null);
holder = new ViewHolder();
//set the views of the holder
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//rest of implementation of the View
return view;
}
动态实现:
@Override
public View getView(int position, View view, ViewGroup viewgroup) {
ViewHolder holder; //our view holder of the row
if (view == null) {
LinearLayout layout = new LinearLayout(context);
//layout set some properties
TextView title = new TextView(context);
//title set some properties
TextView subtitle = new TextView(context);
//subtitle set some properties
layout.add(title);
layout.add(subtitle);
//CREATING THE LAYOUT THROUGH CODE
view = layout; //INSTEAD OF INFLATING A LAYOUT FOR THE ROW I JUST BINDED IT TO THE RECENTLY CREATED LAYOUT
holder = new ViewHolder();
//bind the views of the holder to the views of the layout
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//rest of implementation of the View
return view;
}