2011-03-15 7 views
0

나는 listview에 tv-show를 표시하는 Android 앱을 만들고 있습니다. 내 쇼 ListView에서오고 있지만 장소를 한 스크롤을 전환합니다.안드로이드 스위치 위치의 ListView

그들은 costum 목록보기로 작성하고 클래스는 여기에 있습니다 : 도움이 될 수 있습니다

public class CustomListViewAdapter extends BaseAdapter { 
    private static ArrayList<Show> searchArrayList; 
    private LayoutInflater mInflater; 
    private TextView txtTitle, txtPrev, txtNext; 

    public CustomListViewAdapter(Context context, ArrayList<Show> results) { 
     searchArrayList = results; 
     mInflater = LayoutInflater.from(context); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.custom_row, null); 
      txtTitle = (TextView) convertView.findViewById(R.id.title); 
      txtPrev = (TextView) convertView.findViewById(R.id.prevNrDate); 
      txtNext = (TextView) convertView.findViewById(R.id.nextNrDate); 
     } 

     txtTitle.setText(searchArrayList.get(position).getTitle()); 

     txtPrev.setText(searchArrayList.get(position).getPrevNr() + " - " + 
         searchArrayList.get(position).getPrevDate() + "\n" + 
         searchArrayList.get(position).getPrevTitle()); 

     txtNext.setText(searchArrayList.get(position).getNextNr() + " - " + 
         searchArrayList.get(position).getNextDate() + "\n" + 
         searchArrayList.get(position).getNextTitle()); 

     return convertView; 
    } 
} 

어떤 일이?

// 캐스퍼

답변

1

재생 된보기를 사용할 때 ViewHolder을 구현하여 추가 findViewById 전화를 저장 한 것처럼 보입니다. 문제는 재활용 된보기 대신 어댑터별로보기를 저장한다는 것입니다. 별도의 ViewHolder 개체를 만들고 각보기와 함께 개체를 저장해야합니다. 뷰의 태그는이를 수행하기에 좋은 장소입니다.

는 시도이 :

public class CustomListViewAdapter extends BaseAdapter { 
    private static ArrayList<Show> mSearchArrayList; 
    private LayoutInflater mInflater; 

    public CustomListViewAdapter(Context context, ArrayList<Show> results) { 
     mSearchArrayList = results; 
     mInflater = LayoutInflater.from(context); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.custom_row, null); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.title); 
      holder.prev = (TextView) convertView.findViewById(R.id.prevNrDate); 
      holder.next = (TextView) convertView.findViewById(R.id.nextNrDate); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final Show item = mSearchArrayList.get(position); 
     holder.title.setText(item.getTitle()); 

     holder.prev.setText(item.getPrevNr() + " - " + 
          item.getPrevDate() + "\n" + 
          item.getPrevTitle()); 

     holder.next.setText(item.getNextNr() + " - " + 
          item.getNextDate() + "\n" + 
          item.getNextTitle()); 

     return convertView; 
    } 

    private static class ViewHolder { 
     public TextView title; 
     public TextView prev; 
     public TextView next; 
    } 
} 
+0

아아, 정말 고맙습니다. – Casper

0

if(convertView == null) 블록 외부 이동

txtTitle = (TextView) convertView.findViewById(R.id.title); 
txtPrev = (TextView) convertView.findViewById(R.id.prevNrDate); 
txtNext = (TextView) convertView.findViewById(R.id.nextNrDate); 

.

보기는 재활용되지만보기를 만들 때만 설정됩니다.

+0

이 작동하지만이 방법의 아래쪽은 당신이 조회 통과 할 때마다 수행하고 있다는 점이다. 나중에 다시 사용할 수 있도록 해당 조회 결과를 저장하는 것이 더 효율적입니다. – adamp

+0

@adamp 오 그렇습니다. 반드시 ViewHolder 패턴을 사용해야합니다. 그가 게시 한 코드에 무엇이 잘못되었는지 지적하고있었습니다. –

관련 문제