2012-09-25 4 views
0

아래 코드를 붙여 넣으면 개념은 뷰 소유자 클래스에서 볼 수있는 3 가지 유형의 목록보기 항목입니다. 난 itemList 원하는 객체 매칭되지는 _positionfreeTextHolder = (ViewHolderFreeText) rowView.getTag();에 충돌리스트 뷰를 스크롤하면 현재 위치를 그것 "free text" 너무 if (itemList.get(_position).getType().compareTo(Question.TYPE_CATEGORY) == 0) 해당 얻는 것을 보여 주지만 rowView.getTag() 그에게 _position 1 원하는 위치 늘려도록 체크 박스를 도시하고 충돌 . 목록보기의 ViewHolder에서 프로그램이 충돌 함

@Override 
public View getView(final int _position, View _convertView, 
     ViewGroup _parent) { 

    View rowView = _convertView; 
    if (itemList.get(_position).getType().compareTo(Question.TYPE_CATEGORY) == 0) { 
     ViewHolderBranch branchHolder = new ViewHolderBranch(); 

     // Compartment for Branch 
     if (rowView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.listview_branch, _parent, 
        false); 

      branchHolder.hTextTitle = (TextView) rowView 
        .findViewById(R.id.textTitleB); 
      branchHolder.hTextDetail = (TextView) rowView 
        .findViewById(R.id.textDetailB); 
      branchHolder.hIcon = (ImageView) rowView 
        .findViewById(R.id.imageArrow); 

      rowView.setTag(branchHolder); 
     } else { 

      branchHolder = (ViewHolderBranch) rowView.getTag(); 
     } 

     branchHolder.hTextTitle.setText(itemList.get(_position).getText()); 
     if (itemList.get(_position).isIsReadCode()) 
      branchHolder.hTextDetail.setText(itemList.get(_position) 
        .getReadCode()); 
     else 
      branchHolder.hTextDetail.setText(" "); 
     branchHolder.hIcon 
       .setImageResource(android.R.drawable.ic_media_play); 

     // return rowView; 
    } 

    else if (itemList.get(_position).getType() 
      .compareTo(Question.TYPE_CHECKBOX) == 0) { 
     // Compartment for Checkboxes 

     ViewHolderCheckbox checkboxHolder = new ViewHolderCheckbox(); 

     // Compartment for Branch 
     if (rowView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.listview_checkbox, _parent, 
        false); 

      checkboxHolder.hTextTitle = (TextView) rowView 
        .findViewById(R.id.textTitleCB); 
      checkboxHolder.hTextDetail = (TextView) rowView 
        .findViewById(R.id.textDetailCB); 
      checkboxHolder.hCheckBox = (CheckBox) rowView 
        .findViewById(R.id.checkBox); 
      rowView.setTag(checkboxHolder); 
     } else { 

      checkboxHolder = (ViewHolderCheckbox) rowView.getTag(); 
     } 

     checkboxHolder.hTextTitle 
       .setText(itemList.get(_position).getText()); 
     if (itemList.get(_position).isIsReadCode()) 
      checkboxHolder.hTextDetail.setText(itemList.get(_position) 
        .getReadCode()); 
     else 
      checkboxHolder.hTextDetail.setText(" "); 
     checkboxHolder.hCheckBox.setChecked(itemList.get(_position) 
       .isChecked()); 

     // return rowView; 

    } 

    if (itemList.get(_position).getType().compareTo(Question.TYPE_FREETEXT) == 0) { 
     ViewHolderFreeText freeTextHolder = new ViewHolderFreeText(); 

     // Compartment for Branch 
     if (rowView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.listview_button, _parent, 
        false); 

      freeTextHolder.hTextTitle = (TextView) rowView 
        .findViewById(R.id.textTitleBtn); 
      freeTextHolder.hTextDetail = (TextView) rowView 
        .findViewById(R.id.textDetailBtn); 
      freeTextHolder.hIcon = (ImageView) rowView 
        .findViewById(R.id.imagePlusBtn); 

      rowView.setTag(freeTextHolder); 
     } else { 

      freeTextHolder = (ViewHolderFreeText) rowView.getTag(); 
     } 

     freeTextHolder.hTextTitle.setText(itemList.get(_position).getText()); 
     if (itemList.get(_position).isIsReadCode()) 
      freeTextHolder.hTextDetail.setText(itemList.get(_position) 
        .getReadCode()); 
     else 
      freeTextHolder.hTextDetail.setText(" "); 
     freeTextHolder.hIcon 
       .setImageResource(android.R.drawable.ic_input_add); 

     // return rowView; 
    } 

    return rowView; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return itemList.size(); 
} 

@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; 
} 

및 뷰 홀더 클래스

이다

정적 클래스 ViewHolderBranch { 텍스트 뷰 hTextTitle; TextView hTextDetail; ImageView hIcon; }

static class ViewHolderFreeText 
{ 
    TextView hTextTitle; 
    TextView hTextDetail; 
    ImageView hIcon; 
} 

// View Holder for Checkbox Items 
/** 
* Class for holding different view items 
* 
*/ 
static class ViewHolderCheckbox { 
    TextView hTextTitle; 
    TextView hTextDetail; 
    CheckBox hCheckBox; 
} 

추적 (행의 다른 유형에 대한) 귀하의 다른 코드 지점은 각각 어떤 종류가 다시 사용되는 행보기를 처리 할 수 ​​있기 때문에 예외가 일어나고

