Android AdapterView?

文件说:

如果布局的内容是dynamic的或者不是预定义的,那么可以使用一个布局,该布局将AdapterView的子类用于在运行时用视图填充布局。 AdapterView类的子类使用适配器将数据绑定到其布局。

但是大部分的教程都是关于ListViewGridViewSpinnerGallery

我正在寻找直接从AdapterView扩展一个子类。 我必须创build一个自定义视图,它的内容依赖于适配器。

我怎么能这样做,什么方法必须被覆盖?

首先,你应该确定AdapterView是你想要的,因为并不是所有的“dynamic的或不是预定义的”视图都可以通过AdapterView实现。 有时候你最好创build视图来扩展ViewGroup

如果你想使用AdapterView ,看看这个非常好的例子 。 在GitHub上有适配器的很多自定义视图。 看看这个(扩展ViewGroup ) 。

这可能不是你的问题的总体答案,但我向你展示的最有可能的一个起点或指针可以指导你:

索尼开发者教程 – 3D列表视图

ListView AbsListView ,继而扩展AdapterView<ListAdapter> 。 所以,如果你绝对必须从头开始实现这样的自定义视图,你可以看看这些类的源代码:

  • 列表显示
  • AbsListView
  • 适配器视图

但要小心,这是一个相当的任务。 也许这可能足以使用一个现有的类,并调整外观。

AdapterView可以工作,但它可能不如你所期望的那样有益。 由AdapterView提供的一些基础设施是封装私有的,这意味着我们无法访问它。

例如, AdapterViewpipe理AbsListViewListView的所选项目索引。 但是,因为诸如setNextSelectedPositionInt(int position) (这是设置mNextSelectedPosition的唯一path)的方法是包私有的,所以我们无法到达它们。 AbsListViewListView可以到达他们,因为他们在相同的包,但我们不能。

(如果你深入了解AdapterView源代码,你会发现从handleDataChanged()调用了handleDataChanged() 。不幸的是, handleDataChanged()也是package-private,并且在_not_called的任何地方AdapterView ,可以用来启用设置位置。

这意味着如果你需要pipe理选定的职位,你需要在你的派生类中重新创build基础设施(或者你需要从ListView或者AbsListView派生出来,尽pipe我怀疑你会遇到类似的问题AbsListView )。 这也意味着围绕物品select旋转的任何AdapterViewfunction可能不会完全运行。

你可以创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());