Android,自定义listview的问题
我正在使用在此处找到的自定义列表视图: 在Eclipse中似乎有效,在预览选项卡中看起来不错。它只是一个底部有按钮的列表视图。所以我把它添加为R.layout.buttonlistAndroid,自定义listview的问题,android,Android,我正在使用在此处找到的自定义列表视图: 在Eclipse中似乎有效,在预览选项卡中看起来不错。它只是一个底部有按钮的列表视图。所以我把它添加为R.layout.buttonlist 不幸的是,当我运行它时,我会看到一个弹出窗口,上面显示Android已经异常关闭: setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data)); setListAdapter(新的ArrayAdapte
不幸的是,当我运行它时,我会看到一个弹出窗口,上面显示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,则需要执行以下操作:
如果您想使用R.layout.buttonlist填充listview,可以按如下操作(您的TestActivity应该扩展Activity,而不是ListActivity): 现在,如果要创建要在listview中显示的自定义listitem,则需要执行以下操作:
感谢您的回复,不幸的是当我尝试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
.
.
.