2013-03-17 47 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"))