此问题已得到解决。弄清楚这是一个简单的拼写错误,我引用了错误的布局文件。
我正在尝试为列表视图创建一个自定义适配器,以便我可以显示一个(不可编辑的)评级栏,其评级值是我的程序从菜单中每个项目的数据库中获得的。当我运行它时,它崩溃了,我无法弄清楚原因。
以下是尝试创建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: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):at 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等)的任何引用都会导致应用程序崩溃。
答案 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);构造函数中的代码,然后不存储上下文