【问题标题】:Android ListView show different items than Adapter getAndroid ListView 显示与 Adapter get 不同的项目
【发布时间】:2015-05-30 10:42:27
【问题描述】:

我正在尝试使用我自己的自定义适配器填充我的 ListView。我试图从列表中显示 24 个不同的元素,但我得到的只是从 0 到 6 的七个元素,它们一遍又一遍地显示 24(在 ListView 中显示的所有项目的数量)。所以它从 0 开始显示元素,在 6 结束并重新开始,直到 ListView 有 24 个元素。我哪里做错了?

Activity 的一段代码:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_day_plan);

    tasksListView = (ListView) findViewById(R.id.tasks_list_view);
    tasksList = new ArrayList<Task>();

    for (int h = 0; h < 24; h++) {

        Task task = new Task(h, 0, h + 1, 0, String.valueOf(h), null);
        tasksList.add(task);
    }
    customAdapter = new ListAdapter(this, R.layout.task, tasksList);
    tasksListView.setAdapter(customAdapter);

}

我的自定义适配器:

public class ListAdapter extends ArrayAdapter<Task>{

private ArrayList<Task> tasks;

public ListAdapter(Context context, int resource, ArrayList<Task> tasks) {

    super(context, resource, tasks);
    this.tasks = tasks;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {

        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.task, null);

        Task task = tasks.get(position);

        if (task != null) {

            TextView time_header = (TextView) v.findViewById(R.id.time_header);
            TextView task_header = (TextView) v.findViewById(R.id.task_header);

            if (time_header != null) {

                time_header.setText(task.timeToString());
            }

            if (task_header != null) {

                task_header.setText(task.getHeader());
            }
        }
    }

    return v;
}


public ArrayList<Task> getItems() {

    return tasks;
}
}

任务类:

public class Task {

private int startHour;
private int startMinute;
private int endHour;
private int endMinute;
private String header;
private String description;

public Task(int sH, int sM, int eH, int eM, String head, String desc) {

    this.startHour = sH;
    this.startMinute = sM;
    this.endHour = eH;
    this.endMinute = eM;
    if (head == null) {

        this.header = "[wolne]";
    } else {

        this.header = head;
    }

    if (desc == null) {

        this.description = "";
    } else {

        this.description = desc;
    }

}

public String getHeader() {

    return header;
}

public String timeToString() {

    String time = startHour + ":" + 
            startMinute + 
            " - " + 
            endHour + 
            ":" + 
            endMinute;
    return time;
}
}

和随机行布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/time_header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp"
        android:textSize="12sp" 
        android:text="@string/exampe_time"/>

    <TextView android:id="@+id/task_header"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:singleLine="true"
        android:textSize="15sp"
        android:text="@string/lorem_ipsum"/>

</LinearLayout>

我尝试调试应用程序,并检查了项目在 ArrayList 和适配器中是否正确,所以我猜问题必须在适配器中的某个地方......

【问题讨论】:

  • 您的 getView() 仅在存在 null convertView 时才会填充行。您需要在每个getView() 调用 上填充行。与null convertView 的唯一区别是您可以跳过布局膨胀,只需将行重用于其小部件。另外,我强烈建议您使用getLayoutInflater(),调用您的Activity,而不是LayoutInflater.from(),以确保您获得与您的活动主题相匹配的LayoutInflater。

标签: android listview android-arrayadapter


【解决方案1】:

你再次使用,已经创建了convertView,但是你没有为当前位置设置数据。

最简单的解决方案

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {

        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.task, null);
    }
    Task task = tasks.get(position);

    if (task != null) {

        TextView time_header = (TextView) v.findViewById(R.id.time_header);
        TextView task_header = (TextView) v.findViewById(R.id.task_header);

        if (time_header != null) {

            time_header.setText(task.timeToString());
        }

        if (task_header != null) {

            task_header.setText(task.getHeader());
        }
    }


    return v;
}

最佳解决方案

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder;

    if (convertView == null) {
        //Initialize yout layoutInflater in your adapter constructor
        convertView = vi.inflate(R.layout.task, null);
        viewHolder = new ViewHolder();
        viewHolder.task_header = (TextView) v.findViewById(R.id.time_header);
        viewHolder.time_header = (TextView) v.findViewById(R.id.task_header);
        convertView.setTag(viewHolder);
    } else
        viewHolder = (ViewHolder) convertView.getTag();

    Task task = tasks.get(position);

    if (task != null) {

        viewHolder.time_header.setText(task.timeToString());
        viewHolder.task_header.setText(task.getHeader());
    }
    return convertView;
}

static class ViewHolder {
    TextView time_header;
    TextView task_header;
}

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多