Android 无法将自定义listSelector应用于ListView

Android 无法将自定义listSelector应用于ListView,android,android-listview,Android,Android Listview,我现在已经复习了几个SO答案 甚至遵循这一点(目前正在使用这种方法) 我甚至将drawSelectorOnTop设置为true 但是,我无法使列表选择器工作。基本上,我已经束手无策了。我想这与我的列表项目的制作方式有关吧?以下是XML: list_entry.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res

我现在已经复习了几个SO答案

甚至遵循这一点(目前正在使用这种方法)

我甚至将
drawSelectorOnTop
设置为
true

但是,我无法使
列表选择器
工作。基本上,我已经束手无策了。我想这与我的列表项目的制作方式有关吧?以下是XML:

list_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <ImageButton android:id="@+id/contextMenuIcon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_overflow"
        android:background="@null"/>

    <TextView android:id="@+id/noteTitle"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/contextMenuIcon"
        android:layout_alignBottom="@id/contextMenuIcon"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_alignParentTop="true"
        android:textIsSelectable="false"
        android:ellipsize="end"
        android:singleLine="true"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>

    <TextView android:id="@+id/noteCreationDate"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/noteTitle" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080"/>

    <TextView android:id="@+id/notePrivacy"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/contextMenuIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080" />

</RelativeLayout>    
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>  
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>

</shape>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
    <item android:drawable="@android:color/transparent" />

</selector>

list\u selector\u pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <ImageButton android:id="@+id/contextMenuIcon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_overflow"
        android:background="@null"/>

    <TextView android:id="@+id/noteTitle"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/contextMenuIcon"
        android:layout_alignBottom="@id/contextMenuIcon"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_alignParentTop="true"
        android:textIsSelectable="false"
        android:ellipsize="end"
        android:singleLine="true"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>

    <TextView android:id="@+id/noteCreationDate"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/noteTitle" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080"/>

    <TextView android:id="@+id/notePrivacy"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/contextMenuIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080" />

</RelativeLayout>    
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>  
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>

</shape>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
    <item android:drawable="@android:color/transparent" />

</selector>

列表选择器聚焦.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <ImageButton android:id="@+id/contextMenuIcon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_overflow"
        android:background="@null"/>

    <TextView android:id="@+id/noteTitle"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/contextMenuIcon"
        android:layout_alignBottom="@id/contextMenuIcon"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_alignParentTop="true"
        android:textIsSelectable="false"
        android:ellipsize="end"
        android:singleLine="true"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>

    <TextView android:id="@+id/noteCreationDate"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/noteTitle" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080"/>

    <TextView android:id="@+id/notePrivacy"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/contextMenuIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080" />

</RelativeLayout>    
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>  
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>

</shape>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
    <item android:drawable="@android:color/transparent" />

</selector>

列表选择器.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <ImageButton android:id="@+id/contextMenuIcon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_overflow"
        android:background="@null"/>

    <TextView android:id="@+id/noteTitle"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@id/contextMenuIcon"
        android:layout_alignBottom="@id/contextMenuIcon"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_alignParentTop="true"
        android:textIsSelectable="false"
        android:ellipsize="end"
        android:singleLine="true"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>

    <TextView android:id="@+id/noteCreationDate"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/noteTitle" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080"/>

    <TextView android:id="@+id/notePrivacy"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@id/contextMenuIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="#808080" />

</RelativeLayout>    
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>  
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

    <gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>

</shape>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
    <item android:drawable="@android:color/transparent" />

</selector>


请告诉我如何使列表选择器工作

根据我的经验,要使列表选择器工作,必须使用CheckedTextView作为列表项的根元素

<?xml version="1.0" encoding="utf-8"?>
<!-- Added this view purposefully -->
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_48dp"
    android:layout_centerVertical="true"
    android:background="@drawable/selector_liquidation"
    android:gravity="center_vertical|left"
    android:paddingBottom="@dimen/_15dp"
    android:paddingLeft="@dimen/_40dp"
    android:paddingRight="@dimen/_10dp"
    android:paddingTop="@dimen/_15dp"
    android:singleLine="true"
    android:textColor="@color/gray_999999"
    android:textSize="@dimen/font_18sp" />

