1

私は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を呼び出して作成されます。

4

1 に答える 1

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 の大部分をオーバーライドし、スーパー メソッドを呼び出さないため、単純に BaseAdapter を拡張し、最後のいくつかのメソッドもオーバーライドする必要があります。

于 2012-11-21T00:05:40.243 に答える