問題: リストビューをクリアして再投入すると、アイテムが以前にチェックされていた場合、同じインデックスのアイテムもチェックされます。アダプタに追加された要素の数が前にチェックされた項目のインデックスである場合、何もチェックされません。Android Checkable ListViewアイテムがチェックされたままになる
convertViewの使用をブロックしようとしましたが、存在しても効果がありません。不思議なことに、私がデバッガを踏んで何が起こっているのかを確認すると、アダプタを再投入するとCheckableLinearLayoutのsetChecked(true)への呼び出しが1回以上発生します。 (私は以下のスタックトレースを含んでいます)。これらの呼び出しのコールスタックを見ると、これらの呼び出しを起源とするコードはありません。それは、ListViewが以前の選択のインデックスを覚えていて、それをそれ自身のものに復元しているかのようです。
私の実装: 私はリストビューをsingleSelectionモードに設定しました。
public class CheckableLinearLayout extends LinearLayout implements Checkable {
private boolean isChecked;
public CheckableLinearLayout(Context context) {
super(context);
}
public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setChecked(boolean isChecked) {
this.isChecked = isChecked;
if(isChecked) {
setBackgroundColor(Color.DKGRAY);
} else {
setBackgroundColor(Color.BLACK);
}
}
@Override
public boolean isChecked() {
return isChecked;
}
@Override
public void toggle() {
setChecked(!isChecked);
}
}
マイArrayAdapterのgetViewメソッドの実装:
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
LayoutInflater inf = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
CheckableLinearLayout row = (CheckableLinearLayout) convertView;
if (row == null) {
row = (CheckableLinearLayout) inf.inflate(R.layout.file_explorer_item, parent, false);
}
// I explicitly set checked to false, in case this was a convertView:
row.setChecked(false);
// population various elements of the view is done here
return row;
}
}
任意のアイデア私は私のCheckableListView実装のインスタンスを返しますgetViewメソッド(...)を持つカスタムArrayAdapterを使うのか?
PS。ここでは謎の一つのスタックトレースがsetChecked(真)の呼び出しです:
<1> [email protected], prio=5, in group 'main', status: 'RUNNING'
at my.package.CheckableLinearLayout.setChecked(CheckableLinearLayout.java:25)
at android.widget.ListView.setupChild(ListView.java:1834)
at android.widget.ListView.makeAndAddView(ListView.java:1765)
at android.widget.ListView.fillSpecific(ListView.java:1318)
at android.widget.ListView.layoutChildren(ListView.java:1636)
at android.widget.AbsListView.onLayout(AbsListView.java:1863)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1617)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1401)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11278)
at android.view.ViewGroup.layout(ViewGroup.java:4224)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1489)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Method.java:-1)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(NativeStart.java:-1)
<10> Binder Thread #[email protected], prio=5, in group 'main', status: 'RUNNING'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<9> Binder Thread #[email protected], prio=5, in group 'main', status: 'RUNNING'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<8> [email protected] daemon, prio=5, in group 'main', status: 'SLEEPING'
at java.lang.VMThread.sleep(VMThread.java:-1)
at java.lang.Thread.sleep(Thread.java:1031)
at java.lang.Thread.sleep(Thread.java:1013)
at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:213)
at java.lang.Thread.run(Thread.java:856)
<7> [email protected] daemon, prio=5, in group 'main', status: 'WAIT'
at java.lang.Object.wait(Object.java:-1)
at java.lang.Object.wait(Object.java:401)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
at java.lang.Thread.run(Thread.java:856)
<6> [email protected] daemon, prio=5, in group 'main', status: 'WAIT'
at java.lang.Object.wait(Object.java:-1)
at java.lang.Object.wait(Object.java:364)
at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:128)
at java.lang.Thread.run(Thread.java:856)
<5> [email protected] daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<3> Signal [email protected] daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<2> [email protected] daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
Afaik setCheckedが呼び出されますgetViewの後にgetCheckedItemPosition(ListView setItemCheckedで設定)からの値を持つListViewの値を取得します。おそらく、内部のコンテナは、アダプタがクリアまたは変更されたときにクリアされません。必要に応じて項目のチェックを外します。 – Deucalion
'ListView'で' setChoiceMode(ListView.CHOICE_MODE_SINGLE); 'を呼びますか? 私の経験では、CHOICE_SINGLE_MODEのListViewはこのような問題を単独で処理します。 – Longerian
@Longerian:Nope - 私はListViewに適用されるXMLスタイルでそれを行います。 <スタイル名= "MyListViewを"> <=項目名 "アンドロイド:choiceMode"> singleChoice <項目名= "アンドロイド:パディング"> 8DP 私が知っているスタイルは、このようなルックスを適用しましたXMLを介して設定したときに無視されるこの設定のレポートがありましたが、クイックテストでは、コメントアウトすると単一の選択モードが有効にならず、アイテムがクリックされたときにチェックされませんでした。 – Nick