【问题标题】:getView on extended ArrayAdapter always has position 0扩展 ArrayAdapter 上的 getView 始终具有位置 0
【发布时间】:2026-02-07 12:00:02
【问题描述】:

我创建了一个 PickedDropsAdapter 类,它扩展了 ArrayAdapter 的 listView,它列出了 List 中的对象

添加和删除基本上可以正常工作,只是 getView 中的位置始终为 0,我就是不知道为什么。

我发现了一些类似的问题,但没有一个答案真的有帮助

值得一提的是,listView 位于 Fragment 中,而 Fragment 又位于具有两个页面的 ViewPager 中。

PickedDropsAdapter.java

public class PickedDropsAdapter extends ArrayAdapter {

private LayoutInflater myInflater;
private List<PickedDrop> pickedList;

public PickedDropsAdapter(Context context, int resource, List objects){
    super(context, resource, objects);
    myInflater = LayoutInflater.from(context);
    setData(objects);
}

public void setData(List list){
    this.pickedList = list;
}

@Override
public int getPosition(Object item) {
    return super.getPosition(item);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView profileName;
    if (convertView == null) {
        convertView = myInflater.inflate(R.layout.picked_drop, null);
        profileName = (TextView)convertView.findViewById(R.id.profileName);
        Log.i("TAG", "Name in adapter: " + pickedList.get(position).name);
        Log.i("TAG", "Postion in adapter: " + position);
        profileName.setText(pickedList.get(position).name);
        pickedList.get(position).makeActive(convertView);

    }
    return convertView;
}
}

PickedDrop

public class PickedDrop extends Fragment {

int id, listLoc;
String name;
RelativeLayout pickedLayout;
PickedDropsFrag parentFrag = null;

public static PickedDrop newInstance(String nameParam, int idParam) {
    final PickedDrop fragment = new PickedDrop();
    fragment.name = nameParam;
    Log.i("TAG", "Drop name: " + fragment.name);
    fragment.id = idParam;
    return fragment;
}

public PickedDrop() {
    // Required empty public constructor
}

public void openDrop(){
    MainActivity mainActivity = (MainActivity)parentFrag.getActivity();
    mainActivity.openDrop(this);
}

public void openDrop(int i){
    listLoc = i;
    MainActivity mainActivity = (MainActivity)parentFrag.getActivity();
    mainActivity.openDrop(this);
}

public void makeActive(View convertView){
    pickedLayout = (RelativeLayout)convertView.findViewById(R.id.pickedLayout);

}
}

部分 PickedDropsFrag(包含 listView 的片段)

public class PickedDropsFrag extends Fragment {
private OnFragmentInteractionListener mListener;
PickedDropsAdapter pickedAdapter;
ListView pickedListView;
List<PickedDrop> pickedList;


public PickedDropsFrag() {
    // Required empty public constructor
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    pickedListView = (ListView)getView().findViewById(R.id.pickedListView);
    pickedListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            PickedDrop drop = (PickedDrop) adapterView.getItemAtPosition(i);
            drop.openDrop(i);
        }
    });

    pickedList = new ArrayList<>();

    pickedAdapter = new PickedDropsAdapter(
            getActivity(),
            R.layout.picked_drop,
            pickedList
    );

    pickedListView.setAdapter(pickedAdapter);
}

public void addToPicked(PickedDrop drop){
    drop.parentFrag = this;
    //pickedList.add(drop);
    pickedAdapter.add(drop);
    drop.listLoc = pickedList.size() - 1;

    //pickedAdapter.notifyDataSetChanged();

    drop.openDrop();
}

这应该是最重要的,我希望我没有忘记任何事情。

【问题讨论】:

    标签: android listview android-fragments position android-arrayadapter


    【解决方案1】:

    在您的适配器中更新以下方法:

    public class PickedDropsAdapter extends ArrayAdapter {
        @Override
        public int getCount() {
            return pickedList.size();
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView profileName;
            if (convertView == null) {
                convertView = myInflater.inflate(R.layout.picked_drop, null);
            }
            profileName = (TextView)convertView.findViewById(R.id.profileName);
            Log.i("TAG", "Name in adapter: " + pickedList.get(position).name);
            Log.i("TAG", "Postion in adapter: " + position);
            profileName.setText(pickedList.get(position).name);
            pickedList.get(position).makeActive(convertView);
    
            return convertView;
        }
    }
    

    【讨论】: