首页 文章

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

提问于
浏览
0

我有 Selector 作为 ListViewlistSelector . 而且在ListView中,我已经设置了

android:choiceMode="singleChoice"
android:listSelector="@drawable/list_selector"
android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"

当用户触摸 ListView 的任何项目时,它会采用正确的蓝色,但一旦用户移开手指,它就会变回黑色 . 我希望所选项目保留蓝色,直到并且除非用户触摸任何其他项目 .

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
     android:state_selected="false"
        android:state_pressed="false" 
        android:drawable="@color/grey" />
    <item android:state_pressed="true" 
        android:drawable="@color/blue" />
    <item android:state_selected="true"
     android:state_pressed="false" 
        android:drawable="@color/blue" />
    </selector>

我需要做些什么改变?

4 回答

  • 0

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

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

    listView.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            listView.setItemChecked(position, true);
        }
    
    });
    

    用于列表项的顶级视图组件需要实现接口 Checkable . 有关已经开箱即可检查的类的列表,请参阅http://developer.android.com/reference/android/widget/Checkable.html . 如果您只想显示文本 CheckedTextView 应该为您做 . 否则,如果使用自定义视图,则必须自己实现此接口 .

  • 0

    onListItemClick 中,强制查看状态:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
            v.setSelected(true);
    }
    
  • 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);
    

    它可能会帮助你......

  • 1

    在这种情况下,我认为您需要从 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);
    

相关问题