Android AdapterView?
文件说:
如果布局的内容是dynamic的或者不是预定义的,那么可以使用一个布局,该布局将AdapterView的子类用于在运行时用视图填充布局。 AdapterView类的子类使用适配器将数据绑定到其布局。
但是大部分的教程都是关于ListView
, GridView
, Spinner
和Gallery
。
我正在寻找直接从AdapterView
扩展一个子类。 我必须创build一个自定义视图,它的内容依赖于适配器。
我怎么能这样做,什么方法必须被覆盖?
首先,你应该确定AdapterView
是你想要的,因为并不是所有的“dynamic的或不是预定义的”视图都可以通过AdapterView
实现。 有时候你最好创build视图来扩展ViewGroup
。
如果你想使用AdapterView
,看看这个非常好的例子 。 在GitHub上有适配器的很多自定义视图。 看看这个(扩展ViewGroup
) 。
这可能不是你的问题的总体答案,但我向你展示的最有可能的一个起点或指针可以指导你:
索尼开发者教程 – 3D列表视图
ListView
AbsListView
,继而扩展AdapterView<ListAdapter>
。 所以,如果你绝对必须从头开始实现这样的自定义视图,你可以看看这些类的源代码:
- 列表显示
- AbsListView
- 适配器视图
但要小心,这是一个相当的任务。 也许这可能足以使用一个现有的类,并调整外观。
从AdapterView
可以工作,但它可能不如你所期望的那样有益。 由AdapterView
提供的一些基础设施是封装私有的,这意味着我们无法访问它。
例如, AdapterView
pipe理AbsListView
和ListView
的所选项目索引。 但是,因为诸如setNextSelectedPositionInt(int position)
(这是设置mNextSelectedPosition
的唯一path)的方法是包私有的,所以我们无法到达它们。 AbsListView
和ListView
可以到达他们,因为他们在相同的包,但我们不能。
(如果你深入了解AdapterView
源代码,你会发现从handleDataChanged()
调用了handleDataChanged()
。不幸的是, handleDataChanged()
也是package-private,并且在_not_called
的任何地方AdapterView
,可以用来启用设置位置。
这意味着如果你需要pipe理选定的职位,你需要在你的派生类中重新创build基础设施(或者你需要从ListView
或者AbsListView
派生出来,尽pipe我怀疑你会遇到类似的问题AbsListView
)。 这也意味着围绕物品select旋转的任何AdapterView
function可能不会完全运行。
你可以创build这样的东西:
public class SampleAdapter extends BaseAdapter { public SampleAdapter() { // Some constructor } public int getCount() { return count; // Could also be a constant. This indicates the # of times the getView gets invoked. } public Object getItem(int position) { return position; // Returns the position of the current item in the iteration } public long getItemId(int position) { return GridView.INVALID_ROW_ID; } public View getView(int position, View convertView, ViewGroup parent) { View view = null; view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null); view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); view.setBackgroungColor(Color.RED); return view; }
}
这可以被调用,如:
GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout); sampleView.setAdapter(new SampleAdapter());