2

关于如何创建自定义行并将其添加到 ListView 有很多帖子和无数问题。但是,我找到的所有帖子都使用 Java 代码将自定义行布局文件设置为列表。大多数样本都是这样的:

ArrayAdapter<String> adapter = new ArrayAdapter<String>
    (this,R.layout.row_layout,R.id.text1,colors);

我想知道是否没有办法直接在 XML 文件中执行此操作?ListView 上没有可以为行设置自定义布局文件的属性吗?

我问的原因是因为我试图在 Eclipse 的图形布局工具中完成所有(大部分)布局工作,我希望能够在不启动应用程序的情况下预览我的布局。

当然,这应该以一种或另一种方式实现吗?如果我可以在 XML 中使用它,我会非常高兴,但如果我必须编写一个自定义类,该类将显示在图形布局编辑器的“自定义”部分中,也可以。

非常感谢您的时间。

4

2 回答 2

12

可以在图形编辑器中预览 ListView。只需右键单击 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。

于 2012-06-26T10:17:10.343 回答
1

当然可以,但是您首先需要创建一个扩展 ArrayAdapter<> 的类

这个类可能是这样的:

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);
于 2012-06-26T09:24:30.817 回答