Android 2.3.3ListView - 自定義適配器 - 值滾動時不斷變化
我正在使用自定義適配器來填充列表視圖。列表視圖中的每一行都有3個文本視圖(自定義佈局),它們是從數據庫檢索的數據中填充的。
問題是,數據第一次正確顯示。但是當我向下滾動然後再次向上滾動列表視圖時,列表視圖頂部的行將被底部的行替換,並且當向下滾動時,它們將再次被當前正在顯示的行替換。
我認爲問題可能是行的重新創建,我應該使用viewHolder。儘管我確實使用了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?有什麼用途?
編輯:::正如vmironov建議:::我已經刪除了if(!c.isAfterLast())
並將c.moveToPosition(position + 1)
更改爲c.moveToPosition(position)
。現在,替換不會發生,但第一個元素將重複兩次,而最後一個條目不會顯示。當我再次向下滾動時,前兩行不顯示。
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;
}
}
嘗試刪除'如果(!c.isAfterLast())',並更換'c.moveToPosition(位置+ 1)'和' c.moveToPosition(position)' – 2013-03-17 06:55:58
我做了你所說的。我想還是一個小問題。我編輯了這個問題,請看看它。 – 2013-03-17 07:04:15
我發現了這個問題。 'c.moveToPosition(position)''必須在'expression = c.getString(c.getColumnIndex(「expression」));' – 2013-03-17 07:10:41