0

リストビュー項目に動的テキストビューを追加しようとしています。テキストビューの追加に成功したデータに応じて、テキストビューは1〜2以上になる可能性がありますが、スクロール時にテキストビューが繰り返されるという問題があります。

ループのたびにテキストビューの新しいオブジェクトを作成しています.アンドロイドが既存のビューを再利用しようとする問題を認識していますが、毎回新しいビューを追加する必要があります.

カスタムアダプターのコードは次のとおりです。

public class ViewHolder {
    TextView text1;
    LinearLayout linearLayout;
    TextView t;
    TextView t1;
}

getView メソッド

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

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.two_item_icon_text, null);
        holder = new ViewHolder();
        holder.text1 = (TextView) convertView.findViewById(R.id.text1);

        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();

    }

    holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.lin_lay_dynamic);
    holder.text1.setText("" + DATA1[position]);
    String tmp, dateparsed;
    dateparsed = DATA1[position].substring(0, DATA1[position].indexOf(":"));
    for (int x = 0; x < calendareventholder1.size(); x++) {

        objHolder = (CalendarEventHolder) calendareventholder1.get(x);

        if (objHolder.opendate.equals(displaydate[current])) {

            tmp = objHolder.dtstarttime.toString().substring(0, objHolder.dtstarttime.toString().indexOf(":"));

            if (Integer.parseInt(tmp) >= Integer.parseInt(dateparsed) && Integer.parseInt(tmp) < Integer.parseInt(dateparsed) + 1) {
                holder.t = new TextView(convertView.getContext());
                holder.t.setText(":-d ");
                holder.t.setOnClickListener(this);

                if (Common.isChildSessionAlerted(String.valueOf(objHolder.id), getApplicationContext(), object1)) {

                    holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime + " :-a");
                } else {
                    holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime);
                }
                holder.t.setTag(objHolder.id);
                holder.t.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10));
                holder.t.setTextColor(Color.BLACK);
                holder.t.setText(getSmiledText(ScheduleActivity.this,
                holder.t.getText().toString()));
                holder.linearLayout.addView(holder.t);
                holder.t1 = new TextView(convertView.getContext());
                holder.t1.setOnClickListener(this);
                holder.t1.setText(objHolder.title);
                holder.t1.setTag(objHolder.id);

                holder.t1.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10));
                holder.t1.setTextColor(Color.BLACK);
                holder.linearLayout.addView(holder.t1);
            }
        }
    }
    return convertView;
}
4

1 に答える 1

1

非常に説明的ではないため、ホルダーにあるものを実際に理解するのは少し難しいですが、質問を正しく読んでいる場合、アイテムが繰り返される理由は、Views以前にあったものを追加するだけで削除しないためです。ListViewビューをリサイクルします。つまり、以前にそこにあったものはそこにとどまります。スクロールすると、新しいビューを作成するのではなく、実際にビューを再利用し続けます。ここには同様の問題に関する質問がたくさんあるため、詳細には触れません。しかし、一番上であなたがすべきこと

getView() {
    /*previous stuff, and holder.linearLayout must have been set!*/
    if(holder.linearLayout.getChildCount() > 0)
        holder.linearLayout.removeAllViews();

このようにして、すでにそこにあるビューはすべて削除されます。最後に、これもチェックしてください。私が投稿したことをしなければならない理由を理解するのに非常に役立ちます。

于 2012-12-21T06:40:46.563 に答える