【问题标题】:Styling string in ListView, Android DevListView中的样式字符串,Android Dev
【发布时间】:2013-12-11 03:13:11
【问题描述】:

我正在尝试在 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 的默认期望?

【问题讨论】:

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


    【解决方案1】:

    @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 字段中设置的内容。

    例如

    <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 的 textview。

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

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

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

    编辑:阅读this 以使自己更加熟悉列表视图是一个非常好的主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2014-05-02
      相关资源
      最近更新 更多