0

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の実装で何が間違っている可能性があるかについてのアイデアはありますか?

4

3 に答える 3

0

それはおそらくあなたが使用CursorAdapterすべきであるようにあなたが使用していないためです。ではCursorAdapter、内部のビューを膨らませて、カーソルからのデータでビューをバインドするために渡されるビューnewView()を返す必要があります。デモプロジェクトはこちらから確認できます。を実装する方法を確認します。また、多くのチュートリアルを確認できます。そのうちの1つはこれです。viewbindView()CursorAdapterCursorAdapter

于 2012-10-16T05:40:34.703 に答える
0

カーソルの値を割り当てるには、getView() の代わりに bindView() および newView() メソッドを使用する必要があると思います。

于 2012-10-14T20:58:05.703 に答える
-1

このように getView() メソッドから if 条件を削除します。

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

    ViewHolder holder;


        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);

    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;
}
于 2012-10-15T04:27:12.603 に答える