カスタムBaseAdapterクラスを作成して、ListViewに登録キーを表示しました。リストに別のキーを追加してnotifyDataSetChanged()
を呼び出すと、リストビューは視覚的にうまく更新されます。私のデータ構造は、単にいくつかのStringとintを含む単純な構造のArrayListです。ただし、キーリストをクリアしてnotifyDataSetChanged()
に電話すると、視覚的に何も起こりません。私が閉じると、アプリを開くと、リストは空である必要があります。 notifyDataSetChanged()
に電話する前に、私は今notifyDataSetInvalidated()
と呼んでいます。これにより、キーをクリアするとすぐにビジュアルが正しく更新されますが、そのアダプタを使用して完全に終了していない限り、Googleのdocumentationはその方法の使用を警告します。私はそれらを拭き取った後にさらに多くのキーを登録すると、それでもListViewに表示され、notifyDataSetInvalidated()
が実用的な解決策であるように見えます。 ListViewに同じBaseAdapterとArrayListを使用し続けると、このメソッドに関連する危険がありますか?より良い解決策はありますか?ここに私のカスタムBaseAdapterの実装です:BaseAdapterでアイテムが正しく表示されない
class KeyAdapter extends BaseAdapter implements Database.KeyRegistrationListener {
private ArrayList<Database.KeyDetails> keyInfo;
public KeyAdapter(ArrayList<Database.KeyDetails> keyInfo) {
this.keyInfo = keyInfo;
}
@Override
public int getCount() {
return keyInfo.size();
}
@Override
public Database.KeyDetails getItem(int position) {
return keyInfo.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
TextView userID;
TextView appName;
TextView date;
TextView time;
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.registration_item, parent, false);
userID = (TextView) convertView.findViewById(R.id.user_id);
appName = (TextView) convertView.findViewById(R.id.app_name);
date = (TextView) convertView.findViewById(R.id.date_used);
time = (TextView) convertView.findViewById(R.id.time_used);
convertView.setTag(R.id.user_id, userID);
convertView.setTag(R.id.app_name, appName);
convertView.setTag(R.id.date_used, date);
convertView.setTag(R.id.time_used, time);
} else {
userID = (TextView) convertView.getTag(R.id.user_id);
appName = (TextView) convertView.getTag(R.id.app_name);
date = (TextView) convertView.getTag(R.id.date_used);
time = (TextView) convertView.getTag(R.id.time_used);
}
Database.KeyDetails key = getItem(pos);
userID.setText(key.userID);
appName.setText(key.appName);
date.setText(key.date);
time.setText(key.time);
return convertView;
}
@Override
public void notifyKeysUpdated(Database.KeyDetails newKeyDesc) {
if (newKeyDesc == null) {
keyInfo.clear();
notifyDataSetInvalidated();
notifyDataSetChanged();
} else{
keyInfo.add(newKeyDesc);
notifyDataSetChanged();
}
}
}
私はデータベースにキーを追加するたびにnotifyKeysUpdated()
メソッドはSQLiteのデータベースのための私のラッパークラスによって呼び出されます。私のデータベースオブジェクトがリスナーnull
にフィードしている場合は、データベース内のすべてのキーがクリアされ、ListViewが視覚的に空であることを意味します。
編集:私はnotifyDataSetInvalidated()
を使い始めて以来 、ListViewコントロールは、もはや私は新しいキーを登録する際など、何も表示されません。
私が見た他のすべてのBaseAdapter実装では、カスタムサブクラスはそれ自身のデータ構造を格納しており、私が行ったいくつかのメソッドを実装しました。リストは確実に更新されています。何らかの理由で、リストに追加するとビューのみが更新されますが、アイテムを削除すると更新されません。私は、私のアプリに登録されているキーが最初にSQLiteデータベースに保存されていることを考慮して、代わりにCursorAdapterに変更できると思います。しかし、努力をいただきありがとうございます! –