【问题标题】:Android ListFragment displaying only last item repeatedAndroid ListFragment 仅显示最后一项重复
【发布时间】:2025-12-01 11:50:01
【问题描述】:

我正在尝试制作一个列表片段来显示二十个项目。就目前而言,对于列表中的所有二十个项目,仅显示列表中的最后一个项目。我一直在查看 listfragments 的示例,但我不知道出了什么问题。

这是来自扩展 ListFragment 的 CourseFragment 类:

private List<Course> mCourses;

public CourseFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mCourses = Schedule.get(getActivity()).getSchedule();
    CourseArrayAdapter<Course> mAdapter = new CourseArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, mCourses);
    setListAdapter(mAdapter);

    for (int i = 0; i < 20; i++ ) {
        Log.d("DEBUGTAG", "Course: " + mCourses.get(i));
    }

}

这是来自 CourseArrayAdapter:

public CourseArrayAdapter(Context context, int resource, List<T> objects) {
    super(context, resource, objects);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("DEBUG", "getView " + position);
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View mLayout;
    if (convertView == null) {
        mLayout = inflater.inflate(R.layout.view_course, parent, false);
    } else {
        mLayout = convertView;
    }
    T mCourse = getItem(position);
    TextView mCourseTextView = (TextView) mLayout.findViewById(R.id.course_textview);
    mCourseTextView.setText(mCourse.toString());

    return mLayout;
}

还有MainActivity的onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager mFragManager = getFragmentManager();
    Fragment mFragment = mFragManager.findFragmentById(R.id.main_activity_framelayout);
    if(mFragment == null) {
        mFragment = new CourseFragment();
        mFragManager.beginTransaction().add(R.id.main_activity_framelayout, mFragment).commit();
    }

}

这里是Course类的实例变量和构造函数:

private static String sCourseName;
private static int sCourseNum;
private static String sInstructor;
private static String sDescription;

public Course(String mCourseName, int mCourseNum, String mInstructor, String mDescription) {
    sCourseName = mCourseName;
    sCourseNum = mCourseNum;
    sInstructor = mInstructor;
    sDescription = mDescription;
}

如果需要任何其他代码来解决此问题,请告诉我。非常感谢您的帮助!

【问题讨论】:

  • 你能不能显示 courseArrayAdapter 的构造函数
  • mCourse.tostring 的值是否相同,您能告诉我打印的是什么
  • 已更新以包含该内容
  • @Override public String toString() { return getCourseNum() + " " + getCourseName() + " " + "\nInstructor: " + getInstructor(); }
  • for 循环实际上并没有做任何事情,它只是为了调试。我将 setListAdapter 移到它之后,它并没有改变输出。

标签: android listview android-arrayadapter android-listfragment


【解决方案1】:

请尝试现在 mCourses 将有数据。我认为它不会重复

private List<Course> mCourses;
public CourseArrayAdapter(Context context, int resource, List<T> objects) {
super(context, resource, objects);
mCourses=objects;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("DEBUG", "getView " + position);
LayoutInflater inflater = LayoutInflater.from(getContext());
View mLayout;
if (convertView == null) {
    mLayout = inflater.inflate(R.layout.view_course, parent, false);
} else {
    mLayout = convertView;
}
  // T mCourse = getItem(position);
TextView mCourseTextView = (TextView) mLayout.findViewById(R.id.course_textview);
mCourseTextView.setText(mCourses.get(position).toString());

return mLayout;
}

【讨论】:

  • 我不得不将第一行代码更改为:private List&lt;T&gt; mCourses; 它仍然在做之前做的事情
  • Log.d("DEBUGTAG", "课程:" + mCourses.get(i));您每次在这里获得不同的价值吗?
  • 不,我在那里也得到了相同的值。就是最后一项的toString方法的值。
  • 什么是登录getview打印
  • 感谢您的帮助,原来问题出在代码的其他地方。问题在 Course 课程中。实例变量是静态的。
最近更新 更多