2011-11-01 69 views
0

问题,我发现这里:Android的,我使用的是自定义列表视图的自定义列表视图

http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_9.html

似乎是有效的在Eclipse中,并期待在预览选项卡好。这只是一个在底部有一个按钮的列表视图。所以我增加一条,作为R.layout.buttonlist

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

不幸的是,当我运行它,我得到一个弹出窗口,上面写着Android已经unexpecitdly关闭:

setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data)); 

当我尝试使用内置列表视图:

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

一切工作正常。我没有看到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)); 
    } 
} 

回答

1

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

这行代码告诉listview消耗'android.R.layout.simple_list_item_1'作为其布局的内容。此布局在Android SDK中预先定义。它只包含listview中每个项目的文本。第三个属性'数据'指示每个列表视图项目的内容。

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

所以,麦克L.曾建议,如果你的目的是要与纯文本(具有默认格式)列表视图,然后线之上会达到目的很好。您可以使用

setContentView(R.layout.buttonlist); 

设置“R.layout.buttonlist”作为活动的布局然而,如果你计划包括在ListView附加内容(读取图像),或者想改变造型该文本,你将不得不为listview定义一个自定义布局。如果您想知道如何完成这项工作,我们可以将您引导至适当的来源。

EDIT加载数据的一种可能的方式为正常的ListView

测试活动。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)); 

    } 
} 

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

+0

谢谢对于答复,不幸的是,当我尝试setContentView(R.layout.buttonlist);正如你所建议的,我仍然会得到同样的错误。我编辑了我的原始帖子,以包含有用的活动。即使您提出的方法有效,我仍然想知道如何将数据添加到此? – Hoofamon

+2

请看编辑!如果没有具体的理由你为什么要扩展ListActivity,那么我建议扩展一个活动,因为两者之间的差异不显着 – Abhijit

+0

非常感谢Abhijit,这个作品奇妙! – Hoofamon

1

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

1

如果你想用你的R.layout.buttonlist填写你可以这样做(你的TestActivity应该扩展Activity而不是ListActivity):

public void onCreate(Bundle savedInstanceState){ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.buttonlist); 

    String data[]=new String[]{"Item_1","Item_2","Item_3"} 
    Button b=(Button)findViewById(R.id.testbutton); 
    ListView lv=(ListView)findViewById(R.id.list); 

    ArrayAdapter aa=new ArrayAdapter(context,android.R.layout.simple_list_item_1, data); 
    lv.setAdapter(aa); 

    //Your code... 
} 

现在如果你想创建自定义列表项显示在列表视图,那么你需要做的是这样的:

  1. 创建自定义列表项的XML文件。

    例:custom_listitem.xml

    <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" 
        /> 
    

  2. 创建自定义ArrayAdapter:

    例。 CustomArrayAdapter.class

    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; 
    } 
    } 
    
  3. 使用在主活动这个自定义适配器类,以填补列表视图:

    可以肯定,这主要活动延伸活动,而不是ListActivity

    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 
          . 
          . 
          .