2013-06-14 4 views
1

현재 최대 두 가지보기 유형이 포함 된 매우 단순한 ListView에서 작업 중입니다. 순서대로 모든 것을 부드럽게 만들어보기를 재활용하려고합니다.여러보기 유형의 ListView 재활용

@Override 
public int getItemViewType (int position){ 
    if(mHasBefore&&position==0){ 
     return TYPE_PAGER; 
    }else if(mHasNext&&position==getCount()-1){ 
     return TYPE_PAGER; 
    }else return TYPE_SCORE; 
} 
@Override 
public int getViewTypeCount(){ 
    return 1+((mHasBefore==true||mHasNext==true)?1:0); 
}@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Log.d("outa","View: pos: "+position+ " . "+getItemViewType(position)+" - "+getViewTypeCount()); 
    if(getItemViewType(position)==TYPE_SCORE)return getScoreView(position,convertView,parent); 
    else return getPagerView(position,convertView,parent); 
} 
protected View getPagerView(int position,View convertView,ViewGroup parent){ 
    if (convertView == null){ 
     convertView = LayoutInflater.from(parent.getContext()).inflate(
       R.layout.listitem_highscore_pager, null);}} 
protected View getScoreView(int position,View convertView,ViewGroup parent){ 
    if (convertView == null){ 
     convertView = LayoutInflater.from(parent.getContext()).inflate(
       R.layout.listitem_highscore, null);}} 

Basicly 그것이 마지막 항목에서 다른보기를 표시해야하지만 여전히 로그 캣 그것의 getView에서 TYPE_SCORE되지 않은 상태 경우에도 기본 항목()를 보여줍니다 내 코드는 지금이다. 따라서 convertView는 재생 된 뷰를 제공합니다. 내가 잘못했거나 정상적인 행동입니까?

+0

가능한 중복 http://stackoverflow.com/questions/4777272/android-listview ... 여러 유형을 처리하지 않은 -with-different-layout-for-each-row) – IlyaEremin

답변

1

getItemViewType()은 안정된 값을 반환해야합니다. IOW, position0이고, getItemViewType()이고, 항상이다. 다른 mHasBefore 값을 기반으로하지 않는다.

불안정한 값을 사용하려면 값을 변경해야 할 때마다 notifyDataSetChanged()으로 전화해야합니다. 예를 들어, mHasBefore을 처음부터 전환하려면 notifyDataSetChanged()으로 전화해야하고 mHasBefore을 다시 원래 값으로 변경해야합니다. 여기

5

당신은 갈 :

private static final int TYPE_PAGER = 0; 
    private static final int TYPE_PAGER = 1; 
    private static final int VIEW_COUNT = 2; 

    private LayoutInflater mInflater = LayoutInflater.from(context); 

    @Override 
    public int getViewTypeCount(){ 
      return VIEW_COUNT; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
       ViewHolder holder; 
       ViewHolder2 holder2; 
       int type = getItemViewType(position); 

       if (convertView == null) { 
        holder = new ViewHolder(); 
        holder2 = new ViewHolder2(); 
        switch(type){ 
        case TYPE_SCORE: 
         Log.i(TAG, "ConvertView type1"); 
         convertView = mInflater.inflate(R.layout.listitem_highscore, null); 
         convertView.setTag(R.layout.listitem_highscore, holder); 
        break; 
        case TYPE_PAGER: 
         Log.i(TAG, "ConvertView type0"); 
         convertView = mInflater.inflate(R.layout.listitem_highscore_pager, null); 
         convertView.setTag(R.layout.listitem_highscore_pager, holder2); 
        break; 

        } 
} 

       } else{ 
        // Get the ViewHolder back to get fast access to the TextViews 
        holder = (ViewHolder) convertView.getTag(R.layout.baseadapter); 
        holder2 = (ViewHolder2)convertView.getTag(R.layout.baseadapter1); 
       } 


       switch(type){ 
      case TYPE_SCORE: 
       holder.holderText.setText("type1"); 
      break; 
      case TYPE_PAGER: 
       holder2.holder2Text.setText("type2"); 
      break; 

      } 
    } 

보기 보유자 :

static class ViewHolder { 
     //Place your views here for example: 
     TextView holderText; 

    } 

static class ViewHolder2{ 
     TextView holder2Text; 
    } 
+0

고맙습니다. 아주 잘 쓰여진 예. –

-2

무엇 HeaderView과의 ListView에 FooterView 사용에 대한?

그런 식으로, 당신은 ([각 행에 대해 다른 레이아웃과 안드로이드 목록보기]의

관련 문제