Android BaseAdapter onItemClick引用旧实例

Android BaseAdapter onItemClick引用旧实例,android,baseadapter,Android,Baseadapter,我有一个奇怪的问题,当调用onClick时,在我的BaseAdapter中,如果调用getItem(pos),当前实例的listData是旧的;在回调内部,如果调用av.getAdapter().getItem(pos),则会得到该项的更新版本。经过几个小时的调试,我不明白为什么会这样,有什么想法吗?请参阅下面的代码,特别是onItemClick回调: class MyAdapter extends BaseAdapter implements OnItemClickListener, ITog

我有一个奇怪的问题,当调用onClick时,在我的BaseAdapter中,如果调用getItem(pos),当前实例的listData是旧的;在回调内部,如果调用av.getAdapter().getItem(pos),则会得到该项的更新版本。经过几个小时的调试,我不明白为什么会这样,有什么想法吗?请参阅下面的代码,特别是onItemClick回调:

class MyAdapter extends BaseAdapter implements OnItemClickListener, IToggleChanged {

private final List<IItem> mData;

public MyAdapter(final Context context) {
    super();
    mData = new ArrayList<>();
    initData(context);
}

private void initData(final Context context) {
    mData.add(...);
    updateDataSet();
}

@Override
public boolean isEnabled(final int position) {
    return mData.get(position).isEnabled();
}

@Override
public int getCount() {
    return mData.size();
}

@Override
public Object getItem(final int pos) {
    return mData.get(pos);
}

@Override
public long getItemId(final int pos) {
    return pos;
}

private View inflateView(final Context context, final int pos) {
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    return inflater.inflate(mData.get(pos).getLayoutId(), null);
}

@Override
public View getView(final int pos, final View view, final ViewGroup vg) {
    final View v = inflateView(vg.getContext(), pos);
    mData.get(pos).fillView(v);
    return v;
}

@Override
public void onItemClick(final AdapterView<?> av, final View view, final int pos, final long id) {

    // Scenario: toggle is off, you turn it on, list items get enabled, you now click on them and nothing happens because mEnabled=false, despite
    // we set it to true in updateDataSet. Don't know why this method have an old instance of mData, with the second method below it works as expected.
    //final IItem item2 = getItem(pos);

    final IItem item1 = av.getAdapter().getItem(pos);
    if (item1.isEnabled()) {
        item1.onClick(view);
    }
}

/**
 * Updates Items enable/disable state.
 */
private void updateDataSet() {
    for (final IItem item : mData) {
        item.setEnable(...);
    }
}

@Override
public void toggleChanged() {
    updateDataSet();
    notifyDataSetChanged();
}
类MyAdapter扩展BaseAdapter实现OnItemClickListener,iTogleChanged{
私人最终名单mData;
公共MyAdapter(最终上下文){
超级();
mData=newarraylist();
initData(上下文);
}
私有void initData(最终上下文){
添加(…);
updateDataSet();
}
@凌驾
公共布尔值已启用(最终整型位置){
返回mData.get(position.isEnabled();
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共对象getItem(最终整数位置){
返回mData.get(pos);
}
@凌驾
公共长getItemId(最终整数位置){
返回pos;
}
私有视图充气视图(最终上下文上下文,最终整数位置){
最终LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
返回充气器充气(mData.get(pos.getLayoutId(),null);
}
@凌驾
公共视图getView(最终内部位置、最终视图视图、最终视图组vg){
最终视图v=充气视图(vg.getContext(),pos);
mData.get(pos.fillView)(v);
返回v;
}
@凌驾
公共视图单击(最终适配器视图av、最终视图视图视图、最终内部位置、最终长id){
//场景:关闭切换,打开切换,启用列表项,现在单击它们,什么也不会发生,因为mEnabled=false,尽管
//我们在updateDataSet中将其设置为true。不知道为什么这个方法有一个旧的mData实例,下面的第二个方法按预期工作。
//最终项目2=获取项目(pos);
最终IItem item1=av.getAdapter().getItem(pos);
如果(item1.isEnabled()){
项目1.onClick(视图);
}
}
/**
*更新项目启用/禁用状态。
*/
私有void updateDataSet(){
用于(最终项目:mData){
项。设置启用(…);
}
}
@凌驾
public void toggleChanged(){
updateDataSet();
notifyDataSetChanged();
}

}

listData是指mData吗?你在哪里更新数据?旧数据的调用具体在哪里?我不认为“SpamSettingsAdapter.isEnabled()”方法是从onItemClick()调用的。尝试直接使用mData来执行“(CAST)getAdapter()”。另一件事:如果项目是“IItems”,为什么要强制转换到ISpamSettingItem?可能您在两个接口中都声明了“setEnabled()”,但它们引用了不同的方法和/或变量。我更新了代码。工作流:按下toggle->调用toggleChanged(),updateDataSet将项的字段mEnabled设置为TRUE,然后点击其中一个列表项,调用onItemClick,在该方法中可以看到调用item1.isEnabled(),使用未注释版本isEnabled返回FALSE,使用当前方法返回TRUE。