アンドロイド 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;
}
}