Android customAdapter(BasesAdapter)getView始终返回0
我为listview制作了一个customadapter,但由于某些原因,getView方法的参数“position”始终为0,这使得该方法非常无用 以下是我的customAdapter(扩展BaseAdapter)的代码: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
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放入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(), ...