gpt4 book ai didi

android - 如何在 BaseAdapter.getView 中为创建的 View 保持稳定的位置?

转载 作者:搜寻专家 更新时间:2023-11-01 09:14:40 25 4
gpt4 key购买 nike

在 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除了getItemViewTypegetViewTypeCount .这看起来像:

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com