ListView中的样式字符串,Android Dev

时间:2013-12-10 18:03:09

标签: java android listview user-interface android-arrayadapter

我正在尝试在ListView中设置结果字符串的样式。

我有一个ListView布局,以及相应Activity的以下onCreate方法。

private List<Address> addressList;

public class AddressesActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addresses);

    AddressDBHandler datasource = new AddressDBHandler(this);
    datasource.open();

    List<Address> values = datasource.getAllAddresses();
    MyAdapter adapter = new MyAdapter(this, android.R.layout.simple_list_item_1, addressList);
    setListAdapter(adapter);
}

    .
    .
    .

以下是我的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ListView>

<TextView
    android:id="@android:id/empty"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="51dp"
    android:gravity="center"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="@string/no_addresses" />

我被告知要按如下方式制作MyAdapter课程:

public class MyAdapter extends ArrayAdapter<Address> {

Context context; 
int layoutResourceId;    

public MyAdapter(Context context, int layoutResourceId, List<Address> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    StringHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new StringHolder();
        holder.txtTitle = (TextView) row.findViewById(R.id.text1);

        row.setTag(holder);
    }
    else
    {
        holder = (StringHolder)row.getTag();
    }

    Address addressItem = getItem(position);
    Spanned format = Html.fromHtml("<br/><span color='red'>" + addressItem.getAddress() + "</span><br/>" +  addressItem.getName() + "<br/>");

    holder.txtTitle.setText(format);

    return row;
}

static class StringHolder
{
    TextView txtTitle;
}

我的问题在于理解:

holder.txtTitle = (TextView) row.findViewById(R.id.text1), 

我不确定R.id.text1应该是什么。

我还有一个问题:@android:id / empty和@android:id / list被引用在哪里?似乎它们是ArrayAdapter的默认期望值?

1 个答案:

答案 0 :(得分:2)

@android:id / empty和@android:id / list是预定义的id,它们是android平台的一部分。 ListActivities和ListFragments期望布局xml文件中存在这些(或至少存在android:id / list)。这意味着您不必自己从xml绑定这些视图。

holder.txtTitle = (TextView) row.findViewById(R.id.text1)

上面的代码基本上是在xml文件中找到一个视图,并将其绑定到一个变量,以便在你的活动中使用(或者就是你的列表行)。

R.id.text1是布局中视图的ID。这是您在xml视图的android:id字段中设置的内容。

e.g。

<TextView android:id="@+id/mytextview" 
android:layout_width="match_parent" 
android:layout_height="match_parent">

对于上面的代码,您没有自定义行布局,您使用的是布局是android sdk(android.R.layout.simple_list_item_1)的一部分。这个布局有一个id为android.R.id.text1的文本视图。

因此,如果要自定义列表行,请创建自己的布局文件。您可以在布局中放置1个textview或多个视图。 然后,您需要将这些视图添加到 StringHolder 类,并将视图绑定为已经使用holder.txtTitle完成的视图。

更改适配器的实例化以引用自定义布局:

new MyAdapter(this, R.layout.my_awesome_layout, addressList);

编辑:通过阅读this来熟悉自己的列表视图,这是一个非常好的主意。