09-23 15:36:29.105: D/AndroidRuntime(8908): Shutting down VM 09-23 15:36:29.105: W/dalvikvm(8908): threadid=1: thread exiting with 
uncaught exception (group=0x40014760) 09-23 15:36:29.326: 
E/AndroidRuntime(8908): FATAL EXCEPTION: main 09-23 15:36:29.326: 
E/AndroidRuntime(8908): java.lang.ClassCastException: 
com.techmelo.ws.CustomizeLViewAdapter$ViewHolderBranch cannot be cast 
to com.techmelo.ws.CustomizeLViewAdapter$ViewHolderFreeText 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
com.techmelo.ws.CustomizeLViewAdapter.getView(CustomizeLViewAdapter.java:157) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.AbsListView.obtainView(AbsListView.java:1943) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.ListView.makeAndAddView(ListView.java:1756) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.ListView.fillDown(ListView.java:656) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.ListView.fillGap(ListView.java:620) 09-23 15:36:29.326: 
E/AndroidRuntime(8908): at 
android.widget.AbsListView.trackMotionScroll(AbsListView.java:4350) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.AbsListView.onTouchEvent(AbsListView.java:2892) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.widget.ListView.onTouchEvent(ListView.java:3566) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.View.dispatchTouchEvent(View.java:4600) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1488) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1256) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1494) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1269) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1700) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1270) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.app.Activity.dispatchTouchEvent(Activity.java:2277) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1680) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2272) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.view.ViewRoot.handleMessage(ViewRoot.java:1958) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.os.Handler.dispatchMessage(Handler.java:99) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
android.os.Looper.loop(Looper.java:126) 09-23 15:36:29.326: 
E/AndroidRuntime(8908): at 
android.app.ActivityThread.main(ActivityThread.java:3997) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
java.lang.reflect.Method.invokeNative(Native Method) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
java.lang.reflect.Method.invoke(Method.java:491) 09-23 15:36:29.326: 
E/AndroidRuntime(8908): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
09-23 15:36:29.326: E/AndroidRuntime(8908): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 09-23 
15:36:29.326: E/AndroidRuntime(8908): at 
dalvik.system.NativeStart.main(Native Method) 09-23 15:36:39.334: 
W/ActivityThread(9001): Application com.techmelo.ws is waiting for the 
debugger on port 8100... 09-23 15:36:39.345: I/System.out(9001): 
Sending WAIT chunk 09-23 15:36:39.364: I/dalvikvm(9001): Debugger is 
active 09-23 15:36:39.554: I/System.out(9001): Debugger has connected 
09-23 15:36:39.554: I/System.out(9001): waiting for debugger to 
settle... 09-23 15:36:39.808: I/System.out(9001): waiting for debugger 
to settle... 09-23 15:36:40.014: I/System.out(9001): waiting for 
debugger to settle... 09-23 15:36:40.216: I/System.out(9001): waiting 
for debugger to settle... 09-23 15:36:40.416: I/System.out(9001): 
waiting for debugger to settle... 09-23 15:36:40.647: 
I/System.out(9001): waiting for debugger to settle... 09-23 
15:36:40.884: I/System.out(9001): waiting for debugger to settle... 
09-23 15:36:41.085: I/System.out(9001): waiting for debugger to 
settle... 09-23 15:36:41.299: I/System.out(9001): waiting for debugger 
to settle... 09-23 15:36:41.524: I/System.out(9001): waiting for 
debugger to settle... 09-23 15:36:41.755: I/System.out(9001): debugger 
has settled (1390) 09-23 15:36:42.994: D/dalvikvm(9001): GC_FOR_ALLOC 
freed 63K, 4% free 6386K/6599K, paused 45ms 09-23 15:36:43.004: 
I/dalvikvm-heap(9001): Grow heap (frag case) to 6.820MB for 
513744-byte allocation 09-23 15:36:43.284: D/dalvikvm(9001): 
GC_CONCURRENT freed <1K, 4% free 6888K/7111K, paused 29ms+2ms 09-23 
15:36:46.084: V/TLINE(9001): new: [email protected] 09-23 
15:36:47.904: V/TLINE(9001): new: [email protected] 09-23 
15:37:11.404: D/dalvikvm(9001): threadid=1: still suspended after undo 
(sc=1 dc=1) 09-23 15:37:11.414: D/dalvikvm(9001): GC_CONCURRENT freed 
117K, 4% free 7263K/7495K, paused 13ms+8ms 

답변

1

태그 객체와 연관됩니다.

가장 좋은 방법은 당신이 얼마나 많은 항목보기의 다른 유형 지정하고 목록의 위치에 사람들을지도하는 AdaptergetItemViewType(int)getViewTypeCount() 메소드를 오버라이드 (override)하는 것입니다. 이렇게하면 논리가 getView(...)으로 단순화되고 ListView은 다른보기 유형에 대해 행 재활용 풀을 다르게 처리합니다.

당신이 좋아하는 뭔가 getView(...)에서 테스트를 변경할 수 있습니다

if (getItemViewType(_position) == TYPE_CATEGORY) { 
    // code for categories 
} 

TYPE_CATEGORY이 어댑터 서브 클래스에 대해 이미 알고 int입니다.

+0

답장을 보내 주셔서 감사합니다.하지만이 함수 호출로이 함수 호출로 itemList.get (_position) .getType()이 이미 형식을 얻었고 위치가 정상이면 반환해야 함을 볼 수 있습니다. 올바른 가치 ... 모든 의견? 아직 당신이 제안한 방법을 시도하려고합니다. – MGD

+0

당신이하고있는 테스트는 당신의 목적에 따라 훌륭하지만, ListView는 행의 유형에 대해 아무 것도 모릅니다. 그래서 그것들을 모두 하나의 재활용 대기열에 넣고 상관없이 그들에게 돌려줍니다. 당신이 그들에게 붙인 "홀더"의 유형에. – lyricsboy

+0

그것은 나를 위해 일한 고마워. :) – MGD

관련 문제