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( "Bacon")、setBackgroundColor、setAllCapsなど)への参照があると、アプリがクラッシュするようです。

4

3 に答える 3

1

次回はlogcatを投稿してください。今のところ、次のように変更する必要がありますmyView

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

また、コンストラクターにLayoutInflaterインスタンス化を実行させることをお勧めします。これは、現時点では、リストビューのすべての行に対して実行されるためです。

于 2012-11-02T19:11:45.290 に答える
1

NullPointerExceptionこれらの行の1つがあなたのgetViewメソッドにスローされるようです

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

まず、ビューのIDがレイアウトファイル「hall_list_item.xml」のIDと一致するかどうかを確認し、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 に答える