受益于Selector并实现自定义onClick()行为

时间:2013-09-02 08:41:14

标签: android android-listview android-selector

我有一个ListView,我使用视图持有者模式填充多个元素。我已指定Selector来更改选区的背景颜色。当用户选择了一个项目(或不选择)并选择继续到我的控制流程中的下一个Activity时,我想检索他选择的内容并将其提供给我的业务逻辑。

我的困境如下:当我使用像AdapterView#getSelectedItem()这样的方法时,他们会返回null。我认为,我需要检查哪些项目被激活,而不是被选中,但似乎没有一种方法。至少不是我能找到的。如果我继续在我的适配器中设置OnClickListener并覆盖onClickSelector将会抓住工作。我可以使用方法将listview的项目设置为活动,但后来我面临切换选择的问题;基本上我首先想要使用Selector

这里有一些代码:

persona_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/background_light" android:state_activated="false" />
    <item android:drawable="@android:color/background_light" android:state_pressed="false" />
    <item android:drawable="@android:color/background_dark" android:state_selected="true" />
    <item android:drawable="@android:color/background_dark" android:state_activated="true" />
</selector>

DemoPersonaAdapter.java

@Override
public View getView(int position, View convertView, ViewGroup parentViewGroup)
{       
    final PersonaViewHolder viewHolder;
    final Persona persona = provider[position];

    if (convertView == null)
    {
        convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_personas, null);

        viewHolder = new PersonaViewHolder(
                (ImageView) convertView.findViewById(R.id.persona_icon),
                (TextView) convertView.findViewById(R.id.persona_description));
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (PersonaViewHolder) convertView.getTag();
    }

    Bitmap icon = BitmapFactory.decodeResource(parent.getResources(), persona.getPicture());
    viewHolder.setIcon(icon, 50, 50);
    viewHolder.setDescription(persona.getName() + " is a " + persona.getType() + "!");

    convertView.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {   
            ((ParentClass)parent).setPersona(persona);
        }
    });
    return convertView;
}

1 个答案:

答案 0 :(得分:2)

为什么不使用全局item click listener on the list而不是每个视图点击监听器?