Android customAdapter(BasesAdapter)getView始终返回0

Android customAdapter(BasesAdapter)getView始终返回0,android,android-listview,baseadapter,custom-adapter,getview,Android,Android Listview,Baseadapter,Custom Adapter,Getview,我为listview制作了一个customadapter,但由于某些原因,getView方法的参数“position”始终为0,这使得该方法非常无用 以下是我的customAdapter(扩展BaseAdapter)的代码: public class CreateProgramAdapter extends BaseAdapter { private LayoutInflater inflater; private ArrayList<TrainingPass> t

我为listview制作了一个customadapter,但由于某些原因,getView方法的参数“position”始终为0,这使得该方法非常无用

以下是我的customAdapter(扩展BaseAdapter)的代码:

public class CreateProgramAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private ArrayList<TrainingPass> trainingPasses;
    private List<TrainingPass> items;
    private Context context;

    public CreateProgramAdapter(Context context, List<TrainingPass> items) {
        this.context = context;
        this.items = items;
        this.inflater = LayoutInflater.from(this.context);
    }

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

    @Override
    public TrainingPass getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        TrainingPassHolder holder;

        if(convertView == null) {
            view = inflater.inflate(R.layout.adapter_createprogram_trainingpasses_item, parent, false);
            holder = new TrainingPassHolder();

            System.out.println(position);
            holder.trainingPass = this.getItem(position);
            holder.trainingPassContainer = (RelativeLayout) view.findViewById(R.id.trainingPassContainer);
            holder.trainingPassHeadlineShowHide = (TextView) view.findViewById(R.id.trainingpass_headline);
            holder.noExercisesYet = (TextView) view.findViewById(R.id.txt_no_exercises_yet);
            holder.exerciseSearchField = (EditText) view.findViewById(R.id.trainingpass_exercise_searchfield);
            holder.trainingPassSetsListView = (ListView) view.findViewById(R.id.trainingpass_sets_listview);
            holder.exercisesListView = (ListView) view.findViewById(R.id.exercises_listview);
            holder.addSetButton = (Button) view.findViewById(R.id.add_set_button);
            holder.addExerciseButton = (Button) view.findViewById(R.id.add_exercise_button);


            holder.trainingPassContainer.setTag(holder.trainingPass);
            holder.trainingPassHeadlineShowHide.setTag(holder.trainingPass);
            holder.noExercisesYet.setTag(holder.trainingPass);
            holder.exerciseSearchField.setTag(holder.trainingPass);
            holder.trainingPassSetsListView.setTag(holder.trainingPass);
            holder.exercisesListView.setTag(holder.trainingPass);
            holder.addSetButton.setTag(holder.trainingPass);
            holder.addExerciseButton.setTag(holder.trainingPass);

            view.setTag(holder);

        } else {
            view = convertView;
            holder = (TrainingPassHolder)view.getTag();
        }

        setupItems(holder);

        return view;
    }


    private void setupItems(TrainingPassHolder trainingPassHolder) {
        int id = trainingPassHolder.trainingPass.trainingPassID;
        TextView showHide = trainingPassHolder.trainingPassHeadlineShowHide;

        showHide.setText("Trainingpass " + id);
    }

    private class TrainingPassHolder {
        TrainingPass    trainingPass;
        RelativeLayout  trainingPassContainer;
        TextView        trainingPassHeadlineShowHide;
        TextView        noExercisesYet;
        EditText        exerciseSearchField;
        ListView        trainingPassSetsListView;
        ListView        exercisesListView;
        Button          addSetButton;
        Button          addExerciseButton;
    }
}
结果和以前完全一样。终端中只有2个Syso,输出0(位置变量)。此外,listview中只有2个项目,尽管我在适配器中添加了3个项目

这必须意味着对一个项调用两次getview,然后不调用其余项

但是,我仍然不知道为什么会发生这种情况。

替换这个

@Override
public long getItemId(int position) {
    return 0;
}
holder.trainingPass = this.getItem(position);
用这个

@Override
public long getItemId(int position) {
    return position;
}
编辑2:与我的baseadapter相比,我建议如下

替换这个

@Override
public long getItemId(int position) {
    return 0;
}
holder.trainingPass = this.getItem(position);
由此

holder.trainingPass = items.getItem(position);

在调用CreateProgramAdapter时,我怀疑您没有为适配器传递正确的上下文。 更改为:

new CreateProgramAdapter(CreateProgramActivity.this, ...
致:

注:

  • CreateProgramActivity在范围内必须是静态的,但我觉得它并非始终是正确的活动,有时它更具动态性。方法getActivity更准确,如果代码是在片段中,则更容易执行。然而,获得正确的活动可能很困难。让我们试试看

将ListView小部件的布局宽度和高度更改为“匹配父项”。

如果将ListView放入ScrollView,则会发生此错误。ListView本身不进行垂直滚动,因此不能将其放入滚动视图中


当listView需要显示新项时,适配器将调用getView。因此,如果您的listView没有滚动,则不会创建新项目,也不会调用getView。

Charef是正确的。您要求在何时返回0应要求其返回ItemId的位置。通过添加更多详细信息帮助我们了解您的问题您替换了返回0;带返回位置?显示调用CreateProgramAdapter()的代码。重写getItemId不是必需的,如果您不使用它,可以将其删除。而且……您似乎已经更新了代码,请更新以获得我们的帮助。@TheOriginalAndroid我已经添加了调用CreateProgramAdapter的位置感谢您的回答。我完全忽略了这一点,但不幸的是位置变量始终为0。谢谢。问题在于变量“位置”,它是getView方法中的一个参数。-公共视图getView(int位置、视图转换视图、视图组父视图)。上面的编辑2恐怕没有解决这个问题:(我已经找到了解决方案,并且自己发布了一个答案。无论如何,非常感谢您的帮助。投票通过。谢谢,但我似乎无法调用getActivity方法。它是特定类的一部分吗?Android Studio找不到该方法。如果我强制它调用getActivity(),它会说“无法解析方法getActivity()“我已经找到了解决方案,并亲自发布了答案。无论如何,非常感谢您的帮助。向上投票。如果我们需要将listview放在scrollview中,该解决方案是什么……这取决于情况,对我来说,这是一个解决方案,因为我需要在子listview上显示一些项目。请看一看,这是否适用于您。
new CreateProgramAdapter(CreateProgramActivity.this, ...
new CreateProgramAdapter(getActivity(), ...