我设计了一个带有自定义项目布局的GridView,左上角有一个ImageView,右上角有另一个ImageView,中间有一个主ImageView和Text。
我需要为角上的两个ImageView和适配器的OnItemClickListener设置OnClickListener。
一切正常但只有GridView中的第一项无法触发OnClickListener。任何人都可以解决这个问题吗?
P.S。我发现第一项ImageView的OnClickListener将在我进行下一步操作时触发(例如点击其他项目)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
TagView tag;
if (convertView == null) {
v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
tag = new TagView(
(ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
(TextView) v.findViewById(R.id.myDoc_GridItem_TV),
(ImageView) v.findViewById(R.id.iViewAdd2Category),
(ImageView) v.findViewById(R.id.iViewDelete));
v.setTag(tag);
} else {
tag = (TagView) v.getTag();
}
v.setLayoutParams(new GridView.LayoutParams((int) (180 * v
.getResources().getDisplayMetrics().density), (int) (180 * v
.getResources().getDisplayMetrics().density)));
tag.image.setScaleType(ImageView.ScaleType.CENTER_CROP);
tag.image.setImageDrawable(new BitmapDrawable(BitmapFactory.decodeFile(m_DisplayItems.get(position)
.get("image").toString())));
tag.text.setText(m_DisplayItems.get(position).get("text").toString());
tag.iAdd2Category.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
tag.iDelete.setVisibility((m_IsEdit) ? View.VISIBLE : View.GONE);
if (m_IsEdit) {
tag.iAdd2Category.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(LOG_TAG, "Click on image add 2 category");
}
});
tag.iDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(LOG_TAG, "Click on image delete");
}
});
}
return v;
}
答案 0 :(得分:1)
将OnClickListeners
和OnItemClickListeners
混合为列表的项目效果不佳。
在您的情况下,您可能应该在商品的不同部分使用多个OnClickListeners
,而根本不使用OnItemClickListener
。
答案 1 :(得分:1)
我终于在这篇文章中找到了答案。
OnClickListener not working for first item in GridView
就我而言:
if (convertView == null) {
v = m_LayoutInflater.inflate(R.layout.mydoc_grid_item, null);
tag = new TagView(
(ImageView) v.findViewById(R.id.myDoc_GridItem_IV),
(TextView) v.findViewById(R.id.myDoc_GridItem_TV),
(ImageView) v.findViewById(R.id.iViewAdd2Category),
(ImageView) v.findViewById(R.id.iViewDelete));
v.setTag(tag);
} else {
tag = (TagView) v.getTag();
}
只需删除if else语句,每次都会实例化“tag”。
答案 2 :(得分:1)
这个问题的原因是,Android不仅在绘制视图时调用第一个项目的getView(),而且还用于布局测量!测量调用和绘制调用之间的getView()无法区分。因此,当您第一次进行绘制调用时,以及稍后的某个度量调用时,您将覆盖onClickListener。 实际上这样做是正确的 - 因为你每次都这样做,但我观察到了这种行为。也许你设置clickListener并且系统在getView调用之后释放它,因为视图不会被绘制...我没有跟踪那个深度以确保。
然而,每次重新创建视图都是一个坏主意,因为它非常耗时 - 您的网格可能无法平滑滚动。
解决方案是按如下方式编写自己的GridView:
public class MyGridView extends GridView{
private GridAdapter adapter;
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setAdapter(GridAdapter adapter) {
this.adapter = adapter;
super.setAdapter(adapter);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(adapter!=null)
adapter.setIsMeasureCall();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}}
并在GridAdapter中实现setIsMeasureCall()方法。无论何时调用,该方法都只将标志设置为true。 然后在你的getView()方法中检查它是否是一个度量调用,如果这是真的 - 你不设置监听器。
确保在getView()方法结束时将isMeasure设置为false。
我希望一切都清楚:)
有关详细信息,您可以查看我的主页,在那里我提供了一个解决此问题的完整Android项目。 http://simon.osim.at/projects/gridadapter/#TheSolution
答案 3 :(得分:0)
选择器文件
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/gridview_item_shape"></item>
<item android:state_pressed="false" android:drawable="@android:color/transparent"></item>
</selector>
项目布局文件
<?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="match_parent"
>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/griditem"
android:padding="2dp"
android:src="@drawable/grid_photo"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/gridview_item_select"
/>
</RelativeLayout>