Android Custom ListView不显示视图

时间:2012-12-23 12:40:14

标签: android android-layout

我试图创建一个自定义列表视图,但它不能显示我真的是一个新手,需要帮助....这是代码

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>

3 个答案:

答案 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中,例如RelativeLayoutLinearLayout等,就像您的主要布局一样。但最令人担忧的可能是:

    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);
   }
   ....
}