- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 BaseAdapter.getView() 中为已创建的 View 保留位置似乎是个问题。
在我的例子中,我创建了一个数据对象(-array)来保存 ListView 的所有数据。列表项分为三种类型:分隔符、带复选框的项目和带有可点击图像以打开对话框的项目。该数据将由定制的阵列适配器执行,始终具有单独的布局。为此,我使用了不同的取景器。创建不是问题,但如果回收商开始工作,所有索引/位置都会更改。但是我的数据基于那个指示。
我知道回收器是如何工作的,但程序员应该如何(在 hell )保持与其自己数据的关系?
在 stackoverflow.com 上,有些人问了同样的问题,答案是“覆盖 getItemViewType-Methode”。没问题,但如果位置总是变化,那也没什么用,对吧?
有人有解决方案吗?
问候皮埃尔
这是我的概念验证代码:
// *** Activity: onCreate()
...
ArrayList<DataObj> data = getData();
final ListView list = (ListView)findViewById( R.id.listView1 );
list.setAdapter( new PackedListAdapter( this, data ) );
...
// *** Activity: getData()
private ArrayList<DataObj> getData() {
ArrayList<DataObj> dataArr = new ArrayList<DataObj>();
DataObj dataset;
int i;
dataset = new DataObj();
dataset.setType( DataObj.TYPE_CATEGORY );
dataset.setItemText( "Category CheckItems" );
dataArr.add( dataset );
for ( i = 0; i < 5; i++ ) {
dataset = new DataObj();
dataset.setType( DataObj.TYPE_ITEM_CHECK );
dataset.setItemText( "ItemCheck #" + i );
dataArr.add( dataset );
}
dataset = new DataObj();
dataset.setType( DataObj.TYPE_CATEGORY );
dataset.setItemText( "Category DialogItems" );
dataArr.add( dataset );
for ( i = 0; i < 5; i++ ) {
dataset = new DataObj();
dataset.setType( DataObj.TYPE_ITEM_DLG );
dataset.setItemText( "ItemDlg #" + i );
dataArr.add( dataset );
}
return dataArr;
}
// *** Data-Object:
public class DataObj {
private int type = 1;
// further variables here (e.g. String text1 ) ...
public final static int TYPE_CATEGORY = 1;
public final static int TYPE_ITEM_CHECK = 2;
public final static int TYPE_ITEM_DLG = 3;
public void setType( int type ) { this.type = type; }
public int getType() { return type; }
// further setter/getter-methodes for variables here ...
}
// *** BaseAdapter:
public class PackedListAdapter extends BaseAdapter {
private static ArrayList<DataObj> mData;
private LayoutInflater mInflater;
PackedListAdapter( Context context, ArrayList<DataObj> data ) {
mData = data;
mInflater = LayoutInflater.from( context );
}
public int getCount() {
return mData.size();
}
public Object getItem( int position ) {
return mData.get( position );
}
public long getItemId( int position ) { return position; }
public int getItemViewType( int position ) {
return mData.get( position ).getType();
}
public boolean hasStableIds() { return false; }
public int getViewTypeCount() { return 3; }
public View getView( int position, View convertView, ViewGroup parent ) {
int type = this.getItemViewType( position );
if ( convertView == null ) {
switch ( type ) {
case DataObj.TYPE_CATEGORY:
{
convertView = mInflater.inflate( R.layout.listcat, null );
ViewHolderCat holder = new ViewHolderCat();
// setting up data from mData(position) here
convertView.setTag( holder );
break;
}
case DataObj.TYPE_ITEM_CHECK:
{
convertView = mInflater.inflate( R.layout.listrow, null );
ViewHolderItem holder = new ViewHolderItem();
// setting up data from mData(position) here
convertView.setTag( holder );
break;
}
case DataObj.TYPE_ITEM_DLG:
{
convertView = mInflater.inflate( R.layout.listdlg, null );
ViewHolderDlg holder = new ViewHolderDlg();
// setting up data from mData(position) here
convertView.setTag( holder );
break;
}
}
} else {
switch ( type ) {
case DataObj.TYPE_CATEGORY:
{
ViewHolderCat holder = (ViewHolderCat)convertView.getTag();
// setting up data from mData(position) here
break;
}
case DataObj.TYPE_ITEM_CHECK:
{
ViewHolderItem holder = (ViewHolderItem)convertView.getTag();
// setting up data from mData(position) here
break;
}
case DataObj.TYPE_ITEM_DLG:
{
ViewHolderDlg holder = (ViewHolderDlg)convertView.getTag();
// setting up data from mData(position) here
break;
}
}
}
return convertView;
}
public static class ViewHolderCat {
public TextView txtCat;
}
public static class ViewHolderItem {
public TextView txtItem;
public TextView txtDescr;
public ImageView imgCheckButton;
}
public static class ViewHolderDlg {
public TextView txtItem;
public TextView txtDescr;
public ImageView imgDlgButton;
}
}
最佳答案
你应该覆盖 hasStableIds除了getItemViewType和 getViewTypeCount .这看起来像:
@Override
public boolean hasStableIds() {
/* the view types for rows will change over time */
return false;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
/* calculate the view type for this row */
return ... ;
}
我相信这会让框架知道它不应该根据项目 ID 进行缓存。
关于android - 如何在 BaseAdapter.getView 中为创建的 View 保持稳定的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596416/
好的,我一直在仔细搜索,但我在实现 BaseAdapter 时遇到了一些问题。 我已经能够实现一个简单的游标适配器 http://developer.android.com/resources/sam
我将使用下面的代码从服务器(URL)加载适配器的图像。它适用于新型移动设备。但是,旧模型会崩溃并返回“java.lang.OutOfMemoryError”。它将把 A 行或 B 行标记为错误。如何避
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我想在 ListView 中显示具有多列的数组。 调用 View.getView() 时出现此错误: android.widget.linerlayout cannot be cast to andr
嗨,我已经扩展了 BaseAdapter,我的列表大小是 20,但它只显示了 7 条记录,在第 7 条记录之后它又从 0 开始显示。 公共(public)类 ContactsAdapter 扩展 Ba
大家 最近在用ADT开发android 2.2的程序。程序在模拟器上运行正常,但在真机上运行却遇到了一个奇怪的问题。 我使用 BaseAdapter 创建一个 MenuAdapter,它将加载名为 V
这是我的自定义 BaseAdapter 的构造函数 public MyAdapterAds(Activity activity, BaseAdapter delegate) { this.ac
我有一个像这样的 JSON 数组:[{"usename":"user", "user_pic":"picture", "photo":"http://hfhfhfhhfh.jpg", "timesta
嗨,我是这个机器人的新手。我只是对基本适配器感到困惑。我的问题是考虑在一个数组中我有 10 个项目(从 0 到 9)。在 baseadapter 的 getview() 选项中,我在 textview
有没有办法通过 getApplicationContext() 获取 BaseAdapter 类中的 context? 我需要这个,因为我要从 url 加载图像。我在这里使用 context: 这是在
我有一个 ListView,它扩展了 BaseAdapter。我有一个数据 [] 数组。 ListView 正确膨胀和填充。我想要做的是在用户选择项目时以及是否选择了上一个项目时,使 ImageVie
无论如何,我正在努力制作的应用程序都有一个简单的列表和一个位于底部的按钮。我的问题是我的自定义 BaseAdapter 不显示元素。我知道,因为我的元素只是一个字符串,所以我可以使用 ArrayAda
我正在尝试将一个整数数组传递给一个 baseadapter,这样 A.class 就会将一个整数数组传递给 B.class 中的 BaseAdapter。以下是我在 A.Class(发件人)中传递整数
我在运行刚从 ADT(Eclipse) 转换而来的 android 项目时遇到此错误。 找到一个话题 here但没有回答。谁有解决办法? 最佳答案 这是解决方法。 类 XXXAdapter 扩展了 a
我正在使用 Android Studio 创建 Android 应用程序。我在使用自定义 SimpleAdapter 的 Activity 中有 ListView 。我需要在自定义适配器中使用自定义字
我使用了 ListView 。我有 5 件元素。当我启动程序时,我只看到 3. 处理程序,用于进度条开始处理 3/5 项目。我去看 4,5 项,所以我从 View 1,2 项中丢失了。 4 和 5 项
我有一个自定义BaseAdapter对于我的ListView我在其中实现 AdapterView.OnItemClickListener . 问题是onItemClick(AdapterView, V
在我的应用程序中,我遇到了与 here 相同的错误或here但是,建议的清理 Eclipse 项目的解决方案对我不起作用。具体来说,我有一个自定义 ListView 适配器,它尝试从其布局文件加载两个
我有一个 ListView 和一个将值附加到 View 的 Baseadapter 类。适配器类看到除一个之外的所有变量..我不知道该变量是否超出了类的范围..我已经检查过,但似乎找不到问题出在哪里
我刚刚构建了一个扩展 BaseAdapter 的新类。我相信我已经正确设置了所有内容,但是,当我尝试在 fragment 内设置适配器时,我想使用它,但出现以下错误: 构造函数 HomeBase(Ho
我是一名优秀的程序员,十分优秀!