ListView可以在Android中有两种或更多种不同类型的行布局吗?

时间:2012-08-02 22:29:56

标签: java android eclipse android-listview

我现在在ListActivity中有一个非常简单的ListView,它只显示文本值列表。这是我目前的代码:

public class InfoActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> values = new ArrayList<String>();
        // loads up the values array here
        // ...

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
    }

我的InfoActivity XML文件中没有任何内容,因为我使用的是ListActivity。

我想要做的是为行创建自定义布局。前5行将具有layoutA.xml,后5行将具有layoutB.xml。

我该怎么做?我迷失在哪里开始。显然我正在寻找最简单的代码。

5 个答案:

答案 0 :(得分:2)

这是一篇很棒的博客文章,介绍了列表项目的不同布局。

handling-listviews-with-multiple-row-types

还有示例项目,因此您可以配置并尝试该示例。

答案 1 :(得分:2)

这很简单,您只需要扩展ArrayAdapter。我的ArrayAdapter做了两件事:

  • 而不是传递一个ResourceId,我的适配器采用ResourceIds数组
  • getView()检查位置并加载适当的资源

这是一个微不足道的例子。如果你打算让它比前半部分更复杂,而后半部分不同,那么你应该覆盖getViewTypeCount()getItemViewType()

工作示例:

public class Example extends Activity {
    public class MyArrayAdapter<T> extends ArrayAdapter<T> {
        LayoutInflater mInflater;
        int[] mLayoutResourceIds;

        public MyArrayAdapter(Context context, int[] textViewResourceId, List<T> objects) {
            super(context, textViewResourceId[0], objects);
            mInflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
            mLayoutResourceIds = textViewResourceId;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null && position > 2)
                convertView = mInflater.inflate(mLayoutResourceIds[1], parent, false);
            return super.getView(position, convertView, parent);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] array = new String[] {"one", "two", "three", "four", "five", "six"};
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, array);

        ListView listView = new ListView(this);
        listView.setAdapter(new MyArrayAdapter<String>(this, new int[] {android.R.layout.simple_list_item_1, android.R.layout.simple_list_item_single_choice}, list));
        setContentView(listView);
    }
}

答案 2 :(得分:0)

我相信如果你有一个计数器,比如从0开始,然后通过layoutA.xml膨胀并重复使用前五个,那么当它在5时,用{{1}废弃膨胀的layoutA.xml }。这应该很简单。当然,我正在通过layoutB.xml来讨论这个问题,它允许您创建一个适配器来设置BaseAdapter中的每一行。我从未真正使用ListView。但这个过程应该是一样的。

只是添加@lxx发布的内容,我的意思是链接,它肯定会帮助你弄清楚如何完成你想要的。虽然我会说在我看来,当你想要一种5种而另外5种时,使用这些方法可能有些过分。绝对使用该链接作为一个良好的基线,但只需使用一个计数器。它更简单。在内存方面,只有当您知道计数器已经放入5个视图时才重新膨胀布局。这样你就不会每次都这样做。

答案 3 :(得分:0)

您可以尝试使用MergeAdapter(cwac-merge),在一个ListView中,您可以拥有多个具有不同布局的适配器。

答案 4 :(得分:0)

如果我们需要在列表视图中显示不同类型的视图,那么在适配器中使用getViewTypeCount()和getItemViewType()而不是切换视图VIEW.GONE和VIEW.VISIBLE在getView中可能是非常昂贵的任务。 )这将影响列表滚动。

请在适配器中检查此内容以使用getViewTypeCount()和getItemViewType()。

链接:the-use-of-getviewtypecount