アクティビティにはボタンとリストビューがあります。最初は、ボタンだけが表示されています。ボタンを押すと、ListViewが表示されます。表示されたときに、特定のアイテムを選択/フォーカスした状態で表示することはできますか?
言語設定のリストであり、リストが開いたときに、現在選択されている言語を強調表示して表示する必要がある場合があります。
アイテムのインデックスを知っている場合、それを表示にフォーカスするように設定するにはどうすればよいですか?
つまり、ListView :: setSelection(int position)が必要です。ただし、デバイスがタッチモードかどうかに応じて、視覚効果(背景の強調表示)がある場合とない場合があります。詳細については、 Android ListView Selection Problem を参照してください
グーグルはまだ答えを知らないので、私は自分の解決策を投稿します。
getListView().setItemChecked(selectedGroupIndex, true);
Adapter
にListView
を使用する場合は、次のコードをアダプターに追加します。
public class MyAdapter extends ArrayAdapter<MyClass> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflator = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflator.inflate(R.layout.my_adapter, null);
} else {
rowView = (View) convertView;
}
//...
// set selected item
LinearLayout ActiveItem = (LinearLayout) rowView;
if (position == selectedItem){
ActiveItem.setBackgroundResource(R.drawable.background_dark_blue);
// for focus on it
int top = (ActiveItem == null) ? 0 : ActiveItem.getTop();
((ListView) parent).setSelectionFromTop(position, top);
}
else{
ActiveItem.setBackgroundResource(R.drawable.border02);
}
}
private int selectedItem;
public void setSelectedItem(int position) {
selectedItem = position;
}
}
Activity
内:
myAdapter.setSelectedItem(1);
アダプターを使用しており、カスタムの背景色を設定したくありませんが、ドローアブルxmlでAndroid:state_selectedを使用しています。 SetSelectionは機能しませんでしたが、選択された状態が永続的でないことを示すSetNotifyDataChangedが必要だったためかもしれません。
また、SetNotifyDataChangedはListViewレイアウトを更新してすべてをクリアするため、ListViewの項目のSelected状態は永続的ではないこともわかりました。アダプターのGetViewで項目をSelectedに設定するのも早すぎます。
最終的には、リストビューのレイアウトが変更された後、選択されたアイテムのビューのSelected状態を設定します。これは、LayoutChangeイベントがトリガーされたときです(Java ListView)。
本当に簡単にするために、選択したアイテムのビューをアダプタのSelectedItemViewとして保存します。 ListViewのLayoutChangeイベントハンドラーで、アダプターのSelectedItemView.Selectedをtrueに設定しました。
これは、ListViewのアダプタを設定し、LayoutChangeをサブスクライブする私のアクティビティのコードです(またはJava OnLayoutChangeListenerをアタッチ)
ringTonesListView.Adapter = ringTonesListAdapter;
ringTonesListView.LayoutChange += (s, layoutChangeArgs) => {
//At this stage the layout has been updated and the Selected can be set to true for the view of the selected item. This will result in Android:state_selected logic to be applied as desired and styling can be completely done per layout in Resources.
ringTonesListAdapter.SelectedItemView.Selected = true;
};
アダプタのコードは次のとおりです。
public class RingTonesListAdapter : BaseAdapter<RingToneItem>
{
List<RingTone> Items { get; set; }
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
// re-use an existing view, if one is available
// otherwise create a new one
if (view == null)
{
view = Context.LayoutInflater.Inflate(Resource.Layout.AlertSoundItem, parent, false);
view.Click += SelectRingTone;
}
RingTone ringTone = this[position];
if (ringTone.Selected)
{
//==> Important
//Store this view since it's the view for the Selected Item
SelectedItemView = view;
//Setting view.Selected to true here doesn't help either, since Selected will be cleared after.
}
return view;
}
private void SelectRingTone(object sender, EventArgs args)
{
View view = (View)sender;
string title = view.FindViewById<TextView>(Resource.Id.ringToneTitle).Text;
RingToneItem ringToneItem = Items.First(rt => rt.Title == title);
if (!ringToneItem.Selected)
{
//The RingTone was not selected and is selected now
//Deselect Old and Select new
foreach (RingToneItem oldItem in Items.Where(rt => rt.Selected))
{
oldItem.Selected = false;
}
// Select New RingTone
ringToneItem.Selected = true;
//Update the ListView.
//This will result in removal of Selected state for all Items when the ListView updates it's layout
NotifyDataSetChanged();
}
//Now play the test sound
NotifierService.TestSound(Context, ringToneItem);
}
public View SelectedItemView { get; set; }
}