listview崩溃的自定义适配器

时间:2012-11-02 18:56:25

标签: android listview adapter

此问题已得到解决。弄清楚这是一个简单的拼写错误,我引用了错误的布局文件。

我正在尝试为列表视图创建一个自定义适配器,以便我可以显示一个(不可编辑的)评级栏,其评级值是我的程序从菜单中每个项目的数据库中获得的。当我运行它时,它崩溃了,我无法弄清楚原因。

以下是尝试创建listview的方法。 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):at 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(“Bacon”),setBackgroundColor,setAllCaps等)的任何引用都会导致应用程序崩溃。

3 个答案:

答案 0 :(得分:1)

下次发布一个logcat。目前,您需要将myView更改为:

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

我还建议你让你的构造函数执行LayoutInflater实例化,因为截至目前 - 它已经完成了listview中的每一行。

答案 1 :(得分:1)

似乎在这些行中将NullPointerException抛出到getView方法

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

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

答案 2 :(得分:0)

代码实际上非常好,逻辑上

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

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

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