使用GridView的Android drawSelectorOnTop

lbr*_*anl 8 java android android-gridview android-selector

我正在开发一个标签式应用程序,其中一个片段CollectionsFragment在每个插槽中包含一个带有ImageView的GridView.我希望当用户点击其中一个图像时,使用选择器向用户提供反馈.

我已经成功实现了选择器,但是,我的问题是选择器只是在图像的背景中绘制,但我希望选择器可以绘制整个图像.我已经看到其他地方引用了这个问题,但是,许多人选择的解决方案,设置GridView的drawSelectorOnTop属性,对我来说不起作用.

带有相关适配器代码的相关片段:

public class CollectionsFragment extends Fragment {
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
             View view = inflater.inflate(R.layout.activity_collections, container, false);
             // Grid view is inside the xml view inflated above
             GridView gridView = (GridView)view.findViewById(R.id.gridview);
             gridView.setDrawSelectorOnTop(true);
             ((GridView) gridView).setAdapter(new CustomGridViewAdapter(getActivity()));
             return view;
        }

        private class CustomGridViewAdapter extends BaseAdapter {
            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
                View v = view;
                ImageView picture;
                TextView name;

                if(v == null) {
                    v = inflater.inflate(R.layout.collections_item, viewGroup, false);
                    v.setTag(R.id.picture, v.findViewById(R.id.picture));
                    v.setTag(R.id.text, v.findViewById(R.id.text));
                }

                picture = (ImageView)v.getTag(R.id.picture);

                name = (TextView)v.getTag(R.id.text);

                Item item = (Item)getItem(i);
                name.setText(item.name);

                picture.setImageResource(item.drawableId);
                picture.setBackgroundResource(R.drawable.selector);

                return v;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我的选择器完整性:

<?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/buttonhighlight"/> <!-- pressed state -->
<item android:state_focused="true" 
      android:drawable="@color/buttonhighlight"/> <!-- focused state -->
<item android:drawable="@android:color/transparent"/> <!-- default state --> 
</selector>
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助,

Vik*_*ram 15

我觉得你错了setDrawSelectorOnTop(boolean).该selector正被引用在这里绘制是GridView的内部selector绘制.

即使在最简单的实现中GridView,当单击网格项时,也会在其周围绘制蓝​​色边框.这是因为,默认情况下,gridview自己的选择器被绘制behind为项目.如果你打电话setDrawSelectorOnTop(true),选择器(蓝色)将被绘制在项目上.

setDrawSelectorOnTop(boolean)与您在适配器中设置的选择器无关.无论你传递true,还是false,ImageView的选择器的行为都不会改变.

解:

而不是在适配器内的每个ImageView上设置选择器,使GridView使用您的选择器drawable:

GridView gridView = (GridView)view.findViewById(R.id.gridview);
gridView.setDrawSelectorOnTop(true);

// Make GridView use your custom selector drawable
gridView.setSelector(getResources().getDrawable(R.drawable.selector));
Run Code Online (Sandbox Code Playgroud)

现在,没有必要:

picture.setBackgroundResource(R.drawable.selector);
Run Code Online (Sandbox Code Playgroud)

编辑:

虽然我不推荐这个(明显的开销),它应该工作:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View v = view;
    ImageView picture;

    ....
    ....

    LayerDrawable ld = new LayerDrawable(new Drawable[] 

                           // Drawable from item
                           { getResources().getDrawable(item.drawableId), 

                           // Selector
                           getResources().getDrawable(R.drawable.selector)});

    // Set the LayerDrawable
    picture.setImageDrawable(ld);

    // Don't need this
    // picture.setBackgroundResource(R.drawable.selector);

    return v;
}
Run Code Online (Sandbox Code Playgroud)