首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:在ListView打开时将项目设置为选中状态?

Android:在ListView打开时将项目设置为选中状态?
EN

Stack Overflow用户
提问于 2010-10-08 13:49:58
回答 4查看 68.1K关注 0票数 15

一个活动有一个Button和一个ListView。最初,只有Button是可见的。按下按钮时,将显示ListView。显示时,是否可以将某个特定项目显示为选中/聚焦?

一个用例可能是,假设它是一个语言设置列表,当该列表打开时,当前选择的语言必须突出显示。

如果我知道项目的索引,如何将其设置为焦点显示?

EN

Stack Overflow用户

发布于 2016-04-03 05:38:58

我使用的是Adapter,并不想设置自定义的背景颜色,而是在可绘制的xml中使用android:state_selected。SetSelection对我不起作用,但也许这也是因为我需要SetNotifyDataChanged,它表明所选状态不是持久的。

我还发现ListView中某项的选中状态不是持久的,因为SetNotifyDataChanged会导致更新ListView布局,从而将它们全部清除。在适配器的GetView中将项目设置为Selected也太快了。

最后,在listview的布局更改之后,我为所选项目的视图设置了Selected状态,这是在触发LayoutChange事件时(在Java语言中,它可能会将附加到ListView的OnLayoutChangeListener )。

为了方便起见,我将所选项目的视图存储为Adapter的SelectedItemView。在ListView的LayoutChange事件处理程序中,我只是将适配器的SelectedItemView.Selected设置为true。

下面是我的活动中的代码,其中我为ListView设置了适配器,还订阅了LayoutChange (或者在Java an OnLayoutChangeListener中)

代码语言:javascript
运行
复制
        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;
        };

下面是我的Adapter代码:

代码语言:javascript
运行
复制
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; }
}
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3888015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档