2019年9月30日
キーワード:ListViewコントロールが自動的に選択、リストビューを動的に選択した項目の背景を変更します
ListViewコントロールは、手動でオプションを選択した状態を示すために強調されているオプションを確認してください。しかし、時にはそれがsetSelection(int型の位置)メソッドを持っているものの、私たちは、あなたが特定のオプションを選択したときに自動的にロードされたリストビューで考える傾向にあるが、残念ながらこの方法は、リストビューにロードされていない場合それは動作します。
この方法は、私は気持ちの準備ができてListViewの内部データが非同期であるからといって、一番下に到達するために行っていなかった特定の理由は有効になりません、私たちは、リストビューのデータ項目はまだないが、実際には、ListViewコントロールの後やアダプタを設定するためにそれを初期化しますアウトロード、あなたはそれがオプションを選択するには行かせ、その性質は終わりではありません。
私は実際にこの現象の具体的な理由を探求していないが、まだこの問題を解決するために、「Quxianjiuguo」アプローチの2種類を発見しているが。これによって、貧しい学生を支援するために、それを記録。
両方のアプローチは、手動の方法のリストビューOnItemClickイベントを聴くことにより、データ項目の状態を変更するために、私たちに依存しています。例えば、私はちょうど私がそれらを呼び出すためのコードのこの部分を持って実現します。
@Override 公共 のボイド onItemClick(<?> AdapterView adapterView、ビュービューは、int型 I、長いリットル){ 場合(adapterView.getTag()!= nullの){ のTextView oldTv = (TextViewの)adapterView.getTag(); oldTv.setTextColor(ResourcesManager.getColor(R.color.text_color_black_333))。 oldTv.setBackgroundColor(ResourcesManager.getColor(android.R.color.transparent))。 } のTextView curTv = (のTextView)図です。 curTv.setTextColor(ResourcesManager.getColor(android.R.color.white))。 curTv.setBackgroundColor(ResourcesManager.getColor(R.color.basically_color))。 adapterView.setTag(curTv)。 }
リストビューオプションをクリックすると、最初はadapterViewのgetTagに()からオブジェクトを取り出すことになります。それは、このオブジェクトの内側には何ですか?私は、バックグラウンドのために、設定された表示オプションにありました。この目的は、元を復元するオプションが選択されていないスタイルに選択されているかどうかを判断することです。
そして、現在選択されたスタイル、彼らが必要とするスタイルを設定するには、そのパラメータの図です。adapterView.setTagで完成されたコールを設定することを忘れないでください()そのスタイルの回復操作までこのビューを保存します。
レイアウトスタイルのXMLのXMLによって選択された場合、一部の学生が直接、ショースタイルのリストビューを設定することができ、この方法は、私がいないこの記事の議論の範囲内で、試していません。
1、ソリューション
遅延。
遅延は比較的単純で粗溶液です。その核となるアイデアは、いくつかの時間遅延のListView後に初期化した後、実施を監視するためonItemClickで()メソッドを実行するためのイニシアチブをとるれます。いくつかの単語の男は、直接コードに、言いました:
lv.setAdapter(アダプタ)。 lv.setOnItemClickListener(この); lv.postDelayed(新しいRunnableを(){ @Override 公共 のボイドの実行(){ int型のカウント= lv.getChildCount(); 場合(カウント> 0 ){ ビューV = lv.getChildAt(0 ); onItemClick(LV、V、 0 、0 ); } } }、 2000 )。
ここでアダプタを設定して、リストビューオブジェクトの操作を「選択」を実行するために2000ミリ秒の遅延の後に直接聞くためにオプションをクリックしてください。長時間の遅延のためとして、我々は自分自身を保持しなければなりません。
遅延の終了後、厳しいため、最初のリストビューは、十分なデータ項目をロードしたかを決定しなければならない、リストビューは、のgetChildCount()は、非常に実用的である来ます。
データ項目の十分な数の、我々は引数onItemClick()メソッドとして取り出す必要があるビューの一つは、コードによって設定されたスタイルonItemClick()「自動選択」を実装することで定義することができた場合機能。
図2に示すように、第二の溶液
コールバック。
核となるアイデアは、前のコールバック遅延と一致している、我々は積極的に達成するために)(満たされている条件の場合にonItemClick呼んでいます。しかし、視覚的なラグの感覚を遅らせるためにはるかに正確にコールバック遅延、と比較して、このアプローチが発生する可能性がありますが、また、遅延データ項目の終わりには、我々は、その後、読み込みが完了していない失敗のリスク、届くの目的。コールバックモードにこれら二つの問題は問題ではありません。
非常に多くのと比較して優れたコールバック遅延するので、上記複合体を実装することは当然であるが、それは唯一の多少あります。
まず、コールバックが初期化が完了したときに我々はオプションを必要とし、将来的にデフォルトで選択されたいです。だから、通常、コールバックインタフェースにカスタムアダプタで定義され、そのように、設定されたリスニングモードを提供することができます:
パブリック クラス MyAdapterは拡張 ArrayAdapter <文字列> { プライベート ブール値をisNotified。 プライベートCallbackコールバック。 公共 FunSettingArrayAdapter(コンテキスト・コンテキスト、int型のリソース、文字列[] J、コールバックコールバック){ スーパー(コンテキスト、リソース、J)。 この .callback = コールバック。 } @Override パブリックビューgetViewメソッド(int型位置、表示convertView、のViewGroup親){ ビューV = ... もし(!isNotified &&位置== 0){ isNotified = TRUE。 IF(コールバック= NULL!){ callback.onLoaded(V); } } 戻りV; } {コールバックインターフェース / ** *主にリストビューの自動チェック機能のために使用されます。 * / 無効となりonLoaded(ビュービュー); } }
上記のコードは、拡大部分の赤色のキー部分をマークされています。私はここに要求するデフォルトの項目1を選択することで、そのため、位置は0コールバックがトリガされています。
コールバック遅延実装アプローチと実践非常に同じ:
MyAdapterアダプタ= 新しいMyAdapter(inflater.getContext()、R.layout.layout、 ResourcesManager.getResources()。getStringArrayの(R.array.args)、新しいMyAdapter.Callback(){ @Override 公共 のボイド onLoaded(最終ビュービュー) { lv.postDelayed(新しいRunnableを(){ @Override 公共 ボイドラン(){ onItemClick(LV、ビュー、0、0 ); } }、 200 ); } })。
これは、カスタム・アダプタの前に、注意しなければならない、我々は実際に我々がコールバック通知を受け取る、実際にそれが以前の対応するリストビュービューよりも受信され、リストビューの前にビューに戻るには、コールバックgetViewメソッド()で発生しました。だから我々は、データが、我々はこれまでに完了し必要なリストビューアイテムをロードするのを待つためにわずかな遅延を行い、より良いでしょう。ここでは200ミリ秒は非常に十分なされています。