我是Android新手,我无法找到有效的答案。
我有以下适配器:
public class DailyDataAdapter extends ArrayAdapter<DailyData> {
private LayoutInflater layoutInflater;
private ArrayList<DailyData> dailyDatas;
private boolean isUserSavedSectionDefined = false;
private boolean isAutoSavedSectionDefined = false;
private int resourceId;
public DailyDataAdapter(Context context, int textViewResourceId,
ArrayList<DailyData> dailyDatas) {
super(context, textViewResourceId, dailyDatas);
this.layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.dailyDatas = dailyDatas;
this.resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View dailyDataRow = convertView;
DailyData dailyData = dailyDatas.get(position);
if (dailyDataRow == null) {
dailyDataRow = layoutInflater.inflate(resourceId, null);
if (!isUserSavedSectionDefined && dailyData.isUserSaved()) {
TextView section = (TextView) dailyDataRow
.findViewById(R.id.section);
section.setText(R.string.user_saved_path);
section.setVisibility(View.VISIBLE);
isUserSavedSectionDefined = true;
} else if (!isAutoSavedSectionDefined && !dailyData.isUserSaved()) {
TextView section = (TextView) dailyDataRow
.findViewById(R.id.section);
section.setText(R.string.auto_saved_path);
section.setVisibility(View.VISIBLE);
isAutoSavedSectionDefined = true;
}
TextView description = (TextView) dailyDataRow
.findViewById(R.id.description);
description.setText(dailyData.getDate());
}
return dailyDataRow;
}
@Override
public void add(DailyData newDailyData) {
dailyDatas.add(newDailyData);
}
@Override
public void addAll(Collection<? extends DailyData> newDailyDatas) {
dailyDatas.addAll(newDailyDatas);
}
@Override
public void insert(DailyData newDailyData, int index) {
dailyDatas.add(index, newDailyData);
}
@Override
public void remove(DailyData newDailyData) {
dailyDatas.remove(newDailyData);
}
@Override
public void clear() {
dailyDatas.clear();
}
}
其中包含以下布局:
<?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" >
<TextView
android:id="@+id/section"
android:layout_width="fill_parent"
android:layout_height="20dp"
android:layout_marginLeft="50dp"
android:background="@drawable/listitem_section"
android:gravity="center"
android:textColor="@color/white"
android:visibility="gone"
android:textStyle="bold" />
<TextView
android:id="@+id/description"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:layout_marginLeft="50dp"
android:background="@drawable/listitem_selector"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="@dimen/normal_text" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_marginLeft="50dp"
android:layout_height="1dp"
android:background="@color/orange" >
</LinearLayout>
现在,问题在于,如果我将与适配器关联的列表的内容设置为与我假装显示信息的listView相关联之前,它就可以正常工作,如下所示:
//Step #1
ArrayList<Data> ald = new ArrayList<Data>();
Location l = new Location("test");
Data d = new Data(l);
ald.add(d);
DailyData dd = new DailyData(false);
DailyData dd2 = new DailyData(false);
dd.setDataList(ald);
dd2.setDataList(ald);
dailyDataList.add(dd);
dailyDataList.add(dd2);
//Step #2
arrayAdapter = new DailyDataAdapter(this, R.layout.dailydata_item, dailyDataList);
但是,如果我在设置列表内容之前将适配器关联到listView(这是我正在开发的应用程序的假装行为),则不会显示任何内容。 (切换步骤1和2)。 我添加的所有数据都是在之后调用方法 notifyDataSetChanged 。
答案 0 :(得分:2)
但是,如果我在设置列表内容之前将适配器关联到listView(这是我正在开发的应用程序的假装行为),则不会显示任何内容。 (切换步骤1和2)。我添加的所有数据都是在之后调用方法notifyDataSetChanged。
您的自定义ArrayAdapter不会自动知道数据已添加到dailyDataList
。您需要通知它列表已更改。您也应该在自定义适配器中执行此操作,这是ArrayAdapter
所做的:
@Override
public void add(DailyData newDailyData) {
dailyDatas.add(newDailyData);
notifyDataSetChanged();
}
@Override
public void addAll(Collection<? extends DailyData> newDailyDatas) {
dailyDatas.addAll(newDailyDatas);
notifyDataSetChanged();
}
@Override
public void insert(DailyData newDailyData, int index) {
dailyDatas.add(index, newDailyData);
notifyDataSetChanged();
}
@Override
public void remove(DailyData newDailyData) {
dailyDatas.remove(newDailyData);
notifyDataSetChanged();
}
@Override
public void clear() {
dailyDatas.clear();
notifyDataSetChanged();
}
现在您可以致电arrayAdapter.add(dd);
,将自动为您更新ListView。
最后,由于你已经覆盖了大部分的ArrayAdapter并且没有调用super方法,所以你应该简单地扩展BaseAdapter并覆盖最后几个方法。