2013-09-26 68 views
0

我有一个动态列表。我用this tutorial。这一切都正确加载,但是当我滚动时,我的标题出来的怪事和故障。我的代码与教程略有不同;一个文本在左边,中心而不是图像和两个文本视图。列表视图从Parse.com填充。滚动后动态列表查看

这是我的日志猫。

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 

的logcat的在这里说,我有一个错误在我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; 
} 

的教程中,我跟着没有给出太多解释这一点,它确实是什么。那么如何解决这个问题,以便在滚动前后正确显示?

编辑

我在哪里填充我适配器

 @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

将代码发布到您使用(填充)适配器的位置。 – Szymon

+0

仅供参考,你可能会对[StickyListHeaders](https://github.com/emilsjolander/StickyListHeaders)项目代码感兴趣,如果这个不适合你... – MiStr

+0

我试过了StickyListHeaders,我喜欢它,但它比我所需要的更多。尽管我喜欢它。 –

回答

1

的logcat的堆栈跟踪表明LinearLayout试图强制转换为TextView。你已经解决了这个错误吗?

+0

不,我没有...我不知道我是如何做这个或如何修复它 –

+0

什么是:SeparatedListAdapter.java:105 – MiStr

+0

啊..你使用Parse.com ..所有这些调用到“findInBackground”将返回(可能)不同的时间,所以你对“adapter.addSection()”的调用可能会回来并且乱序执行。谁知道它们每次何时返回,因为这是异步完成的。 – MiStr