Android 使用自定义阵列适配器显示数据时出现问题
我正在尝试创建一个基本列表视图应用程序。 我让它与默认的系统阵列适配器配合得很好。然后我尝试修改它,以允许我使用自定义适配器。不幸的是,我遇到了一个问题 当我运行应用程序时,我没有得到运行时错误,而只是得到一个显示列表的黑屏,这使我认为可能它正在显示一个列表,但由于某种原因,适配器找不到数据 无论如何,下面是我的活动列表:Android 使用自定义阵列适配器显示数据时出现问题,android,arrays,listview,adapter,custom-adapter,Android,Arrays,Listview,Adapter,Custom Adapter,我正在尝试创建一个基本列表视图应用程序。 我让它与默认的系统阵列适配器配合得很好。然后我尝试修改它,以允许我使用自定义适配器。不幸的是,我遇到了一个问题 当我运行应用程序时,我没有得到运行时错误,而只是得到一个显示列表的黑屏,这使我认为可能它正在显示一个列表,但由于某种原因,适配器找不到数据 无论如何,下面是我的活动列表: package com.example.waitronproto2; import java.util.ArrayList; import java
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;
导入java.util.ArrayList;
导入java.util.List;
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
公共课开胃菜活动扩展列表活动{
//实例变量
//阵列来容纳菜单开胃菜-将来这将从web服务器中提取
私人开胃菜;
私家菜谱调味品;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//垃圾收集
gc();
setContentView(右布局、开胃菜列表);
填充列表();
//创建带有数据源的自定义数组适配器链接列表,即数组。
开胃菜适配器=新菜单阵列适配器(此为开胃菜);
//将新创建的适配器设置为列表适配器。
这个.setListAdapter(开胃菜适配器);
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
//测试用吐司
Toast.makeText(this.getApplicationContext(),l.getItemAtPosition(position)+“Clicked!”,Toast.LENGTH_LONG.show();
//将单击的项存储在字符串变量中
字符串选择=l.getItemAtPosition(position).toString();
//添加到从一个活动传递到另一个活动的数组中
}
//用菜单项填充列表
私有无效填充列表(){
开胃菜=新ArrayList();
开胃菜。添加(新菜单(“开胃菜1”,“开胃菜”,8.95));
开胃菜。添加(新菜单(“开胃菜2”,“开胃菜”,9.95));
开胃菜。添加(新菜单(“开胃菜3”,“开胃菜”,12.95));
开胃菜。添加(新菜单(“开胃菜4”,“开胃菜”,4.95));
开胃菜。添加(新菜单(“开胃菜5”,“开胃菜”,5.95));
开胃菜。添加(新菜单(“开胃菜6”,“开胃菜”,7.95));
开胃菜。添加(新菜单(“开胃菜7”,“开胃菜”,5.95));
开胃菜。添加(新菜单(“开胃菜8”,“开胃菜”,12.95));
开胃菜。添加(新菜单(“开胃菜9”,“开胃菜”,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;
}
}
package com.example.waitronproto2;
导入java.util.List;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.TextView;
//菜单项的默认数组适配器
公共类MenuItemArrayAdapter扩展ArrayAdapter{
私有列表菜单项;
//建造师
公共MenuItemArrayAdapter(上下文、列表menuItems){
超级(上下文,右布局,菜单项行);
this.menuItems=menuItems;
}
//获取视图
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getContext().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(R.布局.菜单项,空);
}
//为视图指定值
MenuItem item=this.menuItems.get(位置);
TextView name视图=(TextView)v.findViewById(R.id.item_name);
TextView价格视图=(TextView)v.findViewById(R.id.item_价格);
nameView.setText(item.getName());
priceView.setText(String.valueOf(item.getPrice());
返回v;
}
}
你知道我哪里会出错吗
非常感谢 通过扩展ArrayAdapter,但在自定义适配器中使用本地列表,您将事情弄得有点混乱。ArrayAdapter不知道列表中有任何数据,因为它的
getCount()
引用了一个空列表
请改用此超级构造函数:
//Constructor
public MenuItemArrayAdapter(Context context, List<MenuItem> menuItems) {
super(context, R.layout.menuitem_row, menuItems);
// Pass the ArrayAdapter your list ^^^^^^^^^
}
//构造函数
公共MenuItemArrayAdapter(上下文、列表menuItems){
super(上下文,R.layout.menuitem\u行,menuItems);
//通过阵列调整您的列表^^^^^^^^^
}
不要自己保存menuItems
,否则代码会随着时间的推移变得过于复杂。您需要使用当前使用的this.menuItems.get(position)
或者您可以覆盖
getCount()
、getItem()
和getItemId()
以指向您的菜单项列表。但如果您这样做了,您还不如直接扩展BaseAdapter,因为您已经失去了ArrayAdapter的优势