2012-11-02 86 views
0

这个问题定义适配器已得到解决。找出它是一个简单的错字,我引用了错误的布局文件。的列表视图崩溃

我试图创建一个自定义适配器列表视图,这样我可以显示与等级值,我的计划从菜单中的每个项目数据库得到了(不可编辑)的评级吧。当我运行它时,它崩溃,我无法弄清楚为什么。

这是试图创建列表视图的方法。 SetBogusFoodArray2()返回在另一个类中定义的菜单项的ArrayList。这一切都正常工作。

private void setupMenu2(){ 
    ArrayList<MenuItem> menu = setBogusFoodArray2();   
    MenuAdapter myMenuAdapter = new MenuAdapter(this, menu); 
    ListView menuList = (ListView) findViewById(R.id.listView1); 

    menuList.setAdapter(myMenuAdapter); 
} 

这里是我的适配器的定义。

public class MenuAdapter extends BaseAdapter{ 
    private Context context; 
    private List<MenuItem> myMenu = new ArrayList<MenuItem>(); 

    public MenuAdapter(Context context, ArrayList<MenuItem> menu){ 
     context = context; 
     myMenu = menu; 
    } 

    public int getCount() { 
     return myMenu.size(); 
    } 

    public Object getItem(int position) { 
     return myMenu.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View myView = convertView; 
     MenuItem myFood = (MenuItem) getItem(position); 
     if (convertView == null){ 
      LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      myView = inf.inflate(R.layout.hall_list_item, null); 
     } 

     TextView name = (TextView) myView.findViewById(R.id.textView1); 
     TextView hall = (TextView) myView.findViewById(R.id.textView2); 
     RatingBar rating = (RatingBar) myView.findViewById(R.id.ratingBar1); 

     name.setText(myFood.myName); 
     hall.setText(myFood.myHall); 

     rating.setRating(myFood.myRating); 

     return myView; 
    } 
} 

任何帮助将不胜感激! 这是logcat中的头几个错误。如果你想看到更多,还有更多的红色!

11-02 18:10:3​​6.284:E/AndroidRuntime(619):致命异常:主 11-02 18:10:3​​6.284:E/AndroidRuntime(619):显示java.lang.NullPointerException 11-02 18:10:3​​6.284:E/AndroidRuntime(619):在edu.calvin.cs.dininghall4.MenuAdapter.getView(MenuAdapter.java:49) 11-02 18:10:3​​6.284:E/AndroidRuntime(619):在android.widget.AbsListView.obtainView(AbsListView.java:2267) 11-02 18:10:3​​6.284:E/AndroidRuntime(619):在android.widget.ListView.measureHeightOfChildren(ListView.java:1244)

下面是相关的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ff444444" > 


    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textColor="#ffffffff" /> 

    <RatingBar 
     android:id="@+id/ratingBar1" 
     android:isIndicator="true" 
     android:rating = "2.5" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textView1" 
     style="?android:attr/ratingBarStyleSmall"/> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/ratingBar1" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="10dp" 
     android:text="Small Text" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:textColor="#ffffffff" /> 

</RelativeLayout> 

通过排除法和注释掉的代码,这是问题的线路有:

name.setText(myFood.myName); 
    hall.setText(myFood.myHall); 
    rating.setRating(myFood.myRating); 

它与这些行注释掉,但文本仅仅是默认的。我试图简单地插入值而不是变量,但它仍然崩溃。看来,对这些(setText(“培根”),setBackgroundColor,setAllCaps等)的任何引用都会导致应用程序崩溃。

+0

您可以发布LogCat? –

+0

而时髦的括号是复制/粘贴到问题的产物。他们在实际的代码中都很好。 – Dragonfiremalus

+1

请发布logcat日志和您的布局xml文件.. –

回答

1

似乎对这些线路的扔NullPointerExceptiongetView方法

 name.setText(myFood.myName); 
     hall.setText(myFood.myHall); 
     rating.setRating(myFood.myRating); 

第一件事就是检查是否视图的ID在你的布局文件上的完全一致“hall_list_item.xml”你可以帮助我们发布xml文件。

1

下一次交一个logcat的。现在,你需要改变你的myView到:

myView = inf.inflate(R.layout.hall_list_item, parent, false); 

还我建议你让你的构造做LayoutInflater实例,因为到现在为止 - 这是在您的列表视图中的每一行进行。

+0

感谢您的建议。我改变了myView行,它仍然崩溃。另外,我添加了我的logcat。 – Dragonfiremalus

0

的代码实际上是相当不错的,在逻辑上

measureHeightOfChildren 

那家伙就是讨厌。在内部,你使用的是LinearLayout吗?老实说,我不确定这是否是答案,但是......

LinearLayouts有时会发生什么情况,内部视图变得比布局的分配空间大,这听起来很奇怪,因为理论上,ListView应该具有无限的高度。我想知道如果高度设置为match_parent或者其他东西

另外,我会考虑检查上下文。考虑把.getSystemService(Context.LAYOUT_INFLATER_SERVICE);代码在构造函数中,然后不存储上下文