問題タブ [android-cursoradapter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - エラー: CursorAdapter を使用してリストの onItemClick からアクティビティを開始しています
連絡先アプリケーションを構築しようとしています
メイン アクティビティで、すべての連絡先のリストを表示します。
ただし、リストのアイテムがクリックされた後にアクティビティを起動しようとすると、次のエラーが発生します。
FATAL EXCEPTION: main 01-20 09:54:48.407: E/AndroidRuntime(8459): java.lang.IllegalStateException: これは、カーソルが有効な場合にのみ呼び出す必要があります
どういうわけかアダプターメソッド(getView、getCount)が呼び出し続けているようです
私のコードは次のとおりです。
ログは次のとおりです。
01-20 09:54:48.407: E/AndroidRuntime(8459): FATAL EXCEPTION: main 01-20 09:54:48.407: E/AndroidRuntime(8459): java.lang.IllegalStateException: これは、カーソルが有効です 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.CursorAdapter.getView(CursorAdapter.java:175) でandroid.widget.AbsListView.obtainView(AbsListView.java:1409) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.ListView.measureHeightOfChildren(ListView.java:1307) 01-20 09: 54:48.407: E/AndroidRuntime(8459): android.widget.ListView.onMeasure(ListView.java:1127) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.View.measure (View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.RelativeLayout.measureChild(RelativeLayout.java:566) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381) 01-20 09:54:48.407: E/AndroidRuntime(8459) : android.view.View.measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.View で.measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202) 01-20 09:54:48.407: E /AndroidRuntime(8459): android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 01-20 09:54:48.407: E/AndroidRuntime(8459):android.view.View.measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202) 01-20 09 :54:48.407: E/AndroidRuntime(8459): android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.View.測定 (View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.view.ViewRoot.performTraversals(ViewRoot.java:871) 01-20 09:54:48.407: E/ AndroidRuntime(8459): android.view.ViewRoot.handleMessage(ViewRoot.java:1921) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.os.Handler.dispatchMessage(Handler.java:99) ) 01-20 09:54:48.407: E/AndroidRuntime(8459): android.os.Looper.loop(Looper.java:143) 01-20 09:54:48.407: E/AndroidRuntime(8459): android .app.ActivityThread.main(ActivityThread.java:4196) 01-20 09:54:48.407: E/AndroidRuntime(8459): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 01-20 09:54:48.407 で: E/AndroidRuntime(8459): java.lang.reflect.Method.invoke(Method.java:507) 01-20 09:54:48.407: E/AndroidRuntime(8459): com.android.internal.os. ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/AndroidRuntime(8459): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime(8459): dalvik.system.NativeStart.main(ネイティブ メソッド) で507) 01-20 09:54:48.407: E/AndroidRuntime(8459): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/ AndroidRuntime (8459): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime (8459): dalvik.system.NativeStart.main (ネイティブ)方法)507) 01-20 09:54:48.407: E/AndroidRuntime(8459): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/ AndroidRuntime (8459): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime (8459): dalvik.system.NativeStart.main (ネイティブ)方法)
これに関して私を助けてください。
android - リストビュー(CursorAdapterを使用)での連絡先写真の読み込みが非常に遅い
連絡先アプリケーションを作成しています。メインアクティビティには、連絡先を表示するリストビューがあります。
CursorAdapterを使用して、リストでカーソルを処理しています
それはすべて写真なしでうまく機能します。
ただし、写真を使おうとするとスクロールが遅くなります。
inputStreamがnullで、ロードする画像がない場合でも、入力ストリームを開くための呼び出しは非常に遅くなります。
私はそれについて何ができますか?
android - リストビューでウィジェットをクリックしたときに、ResourceCursorAdapter を使用してビュー アイテムを取得するにはどうすればよいですか
数日以来、私に続くこの特定の問題があります。検索を使用しましたが、私の問題に役立つ記事の魔女はまだ見つかりませんでした. 私の検索の問題でもあると思います。しかし、私の質問に戻ります。
ResourceCursorAdapter を使用して ListView を埋めます。
私のListViewアイテムは次のようになります..
私のアダプター:
私の質問は.. ListView のボタンまたはチェックボックスをクリックすると、プログレスバーを表示したり消したりするなど、特定のビューホルダーにいくつかの変更を加えたいです。アダプター内のビューホルダーを取得して変更を加える方法をまだ理解できませんでした。
問題の要点を理解するのに十分なほど十分に説明したことを願っています。
android - Androidカーソルアダプタのカーソル位置を変更して、行を増減させます
CursorAdapter
一度に特定の行を除外する必要がある を実装する必要があります。
例: 最初に 1-5 を表示し、次に 5-10 を表示します。
私はgetCount()
それに従って管理しましたが、カーソルの位置を変更するだけでは機能しません。
これらの行がどのように位置を取得するか、または と でパラメーターとして提供されるカーソルを進める方法を知る必要がありnewView()
ますbindView()
。
limit
PS:とpaging
とについては知ってoffset
いますが、毎回クエリを取得したくありません
android - アダプターでchangeCursor()を使用した後、ListViewが更新されない
私はデータベースを使用していますが、ローダーでデータベースにクエリを実行して取得するカーソルアダプターを使用するリストフラグメントがあります。ユーザーがリストビューアイテムを長押しすると、コンテキストメニューとこのエントリを削除するオプションが表示されます。彼が削除を押すと、このエントリを削除するスレッドを開始し、ローダーを再度開始して新しいカーソルを取得します(「requery()」は非推奨であるため)。ローダーが新しいカーソルのロードを終了したときにchangeCursor
、リストビューを更新することを想定したメソッドを使用しようとしていますが、それが実行されないため、使用してみnotifyDataSetChanged
ましたが、機能しません。チェックしたところ、カーソルがローダーから戻ってきました。カーソルは変更されますが、リストビューが更新されません。
私は何をすべきか?フラグメントを再起動しますか?
ここにいくつかのコードがあります:
ロードが終了したら:
ありがとう!
android - カスタム CursorAdapter を使用した ListView がうまく機能しない
私のAndroidアプリケーションの一部にはListView
、テーブルにエントリのリストを表示するがあります。ユーザーがアイテムをタップすると、このアイテムListView
の新しいIntent
アイテムが表示されます。
新しいインテントでは、ユーザーはこのエントリに対して、読み取り、編集、お気に入り(および項目が既にお気に入りに登録されている場合はお気に入りの削除) などの操作を実行できます。詳細インテントでは、テーブル内のエントリの「マーク」列を、お気に入りの場合は1に、お気に入りでない場合は0に変更します。
それは正常に動作します。しかし、問題は私のマスターにありListView
ます。にカスタムを設定しCursorAdapter
ましたListView
。ImageView
エントリがお気に入りかどうかを示す天気を追加したかったのです。ListView
私のアイテムのレイアウトファイルで、ImageView
これに を追加し、 に設定しましvisibility
たGONE
。
お気に入りのアイテムを検出し、その星ImageView
visibility
を に設定したいVISIBLE
。次に、デバイスでアプリケーションを実行しました。いつものように、どのエントリもお気に入りに登録されていません。ListView
次に、開いたこのアイテムの詳細ページの最初のアイテムをタップします。私はそれをお気に入りにして、リストに戻りました。
さて、こぶしのアイテムに星のアイコンがありますが、これだけでなく他のアイテムにもあります。これらの間違ったスター付きアイテムの詳細ページには、お気に入りに追加されていないと表示されます。したがって、問題はデータベース操作にはありません。また、マークされたアイテムを表示するカーソルを確認しましたが、お気に入りのアイテムは1つ.getCount()
だけであるとも言われました。どこに問題があるのか わかりません。カスタムベローズの簡略化されたソースコードを作成しました。CursorAdapter
android - 互換パッケージなしのカスタム CursorAdapter
カスタム CursorAdapter を適切に動作させようとしています。私のコードは現在うまく機能しているようです。しかし、Androidのドキュメントに基づいて、微妙な方法で間違っている可能性があると思います.
そのコンストラクターのコメントは次のとおりです。
「自動再クエリを制御できるコンストラクター。これを使用しないで、代わりに CursorAdapter(Context, Cursor, int) を使用することをお勧めします。このコンストラクターを使用すると、FLAG_REGISTER_CONTENT_OBSERVER が常に設定されます。」
FLAG_REGISTER_CONTENT_OBSERVER ドキュメントには次のように書かれています。
「このフラグを使用するときは注意してください。登録されたオブザーバーによるリークを避けるために、アダプターから現在のカーソルを設定解除する必要があります。」
これはよく知られた問題であることが判明しましたが、私が見たすべての提案された代替案は、互換性パッケージまたは API11 を指しています。v2.1 用にコーディングする必要があり、このプロジェクトでは互換パッケージの使用を避けたいと考えています。
上記のコンストラクターを使用した場合の影響と、その影響を適切に処理する方法の説明、または代替の実装のいずれかを探しています。「現在のカーソルをアダプタから設定解除」するにはどうすればよいですか?
互換性パックを指す関連する質問:
android - カスタムCursorAdapterによって管理されているListViewが新しいデータで自動的に更新されるのはなぜですか?
私は自分のアプリでこの「問題」をしばらく抱えていましたが、その動作が理解できなかったのでいつも気になりましたが、今まで理由を尋ねることはありませんでした。
リストアイテムごとにカスタムレイアウトのListView
(を介して実装)があります。これで、すべてのリストアイテム要素を適切に入力ListActivity
する習慣があります(オーバーライドして、このように行うと、ViewHolderパターンがすでに保証されています。必要に応じてhttps://codereview.stackexchange.com/q/1057を参照してください)。CursorAdapter
newView
bindView
これはメインのアクティビティであり、のコンテンツを更新しListView
たり、新しいアイテムを作成したり、現在のアイテムを編集したりできる2つのアクションがあります。どちらの場合も、同じアクティビティが使用されます(アクションのタイプに適応します)。次のようになります。
アクションタイプを実際に区別するのはインテントの内容でありrequestCode
、サブアクティビティでは無視されます。
さて、ドキュメントには上記の方法について次のように書かれています:
このアクティビティが終了すると、onActivityResult()メソッドが指定されたrequestCodeで呼び出されます。
しかし、私は使用していませんonActivityResult
。実際、サブアクティビティが存在する場合(作成モードまたは編集モードのいずれか)は何もしていません。そして、私がこれまでに気づいた振る舞いはこれです:
- 作成:メインアクティビティに戻るたびに、
ListView
は新しいアイテムで自動的に更新されます。ただし、まれに、ListView
に新しいアイテムが入力されない場合があります。メインアクティビティ(たとえば、アプリを終了する)を破棄して再作成する必要があります。そうすると、新しいアイテムがそこに表示されます。 - 編集:作成アクションについて説明したのと同様の動作に気づいたことはありません。これまでのところ、
ListView
は常に新しいコンテンツの変更で自動的に更新されていました。
私の質問は、コンテンツへの変更を電話したり手動で通知したりしないListView
ときに、コンテンツを自動的に更新するようにする舞台裏で何が起こっているのかということです。cursor.requery()
そして、なぜそれはいつもうまくいかないのですか?
多分私はcursor.requery()
自分自身を強制する必要がありonActivityResult
ますか?
PS:CursorLoaderについては知っていて、ロードマップにあるものですが、当面はそのようなコードの書き直しに対処する時間がありません。私があなたに知らせたいと思っただけです。今のところ、現在のコードで何が起こっているのかを知る必要があります。
android - Android用に適切にコーディングされたListView用のこのカスタムCursorAdapterですか?
カスタム CursorAdapter のコードに満足したことはありませんでしたが、今日それを見直して、長い間私を悩ませていた小さな問題を修正することにしました (興味深いことに、私のアプリのユーザーは誰もそのような問題を報告していません)。
ここに私の質問の簡単な説明があります:
私のカスタム CursorAdapterは、私が目にするほとんどの例の代わりにオーバーライドnewView()
します。これら 2 つのメソッドの間で ViewHolder パターンを使用します。しかし、私の主な問題は、各リスト項目に使用しているカスタム レイアウトにありました。bindView()
getView()
ToggleButton
問題は、リスト アイテム ビューがビューの外にスクロールされ、その後スクロールしてビューに戻ると、ボタンの状態が保持されないことでした。この問題cursor
は、 が押されたときにデータベース データが変更されたことを認識せず、ToggleButton
常に同じデータを取得していたため発生していました。をクリックしたときにカーソルを再クエリしようとしましたToggleButton
が、問題は解決しましたが、非常に遅かったです。
私はこの問題を解決し、レビューのためにクラス全体をここに投稿しています。コーディングの決定をよりよく説明するために、この特定の質問についてコードに徹底的にコメントしました。
このコードはあなたに似合いますか?何らかの方法で改善/最適化または変更しますか?
PS: CursorLoader が明らかに改善されていることは知っていますが、当分の間、そのような大規模なコードの書き直しに対処する時間がありません。それは私がロードマップに持っているものです。
コードは次のとおりです。
android - Android CursorAdapter.changeCursor により、ListView のスクロールが異常な動作をする
私が達成しようとしていること
ListView に SQLite データベースのコンテンツを表示する CursorAdapter の実装があります。リスト ビューのコントロールを使用すると、ユーザーはデータベース内の値を切り替えることができます。
問題
データベース内のレコードが更新された後、CursorAdapter 実装で使用される Cursor を新しい値で更新する必要があります。Android のドキュメントによると、これを行う最善の方法は、新しいカーソルをロードし、CursorAdapter で changeCursor を呼び出すことですhttp://developer.android.com/reference/android/support/v4/widget/CursorAdapter.html#changeCursor%28android .database.Cursor%29 .
この changeCursor 呼び出しの後、厄介な副作用により、ListView のスクロールが奇妙に動作します。「フリング」によりリストがスクロールし、スクロールが停止するまでスクロールは停止しません。通常の動作では、ユーザーはスクロール リストにタッチしてリストのスクロールを停止するか、別のフリングを実行してこのリストをさらにスクロールすることができます。changeCursor 呼び出しが実行される前は、ListView は正常に動作します。
どうすればこの厄介な副作用を止めることができますか?!
編集:私は android.widget.CursorAdapter を使用し、API レベル 7 (Eclair) をターゲットにしていることに言及する必要がありました。