关于如何创建自定义行并将其添加到ListView,有很多帖子和无数个问题。但是,我发现的所有帖子都使用Java代码将自定义行布局文件设置为列表。大多数样本都是这样的:
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(this,R.layout.row_layout,R.id.text1,colors);
我想知道是否有办法直接在XML文件中执行此操作? ListView上是否有属性可以为行设置自定义布局文件?
我问的原因是因为我试图在Eclipse的Graphical Layout工具中完成所有(大部分)布局工作,我希望能够在不启动应用程序的情况下预览我的布局。
当然这应该是这样或那样的?如果我能够在XML中使用它,我将非常高兴,但如果我必须编写一个自定义类,它将显示在图形布局编辑器的“自定义”部分中,也可以。
非常感谢你的时间。
答案 0 :(得分:12)
可以在图形编辑器中预览ListViews。只需右键单击ListView并选择“预览列表内容”。然后选择“自定义”并选择自定义行布局。
以下是一个例子:
my_custom_list.xml
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false">
<!-- Preview: listitem=@layout/account_list_item -->
</ListView>
my_custom_row.xml
<CheckBox
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="6dip"
/>
<TextView
android:id="@+id/secondLine"
android:layout_width="fill_parent"
android:layout_height="26dip"
android:layout_toRightOf="@id/icon"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:singleLine="true"
android:ellipsize="marquee"
android:text="mail@mail.com" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/icon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_above="@id/secondLine"
android:layout_alignWithParentIfMissing="true"
android:gravity="center_vertical"
android:text="Account name" />
在my_custom_list.xml的图形编辑器中,右键单击列表。从“预览列表内容”中的“自定义”选项中选择my_custom_row。
答案 1 :(得分:1)
是的,当然,但您首先需要创建一个扩展ArrayAdapter&lt;&gt;的类。
这个课可以是这个:
public class Mylistcustom extends ArrayAdapter<String> {
private LayoutInflater mInflater;
private int mViewResourceId;
private String[] your_date;
public Mylistcustom(Context ctx, int viewResourceId, String[] data) {
super(ctx, viewResourceId,data);
this.contexto=ctx;
mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mViewResourceId = viewResourceId;
this.your_data=data;
@Override
public int getCount() {
return your_data.length;
}
@Override
public String getItem(int position) {
return your_data[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
rowView = mInflater.inflate(mViewResourceId, null);// you are inflating your xml layout
text=(textView) rowView.findViewById(R.id.textView);//find a textview in your layout, of course you can add whatever you want such as ImaveView Buttons ....
text.setText(your_data[position]); // and set text from your_data
return rowView;
} }
在列表视图活动中,您只需调用构造函数并传递数据,布局和上下文
Myadapter = new Mylistcustom(context, R.layout.YOUR_XML_LAYOUT,DATA);
// and finally set the adapter to your list
ListView lv = (ListView) findViewById(android.R.id.list);
lv.setAdapter(Myadapter);