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;
}
}
시도는'경우 (! c.isAfterLast())'조건을 제거하고 교체하기 전에
c.moveToPosition(position)
c.moveToPosition(position)
호출해야와c.moveToPosition(position + 1)
교체'c.moveToPosition (위치 + 1)' c.moveToPosition (position)' –나는 당신이 말한 것을했습니다. 내가 생각하는 사소한 문제. 질문을 수정했습니다. 한번보세요. –
문제점을 발견했습니다. 'expression = c.getString (c.getColumnIndex ("expression"));' –