2014-07-18 36 views
0

我正在使用BaseExpandableListAdapter,如下所示。在那里,而不是传递一个列表,我直接传递一个View成为一个子数据。并且子计数总是返回为1.因为每个标题只有一个视图。

public class TaxAdapter extends BaseExpandableListAdapter{ 

    private Context _context; 
    private ArrayList<String> _listDataHeader; 
    private HashMap<String, View> _listDataChild; 


    public TaxAdapter(Context context, ArrayList<String> taxListDataHeader, 
      HashMap<String, View> taxListDataChild) { 
     this._context = context; 
     this._listDataHeader = taxListDataHeader; 
     this._listDataChild = taxListDataChild; 
    } 

    @Override 
    public int getGroupCount() { 
     return this._listDataHeader.size(); 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return 1; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this._listDataHeader.get(groupPosition); 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LinearLayout earningsContainer = new LinearLayout(_context); 
      LayoutInflater inflator = ((Activity)_context).getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row_tax_explv_title, 
        earningsContainer, false); 
      ((TextView) convertView.findViewById(R.id.explvTaxTitleText)).setText(headerTitle); 
     } 

     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

     return (View)getChild(groupPosition, childPosition); 

    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return false; 
    } 

} 

,并从活动而被传递的数据是如下 -

ArrayList<String> TaxListDataHeader = new ArrayList<String>(); 
    HashMap<String, View> TaxListDataChild = new HashMap<String, View>(); 

TaxListDataHeader.add("Movie Shows"); 
TaxListDataChild.put("Movie Shows", moviesContainerView); 
TaxListDataHeader.add("Theatre Shows"); 
TaxListDataHeader.add("Theatre Shows", theatreContainerView); 

movieContainerView和theareContainerView是layouts.like此

LayoutInflater inflator = ((Activity) context).getLayoutInflater(); 
     View row = inflator.inflate(R.layout.row_movie_data, 
       movieMainContainer, false); 

     ((TextView) row.findViewById(R.id.txtEmpInfoPopUpTitle)).setText(key); 
     ((TextView) row.findViewById(R.id.txtEmpInfoPopUpValue)).setText(value); 
     return row; 

我收到的两个自定义线性膨胀如标题中的错误,但是日志没有指定任何文件名。 请提出错误发生的位置。请建议可以做些什么。

编辑: 这是堆栈跟踪

07-17 22:53:57.043: E/AndroidRuntime(5074): FATAL EXCEPTION: main 
07-17 22:53:57.043: E/AndroidRuntime(5074): Process: com.synthesize.paysal, PID: 5074 
07-17 22:53:57.043: E/AndroidRuntime(5074): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.ListView.measureScrapChild(ListView.java:1183) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.ListView.onMeasure(ListView.java:1149) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1226) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.ScrollView.onMeasure(ScrollView.java:326) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.View.measure(View.java:16497) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.Choreographer.doFrame(Choreographer.java:544) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.os.Handler.handleCallback(Handler.java:733) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.os.Handler.dispatchMessage(Handler.java:95) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.os.Looper.loop(Looper.java:136) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at java.lang.reflect.Method.invoke(Method.java:515) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
07-17 22:53:57.043: E/AndroidRuntime(5074):  at dalvik.system.NativeStart.main(Native Method) 

编辑: 我试图与像这样的列表视图包住线性布局,

TaxListDataChild.put (“Theatre Show”,(新的 ListView(上下文)).addView(theatrerowContainer, LayoutParams.MATCH_PARENT,LayoutParams。 MATCH_PARENT));

但似乎第二个参数是无效的。

我在xml中使用其他线性布局行填充“new Linearlayout”(earningsContainer)。

for (int i = 0; i < taxMainObject.getTaxEarnings().size(); i++) { 
     earningsContainer.addView(getTaxEarningsRow(taxMainObject 
        .getTaxEarnings().get(i))); 
      totalEarnings += taxMainObject.getTaxEarnings().get(i) 
        .getTotalAmount(); 
     } 
     earningsContainer.addView(getTaxTotalRow("GROSS TOTAL SALARY", 
       totalEarnings + "")); 

和行的XML是 -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="right" 
    android:orientation="horizontal" 
    android:background="#ffeeeeee" > 


    <TextView 
     android:id="@+id/txtTotalText" 
     android:layout_width="180dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="15dp" 
     android:textAppearance="@android:attr/textAppearanceSmall" 
     android:textColor="#736F6E" 
     android:textSize="14sp" 
     android:textStyle="bold|italic" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:gravity="right|center_vertical" 
     android:orientation="horizontal" 
     android:padding="2dp" > 

     <TextView 
      android:id="@+id/txtTotalValue" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="@android:attr/textAppearanceSmall" 
      android:textColor="#736F6E" 
      android:gravity="right" 
      android:textSize="14sp" 
      android:layout_weight="1" 
      android:textStyle="italic" /> 
     </LinearLayout> 
</LinearLayout> 
+0

请发布完整的堆栈跟踪 –

+0

您是否尝试清理您的项目?在Eclipse中,经常发生R文件在更改资源后未更新,导致ID引用意外的视图,因此导致classcast异常。但是,您必须提供日志。如果你不能注意到日志中的问题,并不意味着其他人也不会注意到它。 Downvote现在。 – Marius

+0

@GabeSechan,..添加了堆栈跟踪.. – Archer

回答

0

android.widget.ListView $的LayoutParams是android.widget.ViewGroup $的LayoutParams的子类,同时android.widget.AbsListView也是同一小类一个即兄弟关系,因此类型转换会抛出异常。 参考

http://developer.android.com/reference/android/widget/AbsListView.LayoutParams.html

这意味着你不能直接传递一个视图作为孩子的ListView适配器,而不是试图通过HashMap和动态膨胀的看法。 试试这个:

@Override 
    public Object getChild(int groupPosition, int childPosititon) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .get(childPosititon); 
} 

哪里listDataHeader是传递给适配器像

public ExpandableListAdapter(Context context, List<String> listDataHeader, 
     HashMap<String, List<String>> listChildData) { 
    this._context = context; 
    this._listDataHeader = listDataHeader; 
    this._listDataChild = listChildData; 
} 

(传递HashMap的相反视图)

+0

嗨,我试过这..同样的问题仍然存在 – Archer

+0

我认为你在线路上犯了一个错误: TaxListDataChild.put(“Theater Show”,(new ListView(context))。addView(theatrerowContainer,LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 在此,您将尝试在将视图添加到布局之前设置大小。 这样做, LayoutParams lp = fooView.getLayoutParams(); lp.width = 123; lp.height = 456; fooView.requestLayout(); 然后将此视图添加到TaxListDataChild。 – kalimba

+0

我在做 - 'LayoutParams lp = earningsContainer.getLayoutParams(); lp.height = android.widget.AbsListView.LayoutParams.WRAP_CONTENT; lp.width = android.widget.AbsListView.LayoutParams.WRAP_CONTENT; earningsContainer.requestLayout();' 其中earningsContainer是 '的ListView earningsContainer =新的ListView(背景);' ,但我得到一个NullPointerException异常,而这样做getLayoutParams() – Archer

0

虽然这是不相关的Java的一个HashMap,但我仍然有同样的错误。我在课堂上“扩展了AppCompatActivity”,但是当我用“Extends Activity”代替它时,错误得到了解决。希望这对其他人有帮助,因为我在此上了三个小时。乐意帮忙

相关问题