我正在尝试在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的默认期望值?
答案 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来熟悉自己的列表视图,这是一个非常好的主意。