ListView
ビューが最初に作成されたときに入力されたリストアイテムを正しく表示するという奇妙な問題がありますが、スクロールを開始すると、一部のアイテムの位置が変わり、リスト内の位置が反映されません。
これが私のコードです:
private class CustomCursorAdapter extends CursorAdapter {
LayoutInflater mInflater;
public CustomCursorAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
this.mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@SuppressWarnings("static-access")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.assignment_list_item, parent, false);
holder = new ViewHolder();
holder.colorStrip = (ColorStrip) convertView.findViewById(R.id.assignment_list_color_strip);
holder.titleLabel = (TextView) convertView.findViewById(R.id.list_title);
holder.descriptionLabel = (TextView) convertView.findViewById(R.id.list_description);
holder.dueLabel = (TextView) convertView.findViewById(R.id.list_due);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
assignmentsCursor.moveToPosition(position);
String title = assignmentsCursor.getString(1);
short course = assignmentsCursor.getShort(2);
String desc = assignmentsCursor.getString(3);
long due = assignmentsCursor.getLong(4);
holder.titleLabel.setText("Pos: " + position + " | " + title);
holder.colorStrip.setColor(colors.get(course));
convertView.setBackgroundColor(colorsLight.get(course));
String dueString = getDateString(due);
holder.dueLabel.setText(dueString);
holder.descriptionLabel.setText(desc);
return convertView;
}
@Override
public void bindView(View arg0, Context arg1, Cursor arg2) {}
@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { return null; }
@Override
public boolean hasStableIds() { return true; }
@Override
public int getViewTypeCount() { return 2; }
}
ここで私の問題のビデオを見ることができます:http://youtu.be/KzyTLSsDeJkビデオでは、スクロールすると7位のリストアイテムが束を変えており、リストは0から再開しているように見えます。 ListViewに表示されるのは、「Pos:0」、「Pos:1」...「Pos:8」、「Pos:9」などです。
色も8位からリストの最後までめちゃくちゃになっています。背景色は常に、リストアイテムの左側にあるストリップの明るいバージョンであると想定されています。
編集: ビデオでは、getViewが渡される位置(各リストアイテムのタイトルTextViewに反映されます)が最初に表示されるものの終わりまで(「Pos:6 | ...」を介して)正常であることがわかります。画面上では(スクロールせずに)、下にスクロールすると、次に表示されるものがすべて台無しになります。
これは、各リスト項目の最初のTextViewの表現です(括弧内は私のコメントです):
位置:0 | 第1章を読む(良い)
位置:1 | ナレッジボックスに記入する(良い)
位置:2 | 第1章のエッセイ(良い)
位置:4 | 第2章を読む(良い)
位置:5 | より多くの紙をバインダーに入れます(良い)
位置:6 | レッスン1を実行する(良い)
位置:## | [スクロールすると変化します](Pos:7で正しく開始されますが、さらにスクロールすると大きく変化します)
Pos:0 | 第1章を読んでください(Pos:8である必要があります)
Pos:1 | ナレッジボックスに記入します(Pos:9である必要があります)
位置:##は最初は画面外にあるアイテムですが、スクロールすると位置番号が変わります(ビデオを参照)。
編集2:これが私のViewHolderクラスです:
private static class ViewHolder {
private static ColorStrip colorStrip;
private static TextView titleLabel;
private static TextView descriptionLabel;
private static TextView dueLabel;
public ViewHolder() {}
}
編集3:キックのためだけに、ViewHolderの使用を停止し(そして毎回findViewById()を実行する非効率的なメソッドを使用しました)、問題はすべて解消されました。すべてのTextViewには適切な値が割り当てられており、色も見栄えがします。私のViewHolderの実装で何が間違っている可能性があるかについてのアイデアはありますか?