簡體   English   中英

Android ListView顯示與Adapter get不同的項目

[英]Android ListView show different items than Adapter get

我試圖使用我自己的自定義適配器填充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和Adapter中,所以我想問題必須出在適配器的某處...

再次使用已經創建的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM