web-dev-qa-db-ja.com

Androidでアダプタ/リストビューを更新する最良の方法

私の本「Hello Android」は、カスタムdbヘルパーを使用し、カーソルをセットアップし、次にアダプターをセットアップする方法としてこれを提供します。

Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
        cursor = getData();
        showData(cursor);
} finally {
        test.close();
}

ただし、これを使用すると、データセットを更新するたびに、このコードブロックを実行し続ける必要があります(「this」が使用できないため、ボタンのonClick()内で少し難しくなります)。

これはデータセットを更新する最良の方法ですか、または.closeを削除してadapter.notifyDataSetChanged()を発行する必要がありますか?これを行うと、時々強制的に近くなりますが(現時点では思い出せません)、時には正しく削除できないことがあります-これは、データベースが現在開いており、再び開こうとするためだと思います。

クラスのカーソル、データベースヘルパー、およびアダプタ(OnCreateの外部)の変数も宣言して、すべての関数にアクセスできるようにする必要がありますか?

私はこれがこの段階では不十分なプログラミングに過ぎないことを認識していますが、私は物事の最善の方法についてのポインタを取得しようとしています。

70
Simon

adapter.notifyDataSetChanged() を使用する必要があります。それを使用すると、ログには何が書かれていますか?

95
Macarse

Adapterを設定する前にこれらのコードを追加するだけでうまくいきます:

    listView.destroyDrawingCache();
    listView.setVisibility(ListView.INVISIBLE);
    listView.setVisibility(ListView.VISIBLE);

または、データリソースを変更した後、以下の方法を直接使用できます。

   adapter.notifyDataSetChanged()
16
sravan

Androidでアダプター/リストビューを更新する最良の方法

notifyDataSetChanged() を呼び出すだけでなく、ListViewデータを更新します。情報を正しくロードするには、setAdapter()を呼び出す必要があります。

  listView.setAdapter(adapter);
  adapter.notifyDataSetChanged();
13
Jorgesys

次のコードは私に最適です

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
11
Hims

何も機能しない場合は、新しい結果セットまたは更新された結果セットを使用してアダプターインスタンスを再度作成します。その後、新しいビューを見ることができます。

XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);

adbXzy.notifyDataSetChanged();
2
adapter.notifyDataSetChanged();
1
Dinesh Saini

LoaderManagerを使用している場合は、次のステートメントを試してください。

getLoaderManager().restartLoader(0, null, this);
0
adev

カスタムArrayAdaperこのコードを書くだけです:

private List<Cart_items> customListviewList ;

refreshEvents(carts);

public void refreshEvents(List<Cart_items> events)
{
    this.customListviewList.clear();
    this.customListviewList.addAll(events);
    notifyDataSetChanged();
}
0
SAHOOD SSA

おそらく彼らの問題は、データベース内で検索が行われる瞬間です。彼のFragment.JavaのFragment Overrideサイクルで、次のことがわかります:メソッドでテストしてみてください:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here
    Log.i("FragmentX", "Step OnCreateView");// Try with it
    return rootView; 
}

同様に、Log.i ... "onStart"と "onResume"を入れて試してください。

最後に、コードを「onCreate」で切り、「onStart」に配置します。次に例を示します。

@Override
public void onStart(){
    super.onStart();
    Log.i("FragmentX","Step OnStart");
    dbManager = new DBManager(getContext());
    Cursor cursor = dbManager.getAllNames();
    listView = (ListView)getView().findViewById(R.id.lvNames);
    adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter
    adapter.notifyDataSetChanged();
    listView.setAdapter(adapter);
}
0
André da Silva