Android:我们可以在不使用BaseAdapter的情况下加载包含ArrayList对象的listview吗

Android:我们可以在不使用BaseAdapter的情况下加载包含ArrayList对象的listview吗,android,listview,Android,Listview,我有一个ListView,它应该填充ArrayList对象 ArrayList<BrowserClass> playListArr = new ArrayList<BrowserClass>(); 为了填充ListView,我使用以下代码: ArrayAdapter<BrowserClass> plAdapter = new ArrayAdapter<BrowserClass>(this, android.R.layout.simple_list

我有一个ListView,它应该填充ArrayList对象

ArrayList<BrowserClass> playListArr = new ArrayList<BrowserClass>();
为了填充ListView,我使用以下代码:

ArrayAdapter<BrowserClass> plAdapter = new ArrayAdapter<BrowserClass>(this, android.R.layout.simple_list_item_1, playListArr);
myListView.setAdapter(plAdapter);
ArrayAdapter plAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,playlarr列表);
myListView.setAdapter(plAdapter);
但是listView显示了一些垃圾值。我只需要显示名称(浏览器类中的getname()。我可以使用自定义Listview、BaseAdapter来实现这一点。但我想在不使用BaseAdapter的情况下实现它。

如下所示:

Product.java

public class Product {
private int id;
private String name;
private double price;

public Product(){
    super();
}

public Product(int id, String name, double price) {
    super();
    this.id = id;
    this.name = name;
    this.price = price;
}

@Override
public String toString() {
    return this.id + ". " + this.name + " [$" + this.price + "]";
}
}
main活动

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ListView listView1 = (ListView) findViewById(R.id.listView1);

    Product[] items = { 
        new Product(1, "Milk", 21.50), 
        new Product(2, "Butter", 15.99), 
        new Product(3, "Yogurt", 14.90), 
        new Product(4, "Toothpaste", 7.99), 
        new Product(5, "Ice Cream", 10.00), 
    };

    ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this,
                android.R.layout.simple_list_item_1, items);

    listView1.setAdapter(adapter);
}
}
公共类MainActivity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView1=(ListView)findViewById(R.id.listView1);
产品[]项={
新产品(1,“牛奶”,21.50),
新产品(2“黄油”,15.99),
新产品(3,“酸奶”,14.90),
新产品(4“牙膏”,7.99),
新产品(5“冰淇淋”,10.00),
};
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,items);
listView1.setAdapter(适配器);
}
}

如果希望适配器按原样工作,应重写BrowserClass中的toString()方法。适配器将使用它填充列表视图,默认的toString()方法使用对象的内存位置

该方法是存在于所有Java对象中的通用方法。ArrayAdapter的默认行为是在一行文本中显示对象。将对象转换为文本的通用方法是toString方法。默认情况下,这将返回如下内容“MyClass@0x1D2EF5512“(对象在内存中的类名和位置)


重写toString()方法时,告诉java对象将如何显示为字符串

不能对适配器构造函数使用
ArrayList
。首先,需要将ArrayList项复制到数组中,然后将新创建的数组传递给适配器构造函数

如何将ArrayList项复制到阵列

ArrayList.toArray(Array);
然后使用数组作为适配器构造函数


希望您理解我要解释的内容。

下面是一个使用简单列表的示例:

Class File:

    public class Name{
        public Integer id;
        public String text;

        public Name() {
        }

        public Name(int id, String text) {
            this.id = id;
            this.text = text;
        }

        public String toString() 
        {
            return this.text;
        }
    }


Activity File:


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView1 = (ListView)findViewById(R.id.listview1);
        editsearch = (SearchView) findViewById(R.id.search1);

        editsearch.setOnQueryTextListener(this);

        List<Name> list = new List<Name>();
        list.add(new Name(1, "a1"));
        list.add(new Name(2, "a2"));
        list.add(new Name(3, "a3"));


        ArrayAdapter<Name> adapter = new ArrayAdapter<Name>(this,
                android.R.layout.simple_list_item_1, list );

        listView1.setAdapter(adapter);
    }
类文件:
公共类名{
公共整数id;
公共字符串文本;
公共名称(){
}
公共名称(整数id,字符串文本){
this.id=id;
this.text=文本;
}
公共字符串toString()
{
返回此.text;
}
}
活动文件:
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView1=(ListView)findViewById(R.id.listView1);
editsearch=(SearchView)findviewbyd(R.id.search1);
editsearch.setOnQueryTextListener(这个);
列表=新列表();
增加(新名称(1,“a1”);
增加(新名称(2,“a2”);
增加(新名称(3,“a3”);
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,list);
listView1.setAdapter(适配器);
}

我认为,您需要为此安装适配器。它可以是BaseAdapter或ArrayAdapter之类的任何东西。这是一个很好的例子。非常感谢。重写toString()对我来说非常有效。但是如果你想从列表的每个项目中获取BrowserClass.id,这个例子是一个好方法。但是我不明白为什么它会起作用。我用过ArrayAdapter。如果我在ArrayAdapter中使用BrowserClass对象,那么这里对toString()的重写是如何工作的。将每个对象强制转换为string会调用方法toString。它工作得很好。但我不知道为什么它会起作用。我用过ArrayAdapter。如果我在ArrayAdapter中使用BrowserClass对象,那么toString()的重写在这里是如何工作的。我明白了。谢谢你的信息。
Class File:

    public class Name{
        public Integer id;
        public String text;

        public Name() {
        }

        public Name(int id, String text) {
            this.id = id;
            this.text = text;
        }

        public String toString() 
        {
            return this.text;
        }
    }


Activity File:


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView1 = (ListView)findViewById(R.id.listview1);
        editsearch = (SearchView) findViewById(R.id.search1);

        editsearch.setOnQueryTextListener(this);

        List<Name> list = new List<Name>();
        list.add(new Name(1, "a1"));
        list.add(new Name(2, "a2"));
        list.add(new Name(3, "a3"));


        ArrayAdapter<Name> adapter = new ArrayAdapter<Name>(this,
                android.R.layout.simple_list_item_1, list );

        listView1.setAdapter(adapter);
    }