我试图创建一个自定义列表视图,但它不能显示我真的是一个新手,需要帮助....这是代码
public class Main_Activity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
setListAdapter((ListAdapter) new MyAdapter(this,
android.R.layout.simple_list_item_1,R.id.textView1,
getResources().getStringArray(R.array.categories)));
}
private class MyAdapter extends ArrayAdapter<String>{
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] strings) {
super(context, resource, textViewResourceId, strings);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.list_item, parent, false);
String[] items = getResources().getStringArray(R.array.categories);
ImageView image = (ImageView)row.findViewById(R.id.textView1);
TextView text =(TextView)row.findViewById(R.id.textView1);
text.setText(items[position]);
if(items[position].equals("Life")){
image.setImageResource(R.drawable.lifeico);
}
else if(items[position].equals("Corporate")){
image.setImageResource(R.drawable.corpico);
}
else if(items[position].equals("umash")){
image.setImageResource(R.drawable.umashico);
}
return row;
}
}
//然后是listview布局xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
//使用复合可绘制布局
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/lifeico"
android:drawablePadding="5dp"
android:text="@string/textview"
android:textSize="25sp" >
</TextView>
//和项目的资源列表
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="categories">
<item name="Life">Individual Life</item>
<item name="Corporate">Corporate Insurance</item>
<item name="Umash">Umash Funeral Services</item>
</string-array>
</resources>
答案 0 :(得分:1)
尝试使用BaseAdapter而不是ArrayAdapter。从BaseAdapter继承适配器 两个重点:
首先:数组适配器通过它的构造函数获取数组中的数据。所以它不需要再次在getView()中调用getStringArray。您可以使用ArrayAdapter.getItem(index)来获取某个位置的指定对象。
第二:ConvertView(getView方法中的第二个参数)是一个scaped视图,如果它不为null,您可以使用它来设置数据。通过这种方式,您不需要创建或膨胀新视图,您可以使用之前由ListView发布的某些视图。
答案 1 :(得分:0)
你真的没有给我们足够的信息(如果有错误的logcat或者没有达到日志声明),它可能是任何数量的东西。
我要说的是,View row
xml一定存在问题View row = inflater.inflate(R.layout.list_item,
。这可能是错误的名称,但是整个布局,只是TextView
?如果是这样,您应该(添加imageView&amp;)将其放在ViewGroup
中,例如RelativeLayout
,LinearLayout
等,就像您的主要布局一样。但最令人担忧的可能是:
ImageView image = (ImageView)row.findViewById(R.id.textView1); <-
TextView text =(TextView)row.findViewById(R.id.textView1); <-
你能看到你用相同的id引用了两个不同的视图吗?最新的图像命令可能会搞砸了。
此外,最好不要在getView
中执行不必要的操作,因为ListView
的每一行都会调用它。这就是通过构造函数传递的东西(你似乎忽略的项目),所以它们只做了一次。试试这样:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
setListAdapter((ListAdapter) new MyAdapter(
this,
R.layout.list_item, <--
R.id.textView1, <------
R.id.imageView1, <------ make sure these are all correct
getResources().getStringArray(R.array.categories)));
}
private class MyAdapter extends ArrayAdapter<String>{
private int resource;
private int textViewResourceId;
private int imageViewResourceId;
private String[] strings;
private LayoutInflater inflater;
public MyAdapter(Context context, int resource, int textViewResourceId,
int imageViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
this.resource = resource;
this.textViewResourceId = textViewResourceId;
this.imageViewResourceId = imageViewResourceId;
this.strings = strings;
inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
View row = inflater.inflate(resource, parent, false);
ImageView image = (ImageView)row.findViewById(imageViewResourceId);
TextView text =(TextView)row.findViewById(textViewResourceId);
text.setText(strings[position]);
if(strings[position].equals("Life")){
image.setImageResource(R.drawable.lifeico);
}
else if(strings[position].equals("Corporate")){
image.setImageResource(R.drawable.corpico);
}
else if(strings[position].equals("umash")){
image.setImageResource(R.drawable.umashico);
}
return row;
}
如果它们都在同一个主类中,你甚至可以直接传递所有构造函数参数。
答案 2 :(得分:0)
你无处不在制作ImageView。
您应该在logcat中获得ClassCastException。添加一个真正的ImageView(而不是TextView)到你的布局,使用LinearLayout同时拥有TextView和ImageView。
您还应该回收视图以提高性能:
@Override
public View getView(int position, View convertView, ViewGroup parent){
View row = convertView;
if(row == null){
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.list_item, parent, false);
}
....
}