2013-03-17 3 views
1

Android 2.3.3ListView - 사용자 정의 어댑터 - 스크롤 할 때 값이 계속 변경됨

목록 뷰를 채우기 위해 사용자 지정 어댑터를 사용하고 있습니다. listview의 각 행에는 데이터베이스에서 검색된 데이터로 채워지는 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)으로 변경했습니다. 이제 교체가 발생하지 않지만 첫 번째 요소가 두 번 반복되고 마지막 항목이 표시되지 않습니다. 그리고 아래로 스크롤하면 처음 두 행이 표시되지 않습니다. 필요한 경우

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(position)
  • c.moveToPosition(position) 호출해야와 c.moveToPosition(position + 1) 교체'c.moveToPosition (위치 + 1)' c.moveToPosition (position)' –

  • +0

    나는 당신이 말한 것을했습니다. 내가 생각하는 사소한 문제. 질문을 수정했습니다. 한번보세요. –

    +1

    문제점을 발견했습니다. 'expression = c.getString (c.getColumnIndex ("expression"));' –

    답변

    0
    1. if (!c.isAfterLast()) 상태를 제거하십시오. `와 expression = c.getString(c.getColumnIndex("expression"))
    관련 문제