2013-09-26 3 views
0

J'ai une liste qui est dynamique. J'ai utilisé this tutorial. Tout se charge correctement, mais quand je défile, mes en-têtes sont en panne et hors service. Mon code est légèrement différent du tutoriel; un texte sur la gauche à droite, et le centre à la place de l'image et deux vues de texte. La vue de liste est remplie à partir de Parse.com.ListView dynamique rupture après le défilement

Ceci est mon chat de journal.

09-26 20:51:27.115  757-757/com.codealchemist.clashmma E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386) 
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
    at com.codealchemist.clashmma.SeparatedListAdapter.getView(SeparatedListAdapter.java:105) 
    at android.widget.AbsListView.obtainView(AbsListView.java:2143) 
    at android.widget.ListView.makeAndAddView(ListView.java:1831) 
    at android.widget.ListView.fillUp(ListView.java:708) 
    at android.widget.ListView.fillGap(ListView.java:647) 
    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930) 
    at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3087) 
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3361) 
    at android.view.View.dispatchTouchEvent(View.java:7246) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
    at android.view.View.dispatchPointerEvent(View.java:7426) 
    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
    at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) 
    at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171) 
    at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342) 
    at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    at android.view.Choreographer.doFrame(Choreographer.java:530) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379) 
    ... 48 more 

Le LogCat dit que j'ai une erreur ici dans mon SeparatedListAdapter.java

@Override 
public boolean isEnabled(int position) { 
    return (getItemViewType(position) != TYPE_SECTION_HEADER); 
} 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    int sectionnum = 0; 
    for (Object section : this.sections.keySet()) 
    { 
     Adapter adapter = sections.get(section); 
     int size = adapter.getCount() + 1; 

     // check if position inside this section 
<----//This is (SeparatedListAdapter.java:105) -----> 
     if (position == 0) return headers.getView(sectionnum, convertView, parent); 
     if (position < size) return adapter.getView(position - 1, convertView, parent); 

     // otherwise jump into next section 
     position -= size; 
     sectionnum++; 
    } 
    return null; 
} 

Le tutoriel j'ai suivi n'a pas donné beaucoup d'explications à cela et ce qu'il fait vraiment. Alors, comment puis-je résoudre ce problème pour afficher correctement avant et après le défilement?

EDIT

Où je remplir mon adaptateur

 @Override 
protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main_list); 

    progressDialog = ProgressDialog.show(fightCard.this, "", "Loading bout...", true); 
    progressDialog.show(); 

    // Used this tutorial  http://custom-listview-with-separate-headers.blogspot.in/ 


    listView = (ListView) findViewById(R.id.Listview); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      HomeItem homeItem = (HomeItem) adapter.getItem(position); 
      Toast.makeText(getBaseContext(), homeItem.getHomeItemLeft().toString() + " " + homeItem.getHomeItemRight().toString(), Toast.LENGTH_LONG).show(); 
      System.out.println("Selected Item : " + homeItem.getHomeItemID()); 

     } 
    }); 

    PopulateHomePageItemList(); 
} 

private void PopulateHomePageItemList() { 
    adapter = new SeparatedListAdapter(this); 


    //create the main event 
    ParseQuery<ParseObject> MainEventQuery = ParseQuery.getQuery("MainEvent"); 
    MainEventQuery.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> parseObjects, ParseException e) { 
      if(e == null){ 
       int i = 0; 
       int size = parseObjects.size(); 
       Log.d("MAIN EVENT SIZE", size + ""); 
       HomeItemList = new ArrayList<HomeItem>(); 
       while (i < size){ 
        HomeItem homeItem = new HomeItem(); 
        homeItem.setHomeItemID(i); 
        name1 = parseObjects.get(i).getString("red"); 
        homeItem.setHomeItemLeft(name1); 
        name2 = parseObjects.get(i).getString("blue"); 
        homeItem.setHomeItemRight(name2); 
        HomeItemList.add(homeItem); 
        i++; 
       } 

       HomeListAdapter = new HomeListAdapter(getApplicationContext(), 0, HomeItemList); 
       if(HomeListAdapter!= null) 
        adapter.addSection(" MAIN EVENT ", HomeListAdapter); 

      } 
     } 
    }); 



    //create the co-main event 

    ParseQuery<ParseObject> CoMain = ParseQuery.getQuery("CoMainEvent"); 
    CoMain.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> parseObjects, ParseException e) { 
      if (e == null){ 
       int i = 0; 
       int size = parseObjects.size(); 
       Log.d("Co-MAIN SIZE", size + ""); 
       HomeItemList = new ArrayList<HomeItem>(); 
       while (i < size){ 
        HomeItem homeItem = new HomeItem(); 
        homeItem.setHomeItemID(i); 
        name1 = parseObjects.get(i).getString("red"); 
        homeItem.setHomeItemLeft(name1); 
        name2 = parseObjects.get(i).getString("blue"); 
        homeItem.setHomeItemRight(name2); 
        HomeItemList.add(homeItem); 
        i++; 
       } 
       HomeListAdapter = new HomeListAdapter(getApplicationContext(), 0, HomeItemList); 
       if(HomeListAdapter!= null) 
        adapter.addSection(" CO-MAIN EVENT ", HomeListAdapter); 

      } 
     } 
    }); 

    //create the fight card 
    ParseQuery<ParseObject> bout = ParseQuery.getQuery("bout"); 
    bout.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> parseObjects, ParseException e) { 
      if (e == null){ 
       int i = 0; 
       int size = parseObjects.size(); 
       Log.d("BOUT SIZE", size + ""); 
       HomeItemList = new ArrayList<HomeItem>(); 
       while (i < size) { 
        HomeItem homeItem = new HomeItem(); 
        homeItem.setHomeItemID(i); 
        name1 = parseObjects.get(i).getString("red"); 
        homeItem.setHomeItemLeft(name1); 
        name2 = parseObjects.get(i).getString("blue"); 
        homeItem.setHomeItemRight(name2); 
        HomeItemList.add(homeItem); 
        i++; 
       } 
       HomeListAdapter = new HomeListAdapter(getApplicationContext(), 0, HomeItemList); 
       if(HomeListAdapter!= null) 
        adapter.addSection(" FIGHT CARD ", HomeListAdapter); 


      } 
     } 
    }); 
    listView.setAdapter(adapter); 
    progressDialog.dismiss(); 

} 

} 
+0

Indiquez le code dans lequel vous utilisez (remplissez) votre adaptateur. – Szymon

+0

Pour info, vous pourriez être intéressé par le code de projet [StickyListHeaders] (https://github.com/emilsjolander/StickyListHeaders) aussi, si celui-ci ne fonctionne pas pour vous ... – MiStr

+0

J'ai essayé le StickyListHeaders, je aimé, mais il a fait plus que ce dont j'avais besoin. Je l'ai aimé bien. –

Répondre

1

Le logcat stacktrace indique qu'un LinearLayout tente d'être jeté comme TextView. Avez-vous déjà résolu cette erreur?

+0

Non je n'ai pas ... Je ne suis pas sûr de savoir comment je fais cela ou comment y remédier –

+0

Qu'est-ce qui est sur: SeparatedListAdapter.java:105 – MiStr

+0

Ah .. Vous utilisez Parse.com .. tous ces appels à "findInBackground" retournera à (éventuellement) différentes fois, donc vos appels de "adapter.addSection()" peuvent revenir et se dérouler dans le désordre .. Qui sait quand ils reviennent chacun, puisque cela est fait de manière asynchrone. – MiStr

Questions connexes