0

基本的なリストビューアプリケーションを作成しようとしています。デフォルトのシステムアレイアダプタで正常に動作しました。次に、カスタムアダプタを使用できるように変更しようとしました。残念ながら、私は問題に遭遇しました。

アプリケーションを実行すると、ランタイムエラーは発生しません。リストが表示されるはずの黒い画面が表示されるため、リストが表示されている可能性がありますが、何らかの理由でアダプターがデータを検出していません。

とにかく、以下は私のリストアクティビティです:

    package com.example.waitronproto2;

    import java.util.ArrayList;
    import java.util.List;

    import android.app.ListActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;

    public class AppetizersActivity extends ListActivity{

            //Instance Variables
            //Array to hold menu appetizers - In future this will be pulled from web server
            private List<MenuItem> appetizers;
            private MenuItemArrayAdapter appetizersAdapter;


            @Override
            public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                //Garbage collection
                System.gc();
                setContentView(R.layout.appetizers_list);

                fillList();

                //Create custom array adapter - links list with source of data, an array.
                appetizersAdapter = new MenuItemArrayAdapter(this, appetizers);


                //Set the newly created adapter as the lists adapter.
                this.setListAdapter(appetizersAdapter); 
            }

            @Override
            protected void onListItemClick(ListView l, View v, int position, long id){
                //Toast for testing
                Toast.makeText(this.getApplicationContext(), l.getItemAtPosition(position) + " Clicked!", Toast.LENGTH_LONG).show();        

                //store clicked item in String variable
                String choice = l.getItemAtPosition(position).toString();

                //add to an array that is being passed from Activity to Activity
            }

            //fill the list with  menu items
            private void fillList(){
                appetizers = new ArrayList<MenuItem>();
                appetizers.add(new MenuItem("Appetizer 1", "Appetizer", 8.95));
                appetizers.add(new MenuItem("Appetizer 2", "Appetizer", 9.95));
                appetizers.add(new MenuItem("Appetizer 3", "Appetizer", 12.95));
                appetizers.add(new MenuItem("Appetizer 4", "Appetizer", 4.95));
                appetizers.add(new MenuItem("Appetizer 5", "Appetizer", 5.95));
                appetizers.add(new MenuItem("Appetizer 6", "Appetizer", 7.95));
                appetizers.add(new MenuItem("Appetizer 7", "Appetizer", 5.95));
                appetizers.add(new MenuItem("Appetizer 8", "Appetizer", 12.95));
                appetizers.add(new MenuItem("Appetizer 9", "Appetizer", 10.95));


            }
    }

これが私のアダプタクラスです:

    package com.example.waitronproto2;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

//Default array adapter for menu items
public class MenuItemArrayAdapter extends ArrayAdapter<MenuItem> {

    private List<MenuItem> menuItems;

    //Constructor
    public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems) {
        super(context, R.layout.menuitem_row);
        this.menuItems = menuItems;
    }

    //get views
    public View getView(final int position, View convertView, ViewGroup parent){
        View v = convertView;


        if(v == null){
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.menuitem_row, null);
        }

        //assign values to view
        MenuItem item = this.menuItems.get(position);

        TextView nameView = (TextView) v.findViewById(R.id.item_name);
        TextView priceView = (TextView) v.findViewById(R.id.item_price);


        nameView.setText(item.getName());
        priceView.setText(String.valueOf(item.getPrice()));

        return v;

    }

}

私が間違っているかもしれないアイデアはありますか?

どうもありがとう!

4

1 に答える 1

1

ArrayAdapter を拡張し、カスタム アダプターでローカル リストを使用すると、少し混乱します。ArrayAdapter は、空のリストを参照しているため リストにデータがあることを知りません。getCount()

代わりに、このスーパー コンストラクターを使用します。

//Constructor
public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems) {
    super(context, R.layout.menuitem_row, menuItems);
    //  Pass the ArrayAdapter your list   ^^^^^^^^^
}

そうしないmenuItemsと、時間の経過とともにコードが過度に複雑になります。getItem(position)現在使用している場所を使用する必要がありますthis.menuItems.get(position)


またはgetCount()、 、getItem()、およびをオーバーライドして、リストgetItemId()を指すようにすることもできますmenuItems。ただし、これを行う場合は、ArrayAdapter の利点の必要性を取り除いているため、BaseAdapter を直接拡張することもできます。

于 2012-12-04T23:56:39.820 に答える