1

アンドロイド 2.3.3

カスタム アダプタを使用してリストビューを埋めています。リストビューの各行には、データベースから取得したデータから入力される 3 つのテキストビュー (カスタム レイアウト) があります。

問題は、データが最初に正しく表示されていることです。しかし、リストビューを下にスクロールしてから再度上にスクロールすると、リストビューの上部の行が下部の行に置き換えられ、下にスクロールすると、現在表示されている行に再び置き換えられます。

問題は行の再生成である可能性があると考えたので、viewHolder を使用する必要があります。viewHolder を使用しましたが、問題は解決しません。

これがコードです...

class MyCustomAdapter extends BaseAdapter{

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return c.getCount();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        HistoryViewHolder viewHolder;

            if(convertView == null)
            {
                LayoutInflater li = getLayoutInflater();
                convertView =  li.inflate(R.layout.history_row, null);

                viewHolder = new HistoryViewHolder();

                viewHolder.txtcnt = (TextView) convertView.findViewById(R.id.txtView_History_Count);
                viewHolder.txtexp = (TextView) convertView.findViewById(R.id.txtView_History_Expression);
                viewHolder.txtres = (TextView) convertView.findViewById(R.id.txtView_History_Result);

                convertView.setTag(viewHolder);
            }
            else
            {
                viewHolder = (HistoryViewHolder) convertView.getTag();
            }


            if(!c.isAfterLast())
            {

                viewHolder.txtcnt.setText(String.valueOf(position + 1));        
                System.out.println("Position"+viewHolder.txtcnt.getText().toString());

                expression = c.getString(c.getColumnIndex("expression"));
                result = c.getString(c.getColumnIndex("result"));

                c.moveToPosition(position + 1);

                viewHolder.txtexp.setText(expression);
                System.out.println("Expression"+viewHolder.txtexp.getText().toString());
                viewHolder.txtres.setText(result);      
                System.out.println("Result"+viewHolder.txtres.getText().toString());

            }   

        return convertView;
    }


    public class HistoryViewHolder {
        TextView txtcnt;
        TextView txtexp;
        TextView txtres;
    }

}

viewHolder を正しく使用していますか? viewHolder を使用する必要があるのはなぜですか? 正確にはどのような用途ですか?

編集 ::: vmironov の提案どおり ::: を削除し、if(!c.isAfterLast())に変更しc.moveToPosition(position + 1)ましたc.moveToPosition(position)。現在、置換は行われていませんが、最初の要素が 2 回繰り返されており、最後のエントリは表示されていません。また、上下にスクロールすると、最初の 2 行が表示されません。

EDIT 2 :::c.moveToPosition(position)上記の式 = を移動しただけですc.getString(c.getColumnIndex("expression"));

必要に応じてコード全体を投稿しています...

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    HistoryViewHolder viewHolder;

        if(convertView == null)
        {
            LayoutInflater li = getLayoutInflater();
            convertView =  li.inflate(R.layout.history_row, null);

            viewHolder = new HistoryViewHolder();

            viewHolder.txtcnt = (TextView) convertView.findViewById(R.id.txtView_History_Count);
            viewHolder.txtexp = (TextView) convertView.findViewById(R.id.txtView_History_Expression);
            viewHolder.txtres = (TextView) convertView.findViewById(R.id.txtView_History_Result);

            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (HistoryViewHolder) convertView.getTag();
        }

            viewHolder.txtcnt.setText(String.valueOf(position + 1));        
            System.out.println("Position"+viewHolder.txtcnt.getText().toString());

            c.moveToPosition(position);

            expression = c.getString(c.getColumnIndex("expression"));
            result = c.getString(c.getColumnIndex("result"));

            viewHolder.txtexp.setText(expression);
            System.out.println("Expression"+viewHolder.txtexp.getText().toString());
            viewHolder.txtres.setText(result);      
            System.out.println("Result"+viewHolder.txtres.getText().toString());            


    return convertView;
}


public class HistoryViewHolder {
    TextView txtcnt;
    TextView txtexp;
    TextView txtres;
}

}

4

1 に答える 1

0
  1. 条件を削除しif (!c.isAfterLast())ます。
  2. c.moveToPosition(position + 1)と置き換えますc.moveToPosition(position)
  3. c.moveToPosition(position)前に呼び出す必要がありますexpression = c.getString(c.getColumnIndex("expression"))
于 2013-03-17T07:24:23.807 に答える