3

我现在在 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。

我该怎么做呢?我不知道从哪里开始。显然,我正在寻找最简单的代码。

4

5 回答 5

2

这是一篇很棒的博客文章,关于为您的列表项设置不同的布局。

处理具有多行类型的列表视图

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

于 2012-08-02T23:04:47.150 回答
2

这很容易,您只需要扩展 ArrayAdapter。我的 ArrayAdapter 做两件事不同:

  • 我的适配器没有传递一个 ResourceId,而是采用一组 ResourceId
  • 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);
    }
}
于 2012-08-02T23:05:09.187 回答
0

我相信如果你有一个计数器,比如说从 0 开始,然后用 充气并重用前五个,然后当它在 5 时,用layoutA.xml废弃充气。这应该很简单。当然,我是通过 谈论这个,它允许您制作一个 Adapter 来设置. 我从来没有真正使用过. 但过程应该是一样的。layoutA.xmllayoutB.xmlBaseAdapterListViewListActivity

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

于 2012-08-02T22:34:57.723 回答
0

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

于 2012-08-02T23:07:32.020 回答
0

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

请检查这一点以了解适配器中 getViewTypeCount() 和 getItemViewType() 的使用。

链接: getviewtypecount 的使用

于 2014-06-30T05:41:57.060 回答