如何设置ListView选择颜色直到下一个选择?

时间:2012-09-14 13:46:03

标签: android listview select background background-color

我将Selector作为listSelector的{​​{1}}。而且在ListView中,我设置了

ListView

当用户触摸android:choiceMode="singleChoice" android:listSelector="@drawable/list_selector" android:background="@android:color/transparent" android:cacheColorHint="@android:color/transparent" 的任何项目时,它会采用正确的蓝色,但一旦用户移开手指,它就会变回黑色。我希望所选项目保留蓝色,直到并且除非用户触摸任何其他项目。

ListView

我需要做些什么改变?

4 个答案:

答案 0 :(得分:1)

您必须将android:choiceMode的{​​{1}}设置为ListView。此外,您应该将singleChoice设置为您已经实现的选择器,并从android:listSelector的项目中移除该选择器(或任何其他android:background drawable),以使其背景透明。

除此之外,你应该扩展你的选择器以对ListView作出反应并注册android:state_checked,如下所示:

OnItemClickListener

用于列表项的顶级视图组件需要实现接口listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { listView.setItemChecked(position, true); } }); 。请参阅http://developer.android.com/reference/android/widget/Checkable.html以获取已经开箱即可检查的类列表。如果您只想显示文字Checkable,请为您执行此操作。否则,如果使用自定义视图,则必须自己实现此接口。

答案 1 :(得分:0)

onListItemClick中,强制查看状态:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
        v.setSelected(true);
}

答案 2 :(得分:0)

在您的代码中尝试此操作

StateListDrawable states = new StateListDrawable();
    states.addState(new int[] {android.R.attr.state_pressed},
        getResources().getDrawable(R.drawable.pressed));
    states.addState(new int[] {android.R.attr.state_focused},
        getResources().getDrawable(R.drawable.focused));
    states.addState(new int[] { },
        getResources().getDrawable(R.drawable.normal));
    imageView.setImageDrawable(states);

它可能对你有帮助....

答案 3 :(得分:0)

在这种情况下,我认为您需要从ArrayAdapter课程进行管理。 在那里你必须记住最后点击的项目视图和位置。

基本思路是onListItemClick将点击的位置和项目视图传递给那里的适配器 我们将使用您喜欢的颜色设置背景,并更改最后选择的视图 背景颜色为默认颜色。

 public class SampleAdapter extends ArrayAdapter<Object> {

    private int mSelection = 0;

    public SampleAdapter(Context context, int resource, int textViewResourceId,
            List<Object> objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public void setSelection(int mSelection, View selectedItemView) {
        this.mSelection = mSelection;

        if (selectedItemView!= null && lastSelectedRow != null
                && selectedItemView!= lastSelectedRow) {
            lastSelectedRow
                    .setBackgroundResource(R.drawable.bg_normal);
            selectedItemView
                    .setBackgroundResource(R.drawable.bg_selected);
        }

        this.lastSelectedRow = selectedItemView;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //Usual code logic here....

        if (mSelection == position) {
            mViewHolder.mRootView
                    .setBackgroundResource(R.drawable.bg_selected);
            lastSelectedRow = mViewHolder.mRootView; 
        } else {
            mViewHolder.mRootView
                    .setBackgroundResource(R.drawable.bg_normal);
        }


        return view;
    }

    private static class ViewHolder {
        TextView name;
        View mRootView;
    }
}

在列表项目上单击,您需要将单击的项目和位置传递给适配器。

public void onItemClick(AdapterView<?> arg0, View listItemView,
        int position, long id) {

    if(myAdapter != null )
    {
        myAdapter.setSelection(position,listItemView);
    }
}

如果要从其他点调用此设置选择 你可以这样称呼它。

myAdapter.setSelection(position,mListViwe.getChildAt(pos));
mListViwe.setSelectionFromTop(position, 0);