我正在尝试在我的应用上实现ListView
,但我正在尝试理解并学习如何在不使用XML文件的情况下实现它,所有这些都使用java代码。
我被困在inflater部分,mInflater.inflate();
函数需要一个资源xml文件,因此,我不明白如何继续而不使用XML文件
我有一个ArrayList
个字符串,我只需要一个ListView
来显示包含Arraylist
这些字符串的列表,并在右侧显示删除Button
String
的。{如果用户按下Button
,则List
获取的项目将被删除。
ListView
的每个项目都包含两项内容:TextView
String
ArrayList
和Button
删除它。
如果有人能给我代码示例,我将不胜感激。
由于
答案 0 :(得分:1)
我完全同意CommonsWare。但是您遇到的部分是您必须为ListView
行创建行“模板”的部分。使用inflater
以便从完整的View
文件中生成单个layout.xml
。所以基本的想法是你创建一个代表每一行的xml,然后通过那段代码对它进行充气。
在您的情况下,您需要通过代码执行此操作。也许添加LinearLayout
作为父级,方向=垂直添加一些宽度或高度属性,然后添加2 TextView
s以便成为标题和带有一些其他属性的副标题。然后你应该将它们添加到LinearLayout
,然后你就可以了。
您的LinearLayout
是一堆动态创建的View
,与通过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为ListView
生成2行列表行。使用布局inflater,上面的xml文件返回一个包含所有bundle的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;
}