ArrayAdapter不会使用动态数据进行更新

时间:2012-11-20 23:32:54

标签: java android

我是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

1 个答案:

答案 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并覆盖最后几个方法。