Android,自定义listview的问题

Android,自定义listview的问题,android,Android,我正在使用在此处找到的自定义列表视图: 在Eclipse中似乎有效,在预览选项卡中看起来不错。它只是一个底部有按钮的列表视图。所以我把它添加为R.layout.buttonlist 不幸的是,当我运行它时,我会看到一个弹出窗口,上面显示Android已经异常关闭: setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data)); setListAdapter(新的ArrayAdapte

我正在使用在此处找到的自定义列表视图:

在Eclipse中似乎有效,在预览选项卡中看起来不错。它只是一个底部有按钮的列表视图。所以我把它添加为R.layout.buttonlist


不幸的是,当我运行它时,我会看到一个弹出窗口,上面显示Android已经异常关闭:

 setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data));
setListAdapter(新的ArrayAdapter(this,R.layout.buttonlist,data));
当我尝试使用内置列表视图时:

 setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,数据));
一切正常。我在logcat中没有看到任何错误或警告,因此我不确定如何查明问题。有人有什么想法吗?谢谢

编辑:添加活动

public class TestActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        List<String> data = new ArrayList<String>();
       data.add("hello");
       data.add("world");
        setContentView(R.layout.buttonlist);
        //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
    }
}
公共类测试活动扩展了ListActivity{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
列表数据=新的ArrayList();
数据。添加(“你好”);
数据。添加(“世界”);
setContentView(R.layout.buttonlist);
//setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,data));
}
}

我认为在适配器的布局中不能有listview。传入的布局应该只描述listview中的一行。所以buttonlist应该只包含按钮的xml。listview需要位于单独的布局文件中。如果这是一个列表活动,那么您不需要另一个布局文件,只需像现在这样调用setListAdapter。

我认为您不能在适配器的布局中使用listview。传入的布局应该只描述listview中的一行。所以buttonlist应该只包含按钮的xml。listview需要位于单独的布局文件中。如果这是一个列表活动,那么您不需要另一个布局文件,只需像现在这样调用setListAdapter。

Hoofamon,我想在这里纠正您的错误。您创建的不是自定义ListView,而是带有ListView的自定义布局。另外,我相信您还没有完全理解setListAdapter在这里做什么

这一行告诉listview使用“android.R.layout.simple\u list\u item\u 1”作为其布局的内容。此布局在Android SDK中预定义。它只在listview的每个项目中包含文本。第三个属性“data”表示每个listview项的内容

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
但是,如果计划在listview中包含其他内容(读取图像)或要更改文本样式,则必须为listview定义自定义布局。如果您想知道如何做到这一点,我们可以指导您找到合适的来源

编辑:将数据加载到普通ListView的一种可能方式

TestActivity.java

public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.buttonlist);

      List<String> data = new ArrayList<String>();
      data.add("hello");
      data.add("world");


      ListView mListView = (ListView)findViewById(R.id.list);

      mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));

   }
}
公共类测试活动扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.buttonlist);
列表数据=新的ArrayList();
数据。添加(“你好”);
数据。添加(“世界”);
ListView mListView=(ListView)findViewById(R.id.list);
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,数据));
}
}
buttonlist.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

   <Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:id="@+id/testbutton"
    android:text="@string/hello" 
    android:layout_alignParentBottom="true" />

   <ListView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:id="@+id/list"
    android:layout_alignParentTop="true" 
    android:layout_above="@+id/testbutton" />

</RelativeLayout>


在模拟器上应该是这样的:

胡法蒙,我想在这里纠正你。您创建的不是自定义ListView,而是带有ListView的自定义布局。另外,我相信您还没有完全理解setListAdapter在这里做什么

这一行告诉listview使用“android.R.layout.simple\u list\u item\u 1”作为其布局的内容。此布局在Android SDK中预定义。它只在listview的每个项目中包含文本。第三个属性“data”表示每个listview项的内容

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
但是,如果计划在listview中包含其他内容(读取图像)或要更改文本样式,则必须为listview定义自定义布局。如果您想知道如何做到这一点,我们可以指导您找到合适的来源

编辑:将数据加载到普通ListView的一种可能方式

TestActivity.java

public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.buttonlist);

      List<String> data = new ArrayList<String>();
      data.add("hello");
      data.add("world");


      ListView mListView = (ListView)findViewById(R.id.list);

      mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));

   }
}
公共类测试活动扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.buttonlist);
列表数据=新的ArrayList();
数据。添加(“你好”);
数据。添加(“世界”);
ListView mListView=(ListView)findViewById(R.id.list);
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,数据));
}
}
buttonlist.xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

   <Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:id="@+id/testbutton"
    android:text="@string/hello" 
    android:layout_alignParentBottom="true" />

   <ListView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:id="@+id/list"
    android:layout_alignParentTop="true" 
    android:layout_above="@+id/testbutton" />

</RelativeLayout>


这是它在模拟器上的外观:

如果您想使用R.layout.buttonlist填充listview,您可以按如下操作(您的TestActivity应该扩展Activity,而不是ListActivity):

现在,如果要创建要在listview中显示的自定义listitem,则需要执行以下操作:

  • 创建自定义listitem xml文件

    Ex:custom_listitem.xml


  • 如果您想使用R.layout.buttonlist填充listview,可以按如下操作(您的TestActivity应该扩展Activity,而不是ListActivity):

    现在,如果要创建要在listview中显示的自定义listitem,则需要执行以下操作:

  • 创建自定义listitem xml文件

    Ex:custom_listitem.xml


  • 感谢您的回复,不幸的是当我尝试setContentView(R.layout.buttonlist)时;按照你的建议,我还是会得到山姆
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/icon"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:id="@+id/text"
        />
    
    public class CustomArrayAdapter extends ArrayAdapter<String> {
    
    String[] array;
    LayoutInflater mInflater;
    
    public CustomArrayAdapter(Context context, int textViewResourceId,
            String[] objects)
    {
        super(context, textViewResourceId, objects);
        array=objects;
        mInflater = LayoutInflater.from(context);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {       
        final ViewHolder holder;
    
        if(convertView==null)
        {
                 convertView = mInflater.inflate(R.layout.custom_listitem, null);
                 holder = new ViewHolder();
    
                 holder.text=(TextView)convertView.findViewById(R.id.text);
                 holder.img=(ImageView)convertView.findViewById(R.id.icon);
                 convertView.setTag(holder);
        }
        else
                holder=(ViewHolder)convertView.getTag();
    
        holder.text.setText(array[position]);
    
        if(position==0)
            holder.img.setImageResource(R.drawable.img1);
        else if(position==1)
            holder.img.setImageResource(R.drawable.img2);
        else if(position==2)
            holder.img.setImageResource(R.drawable.img3);
    
        return convertView;
    }
    
    static class ViewHolder
    {
        TextView text;
        ImageView img;
    }
    }
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.main);
    context=getApplicationContext();
    lv=(ListView)findViewById(R.id.listview);
    
    CustomArrayAdapter aa=new CustomArrayAdapter(context,R.layout.custom_listitem, new String[]{"item_1","item_2","item_3"});
    
    lv.setAdapter(aa);
    
               // other lines of code
               .
               . 
               .