0

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

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> 

//以及item的资源列表

<?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>
4

3 回答 3

1

尝试使用 BaseAdapter 而不是 ArrayAdapter。从 BaseAdapter 继承您的适配器 两点很重要:

第一:数组适配器通过它的构造函数获取数组中的数据。所以它不需要再次在 getView() 中调用 getStringArray。您可以使用 ArrayAdapter.getItem(index) 在某个位置获取指定对象。

第二:ConvertView(getView 方法中的第二个参数)是一个 scaped 视图,如果它不为 null,您可以使用它来设置数据。通过这种方式,您不需要制作或扩充新视图,您可以使用 ListView 之前发布的某些视图。

于 2012-12-23T13:28:24.710 回答
0

你真的没有给我们足够的继续(如果有错误的 logcat 或未达到日志语句),它可能是任意数量的东西。

我会说View row你正在膨胀的 xml一定有问题View row = inflater.inflate(R.layout.list_item,。这可能是不正确的名称,但整个布局,只是TextView?如果是这样,你应该(添加 imageView &)把它放在一个ViewGroup, likeRelativeLayout等中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;
    }

如果它们都在同一个主类中,您甚至可以直接传递所有构造函数参数。

于 2012-12-23T13:39:14.233 回答
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);
   }
   ....
}
于 2012-12-23T13:40:45.200 回答