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:36.284:E/AndroidRuntime(619):致命异常:主要 11-02 18:10:36.284:E/AndroidRuntime(619):java.lang.NullPointerException 11-02 18:10:36.284: E/AndroidRuntime(619): 在 edu.calvin.cs.dininghall4.MenuAdapter.getView(MenuAdapter.java:49) 11-02 18:10:36.284: E/AndroidRuntime(619): 在 android.widget.AbsListView.obtainView (AbsListView.java:2267) 11-02 18:10:36.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(“Bacon”)、setBackgroundColor、setAllCaps 等)的任何引用都会导致应用程序崩溃。

4

3 回答 3

1

next time post a logcat. for now, you need to change your myView to:

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

also i suggest you let your constructor do the LayoutInflater instantiation, because as of now - it's done for every row in your listview.

于 2012-11-02T19:11:45.290 回答
1

似乎在这些行中抛出了NullPointerException你的getView方法

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

首先检查视图的 id 是否与布局文件“hall_list_item.xml”中的视图匹配,您可以通过发布 xml 文件来帮助我们。

于 2012-11-02T20:10:51.533 回答
0

代码其实还不错,逻辑上

measureHeightOfChildren

那家伙真恶心。在内部,您使用的是 LinearLayout 吗?老实说,我不确定这是否是答案,但是...

LinearLayouts 有时会发生内部视图以某种方式变得大于布局分配的空间,这听起来很奇怪,因为 ListViews 在理论上应该具有无限的高度。我想知道高度是否设置为 match_parent 或其他东西

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

于 2012-11-02T20:21:22.890 回答