2013-03-17 42 views
1

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

}

+0

嘗試刪除'如果(!c.isAfterLast())',並更換'c.moveToPosition(位置+ 1)'和' c.moveToPosition(position)' – 2013-03-17 06:55:58

+0

我做了你所說的。我想還是一個小問題。我編輯了這個問題,請看看它。 – 2013-03-17 07:04:15

+1

我發現了這個問題。 'c.moveToPosition(position)''必須在'expression = c.getString(c.getColumnIndex(「expression」));' – 2013-03-17 07:10:41

回答

0
  1. 刪除if (!c.isAfterLast())條件。
  2. 更換c.moveToPosition(position + 1)c.moveToPosition(position)
  3. c.moveToPosition(position)之前,必須調用expression = c.getString(c.getColumnIndex("expression"))
相關問題