/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.widget;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
/**
* 适配器对象是作为连接 {@link AdapterView} 和 与视图相关的底层数据之间的桥梁.
* 适配器提供访问数据项的能力.适配器负责使{@link android.view.View 视图}
* 显示数据集中的每一条数据.
*
* @see android.widget.ArrayAdapter
* @see android.widget.CursorAdapter
* @see android.widget.SimpleCursorAdapter
*/
public interface Adapter {
/**
* 注册当用该适配器修改数据时调用的观察器.
*
* @param observer 当数据变更时得到通知的对象.
*/
void registerDataSetObserver(DataSetObserver observer);
/**
* 注销之前通过 {@link #registerDataSetObserver} 方法注册到该适配器的观察器.
*
* @param observer 要注销的对象.
*/
void unregisterDataSetObserver(DataSetObserver observer);
/**
* 该适配器的数据集中包含多少条目.
*
* @return 项目数.
*/
int getCount();
/**
* 获取数据集中指定位置的数据项目.
*
* @param position 要从适配器中取得的条目的位置.
* @return 指定位置的数据.
*/
Object getItem(int position);
/**
* 取得列表中与指定位置的行关联的ID.
*
* @param position 要从适配器中取得的条目的位置.
* @return 指定位置的条目的ID.
*/
long getItemId(int position);
/**
* 表明底层数据发生变化时,条目 ID 是否保持不变.
*
* @return 如果相同的 ID 永远代表相同的对象,返回真.
*/
boolean hasStableIds();
/**
* 取得用于显示数据集中指定位置数据的视图.你可以创建一个视图或者从 XML 文件中展开视图.
* 当视图展开自布局文件时,除非通过
* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
* 方法指定了根视图,并防止其附着于跟视图,否则父视图(GridView、ListView……)会应用默认布局参数.
*
* @param position 要从适配器中取得的视图的位置.
* @param convertView 如果可能,用于重用的旧视图.注意:使用前你应该检查该视图非空并且是合适的类型.
* 如果部分通过转换该视图来正确显示数据,该方法会创建新视图.混合列表可以指定视图类型的数量,
* 该视图总是会得到正确的类型.(参见 {@link #getViewTypeCount()} 和
* {@link #getItemViewType(int)}).
* @param parent 视图最终附加到的父视图
* @return 与指定位置的数据相对应的视图.
*/
View getView(int position, View convertView, ViewGroup parent);
/**
* 使 {@link AdapterView} 忽略条目视图的视图类型.例如,该标志可用于客户端不希望
* {@link #getView(int, View, ViewGroup)} 转换特定视图的时候.
*
* @see #getItemViewType(int)
* @see #getViewTypeCount()
*/
static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
/**
* 获取要通过 {@link #getView} 方法创建的指定位置条目的视图类型.
*
* @param position 我们要取得其视图类型的条目在适配器数据集中的位置.
* @return 视图类型的整数表现.如果一个视图可以通过 {@link #getView} 方法转换成另一个视图,
* 则两个视图将共享同一类型.注意:该整数的范围必须在 0 到 {@link #getViewTypeCount}
* - 1之间.也可能返回 {@link #IGNORE_ITEM_VIEW_TYPE}.
* @see #IGNORE_ITEM_VIEW_TYPE
*/
int getItemViewType(int position);
/**
* <p>
* 返回通过 {@link #getView} 创建的视图类型的数量.每个类型代表一组可以通过
* {@link #getView} 方法转换的视图.如果适配器对所有条目都返回相同的视图类型,
* 该方法返回 1.
* </p>
* <p>
* 该方法仅当适配器属于 {@link AdapterView} 时调用.
* </p>
*
* @return 将由该适配器创建的视图类型的数量.
*/
int getViewTypeCount();
static final int NO_SELECTION = Integer.MIN_VALUE;
/**
* @return 如果适配器没有任何数据,返回真.该方法用于检查是否应该显示空视图.
* 典型的实现是返回 <code>getCount() == 0</code>,但是当 getCount() 包含了
* 列表头和列表尾时,特定的适配器可以有不同的行为.
*/
boolean isEmpty();
}