2011-09-15 9 views
2

클릭 한 항목의 ID를 가져와야합니다. 그래서 bindView에서 holder.layout.setTag (id)를 통해 viewHolder로 id를 설정하고 onClick에서 view.getTag를 통해이 값을 얻습니다. 이 코드는 그냥 실행할 때 잘 동작하지만 몇 가지 항목의 응용 프로그램 크래시 및 로그에서 스크롤 할 때 bindView의 ClassCastException javaLanString을 볼 수 있습니다. 따라서 setTag 및 getTag 코드가 완벽하지 않으면 완벽하게 작동합니다. 몇 시간 후에 나는 ClassCastException을 얻는 이유를 알아 내려고 노력하지만 대답을 찾지 못했습니다. 아이디어가 있습니까?CursorAdapter에서 스크롤하면 충돌 응용 프로그램이 발생합니다.

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    String value = cursor.getString(itemId); 
    Log.i("MINE", value); 
    holder.layout.setTag(value); 
    holder.name.setText(cursor.getString(itemName)); 
    holder.country.setText(cursor.getString(itemCountry)); 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View view = inflater.inflate(com.home.R.layout.item_list_row, 
      parent, false); 
    ViewHolder holder = new ViewHolder(
      (TextView) view.findViewById(com.home.R.id.item_row_name), 
      (TextView) view.findViewById(com.home.R.id.item_row_population), 
      (TextView) view.findViewById(com.home.R.id.item_row_country), 
      (ImageView) view.findViewById(com.home.R.id.icon), 
      (View) view.findViewById(R.id.row_item)); 
    view.setTag(holder); 
    view.setOnClickListener(this); 
    return view; 
} 

private static final class ViewHolder { 
    final TextView name; 
    final TextView population; 
    final TextView country; 
    final ImageView icon; 
    final View layout; 

    public ViewHolder(TextView name, TextView population, TextView country, 
      ImageView icon, View layout) { 
     this.name = name; 
     this.population = population; 
     this.country = country; 
     this.icon = icon; 
     this.layout = layout; 
    } 
} 

편집 : 나는이 줄에 오류 ViewHolder 홀더 = (ViewHolder) view.getTag()를 얻을; 아래에 오류가 발생한 위치를 보여주는 stacktrace를 넣습니다. 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : 치명적인 예외 : 주 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : java.lang .ClassCastException : java.lang.String 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : com.dataart.representation.ItemsAdapter.bindView에서 (ItemsAdapter.java:38) 09-15 13:35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.CursorAdapter.getView (CursorAdapter.java:186) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.AbsListView.obtainView (2175) : android.widget.ListView.addViewBelow (ListView.java:2914) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : 오류/AndroidRuntime (2175) : android.widget.ListView.scrollListItemsBy (ListV (목록 뷰 : .java : 2843) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.ListScrollImpl (ListView.java:2340) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.ListView.arrowScroll (ListView.java:2287) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.ListView.commonKey (ListView.java : 2089) 09-15 13:35:21.586 : ERROR/AndroidRuntime (2175) : android.widget.ListView.onKeyDown (ListView.java:2036) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.KeyEvent.dispatch (KeyEvent.java:1256) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.View.dispatchKeyEvent (View.java:3855) 09 -15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:787) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.widget.ListView.dispatchKeyEvent (ListView.java:2021) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:789) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:789) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:789) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view. ViewGroup.dispatchKeyEvent (ViewGroup.java:789) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at com.android.internal.policy.impl.PhoneWindow $ DecorView.superDispatchKeyEvent (PhoneWindow.java:1687) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at com.android.internal.p olicy.impl.PhoneWindow.superDispatchKeyEvent (PhoneWindow.java:1120) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.app.Activity.dispatchKeyEvent (Activity.java:2073) 09-15 13 : 35 : 21.586 : 오류/AndroidRuntime (2175) : com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent (PhoneWindow.java:1663) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime 2175) : android.view.ViewRoot.deliverKeyEventToViewHierarchy (ViewRoot.java:2560) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.view.ViewRoot.handleFinishedEvent (ViewRoot.java:2535) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at android.view.ViewRoot.handleMessage (ViewRoot.java:1867) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at android.os.Handler.dispatchMessage (Handler.java : 99) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : android.os.Looper.loop (Looper.java:123) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime 2175) : android.app.ActivityThread.main (ActivityThread.java:3647) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : java.lang.reflect.Method.invokeNative (기본 메소드) 09/13 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : java.lang.reflect.Method.invoke (Method.java:507) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 09-15 13 : 35 : 21.586 : ERROR/AndroidRuntime (2175) : at dalvik.system.NativeStart.main (기본 메소드)

+0

스택 추적에서 전체 오류 줄을 제공하고 코드 목록에서 오류가 발생하는 위치를 표시하여 누군가가 실제로 많은 도움을 제공해야합니다. 또한'holder.layout'에'setTag()'를 호출하는 이유를 알지 못합니다 - 일반적으로 홀더 패턴의 일부는 아닙니다. – CommonsWare

+0

답변 해 주셔서 감사합니다. 내 이상한 결정은 어떨까요? 그렇습니다. 당신은 절대적으로 맞습니다. 그러나 나는 이드의 이드를 얻을 필요가 있습니다. 올바른 방법으로 조언하는 방법을 조언 해 줄 수 있습니까? –

답변

1

String으로 setTag()으로 전화하고 ViewHolder으로 이전에 수행 한 setTag()을 덮어 씁니다.

String으로 setTag()으로 전화하지 않아도됩니다. CursorAdapter에서 getItemId() 번으로 전화하면 언제든지 _ID 값을 얻을 수 있습니다.

답을 받아 들일 수 없다면 에 long id 데이터 멤버를 추가하고 _ID을 입력하십시오.

+0

나는 부끄럽다. 고마워요, Mark - 두 번째 충고가 도와 줘요. _onClick() _ 메서드에서 위치 변수가 없으므로 첫 번째 방법을 사용할 수 없습니다. –

관련 문제