自定义适配器不断显示错误数据

时间:2013-02-01 20:57:48

标签: android

我已经实现了一个自定义的ArrayAdapter,它似乎都运行正常但是每当我向适配器添加一个新项目并滚动列表时,文本视图中的文本似乎要改变,除了第一个TextView。

我也使用过ViewHolder模式,但它仍然无法正常工作:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ViewHolder holder;
    if (view == null) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.subject_row, null);

        holder = new ViewHolder();
        holder.subjectName = (TextView) view.findViewById(R.id.subject_name);
        holder.task1 = (TextView) view.findViewById(R.id.tasks1);
        holder.task2 = (TextView) view.findViewById(R.id.tasks2);
        holder.task3 = (TextView) view.findViewById(R.id.tasks3);
        holder.time = (TextView) view.findViewById(R.id.time);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }


    Subject subject = getItem(position);
    ArrayList<Task> tasks = subject.getTasks();
    int numTask = tasks.size();


    holder.subjectName.setText(subject.getSubjectName());
    holder.time.setText(subject.getHours() + " hrs " + subject.getMins() + " mins");

    switch (numTask) {
    case 0: {
        holder.task1.setVisibility(View.GONE);
        holder.task2.setVisibility(View.GONE);
        holder.task3.setVisibility(View.GONE);
        break;
    }
    case 1: {
        holder.task1.setText(tasks.get(0).getDescription());
        holder.task2.setVisibility(View.GONE);
        holder.task3.setVisibility(View.GONE);
        break;
    }
    case 2: {
        holder.task1.setText(tasks.get(0).getDescription());
        holder.task2.setText(tasks.get(1).getDescription());
        holder.task3.setVisibility(View.GONE);
        break;
    }
    case 3: {
        holder.task1.setText(tasks.get(0).getDescription());
        holder.task2.setText(tasks.get(1).getDescription());
        holder.task3.setText(tasks.get(2).getDescription());
        break;
    }
    }

    return view;
}

第一个带主题名称的文本视图似乎没有变化,但其他3个textviews'()中的数据也显示其他行的数据。

如果数据为空,但如果删除了switch语句并仍然得到相同的结果,则可能与隐藏其视图有关。

感谢。

3 个答案:

答案 0 :(得分:1)

您不会再次隐藏视图,例如:

case 1: {
    holder.task1.setVisibility(View.VISIBLE); // Add these!
    holder.task1.setText(tasks.get(0).getDescription());
    holder.task2.setVisibility(View.GONE);
    holder.task3.setVisibility(View.GONE);
    break;
}

答案 1 :(得分:0)

我认为你必须将持有人“回写”到视图中。

view.setTag(holder);

但我不明白你为什么要使用持有人级别。我想,你不需要这个!只需使用

TextView subjectName = view.findViewById(R.id.subjectName);
subjectName.setText(...);

答案 2 :(得分:0)

以下帖子对添加动态内容和保存状态有明确的解释。 希望它有所帮助。

http://sgandroiddev.blogspot.com/2013/02/custom-listview.html