可以在没有XML文件的情况下实现ListView吗?

时间:2012-07-24 22:57:30

标签: android listview baseadapter listview-adapter

我正在尝试在我的应用上实现ListView,但我正在尝试理解并学习如何在不使用XML文件的情况下实现它,所有这些都使用java代码。

我被困在inflater部分,mInflater.inflate();函数需要一个资源xml文件,因此,我不明白如何继续而不使用XML文件

我有一个ArrayList个字符串,我只需要一个ListView来显示包含Arraylist这些字符串的列表,并在右侧显示删除Button String的。{如果用户按下Button,则List获取的项目将被删除。

ListView的每个项目都包含两项内容:TextView String ArrayListButton删除它。

如果有人能给我代码示例,我将不胜感激。

由于

1 个答案:

答案 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;
}
相关问题