我正在开发一个选项卡式应用程序,其中片段之一CollectionsFragment包含一个GridView,每个插槽中都有一个ImageView。我希望当用户点击其中一张图片时使用选择器向用户提供反馈。
我已经成功实现了选择器,但是我的问题是选择器仅在图像的背景中绘制,但是我希望选择器绘制整个图像。我已经看到过其他地方提到的此问题,但是,许多人选择的解决方案(设置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;
}
}
}
为了完整性,我的选择器:
<?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>
谢谢你的帮助,
我想你错了setDrawSelectorOnTop(boolean)
。该selector
正被引用在这里绘制是GridView的内部selector
绘制。
即使在最简单的实现中GridView
,当单击网格项时,也会在其周围绘制蓝色边框。这是因为,默认情况下,gridview自己的选择器会绘制behind
该项目。如果调用setDrawSelectorOnTop(true)
,则选择器(蓝色)将绘制在该项目上方。
但是setDrawSelectorOnTop(boolean)
与您在适配器中设置的选择器无关。无论您通过true
或false
,ImageView的选择器的行为都不会改变。
解:
不用在适配器内部的每个ImageView上设置选择器,而是使GridView使用可绘制的选择器:
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));
现在,不需要:
picture.setBackgroundResource(R.drawable.selector);
编辑:
尽管我不建议这样做(明显的开销),但它应该可以工作:
@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;
}
问题内容: 我有一个带有gridview的适配器,可以用作活动。我正在尝试将其放在Fragment中并进行转换,但是它不起作用。当我在Activity中包含IconFragmentSystem时,当我尝试打开Activity时会强制关闭。 我知道活动有效,因为我可以使用其他片段,并且一切都很好,所以我知道我的问题出在此文件中。 我尝试了不同的方法来实现此目的,但都失败了,我真的可以使用帮助将我指向
现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?
希望你一切顺利。 这是我的设想。我有多(20)个Liferay Portlet,它们使用网格/表格来显示数据。 每个portlet根据不同的标准检索数据。 但是,网格与一些常见的功能相同,例如过滤、分页、数据导出等。 目前,每次我们必须对网格样式进行更改时,我必须对20个Portlet中的每一个进行更改。这是非常低效的,而且会浪费很多时间。 因此,我想知道是否有可能创建一个通用的“portlet”
我按照以下指南使用网格视图在图库中插入图像:http://developer . Android . com/guide/topics/ui/layout/GridView . html 我编辑了imageadapter代码,如下所示: } 这是img_gallery个 xml 这是主要布局: 问题是,当我调整应用程序时,imageview有很多顶部和底部填充。我也尝试在xml中将其设置为0,但它
问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容
问题内容: 查看量角器文档,我发现有一个选项可以不使用Selenium服务器使用flag 来运行量角器。 使用硒服务器和不使用硒服务器运行量角器测试之间的区别是什么,除了后者仅支持Chrome,Firefox? 问题答案: 首先,目前,您有 5种不同的内置选项/方式来连接浏览器驱动程序 : 指定在本地启动Selenium独立服务器 指定连接到正在运行的硒服务器(本地或远程) 设置并连接到Sauce