0

カスタム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つのテキストビュー'()内のデータも他の行のデータを示しています。

データが空白の場合はビューを非表示にすることと関係があるかもしれませんが、switchステートメントを削除しても同じ結果が得られます。

ありがとう。

4

3 に答える 3

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;
}
于 2013-02-01T21:26:03.780 に答える
0

ホルダーをビューに「書き戻す」必要があると思います。

view.setTag(holder);

しかし、なぜホルダークラスを使用するのかわかりません。私はあなたがこれを必要としないと思います!使用するだけ

TextView subjectName = view.findViewById(R.id.subjectName);
subjectName.setText(...);
于 2013-02-01T21:07:51.713 に答える
0

以下の投稿には、動的コンテンツの追加と状態の保持に関する明確な説明があります。それが役に立てば幸い。

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

于 2013-02-01T21:32:07.187 に答える