mSelectedIndex是跟踪所选位置的整数。它将始终具有选定的索引。

您正在列表项中使用ImageButton。因此,当您单击该项目时,ImageButton将获得焦点

但在你们的情况下,你们把ImageButton放回原处

  android:background="@null"
它让你看不到焦点。如果删除此行,则可以看到问题

要从列表项获取焦点,可以在xml的根视图中使用此代码

android:descendantFocusability="blocksDescendants"   


我用xml创建了一个快速测试,它正常工作

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);

            ListView list = (ListView)rootView.findViewById(R.id.list);

            ArrayList<MyItem> listItem = genListItem(20);
            MyAdapter adapter = new MyAdapter(MainActivity.this, android.R.layout.simple_list_item_1, listItem);
            list.setAdapter(adapter);


            return rootView;
        }

        private ArrayList<MyItem> genListItem(int size) {
            ArrayList<MyItem> listItem = new ArrayList<MainActivity.MyItem>();
            for (int i = 0; i < size; i++) {
                MyItem item = new MyItem();
                item.setName("item " + i);
                listItem.add(item);
            }

            return listItem;
        }
    }

    public static class MyItem{
        String Name;
        /**
         * @return the name
         */
        public String getName() {
            return Name;
        }
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            Name = name;
        }


    }

    public class MyAdapter extends ArrayAdapter<MyItem>{

        private LayoutInflater inflator;
        private Context mContext;
        public MyAdapter(Context context, int resource, List<MyItem> objects) {
            super(context, resource, objects);
            mContext = context;
            inflator = ((Activity) context).getLayoutInflater();
        }

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

            final ViewHolder holder;
            if (convertView == null) {
                convertView = inflator.inflate(R.layout.list_entry, null);
                holder = new ViewHolder();
                holder.Name = (TextView) convertView.findViewById(R.id.noteTitle);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            MyItem item = getItem(position);
            holder.Name.setText(item.getName());


            return convertView;
        }

        class ViewHolder {
            public TextView Name;
        }


    }

}
公共类MainActivity扩展了ActionBarActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(savedInstanceState==null){
getSupportFragmentManager().beginTransaction().add(R.id.container,新占位符片段()).commit();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/**
*包含简单视图的占位符片段。
*/
公共类占位符片段扩展了片段{
公共占位符片段(){
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
ListView list=(ListView)rootView.findViewById(R.id.list);
ArrayList listItem=genListItem(20);
MyAdapter=新的MyAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,listItem);
list.setAdapter(适配器);
返回rootView;
}
私有ArrayList genListItem(整数大小){
ArrayList listItem=新的ArrayList();
对于(int i=0;i
我不知道为什么,但随机试验和错误导致了我这样做:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@color/translucent_50_grey" />
    <item android:state_pressed="false" android:drawable="@android:color/transparent" />

    <item android:state_focused="true" android:drawable="@android:color/transparent" />
    <item android:state_focused="false" android:drawable="@android:color/transparent" />

    <item android:drawable="@android:color/transparent" />
</selector> 


瞧!它正在工作。全屏和标题栏主题。

也发布选择器xml代码。定位如何?
CheckedTextView
将包含
RelativeLayout
?很抱歉,我无法理解你在说什么。因此,如果我删除
@null
背景并添加
子代焦点可用性
行,它会工作吗?>如果你不想在图像按钮中看到焦点,则无需删除@null背景。你能让它工作并发布截图吗?:)这件事我已经花了8个小时:)我明白了。关键是选择器没有出现:)在您使用“”的listitem_selector.xml中,但名称必须是“list_selector_Focused.xml”(带2个“s”)。你能检查一下这是否是个问题吗