我的Android GridView
包含ImageView
,TextView
和两个Button's
。网格看起来很好,但我发现很难处理GridView
内的按钮事件。我是Android新手。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:11)
如果您希望按钮(以及其他任何内容)在布局中具有唯一的单击操作,则需要编写自定义适配器并覆盖getView()
:
public MyAdapter(Context context, List<T> objects) {
...
inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
// Inflate and initialize your layout
convertView = inflater.inflate(R.layout.grid_item, parent, false);
holder = new ViewHolder();
holder.btnOne = (Button) convertView.findViewById(R.id.btnOne);
holder.btnOne.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Do something
}
});
// etc, etc...
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
// Do things that change for every grid item here, like
holder.textOne.setText(getItem(position));
return convertView;
}
class ViewHolder {
Button btnOne;
TextView textOne;
}
这些概念在多年来的各种Google会谈中得到了很好的解释,here is one。
<强>加成强>
我试图在点击GridView内的按钮时在GridView列中设置TextView的文本。
您应该能够通过查询View的父级然后获取ViewHolder来访问布局中的任何View onClick()
方法:
public void onClick(View v) {
ViewHolder holder = (ViewHolder) ((View) v.getParent()).getTag();
// Do something with holder.textOne now
}
(这假设您的布局没有任何嵌套的ViewGroups,因此请相应调整。)
答案 1 :(得分:4)
在适配器内设置OnClick侦听器并听取相同的点击,如following blog
中所述内部适配器
holder.okay_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((GridView)parent).performItemClick(v,position,0);
}
});
holder.cancel_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((GridView)parent).performItemClick(v,position,0);
}
});
在java文件中。
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch(view.getId)
{
case R.id.okay_button:
//do your stuff
break;
case R.id.cancel_button:
//do your stuff
break;
}
});
注意:如果您使用多个子项单击侦听器,请使用switch case检查在SetOnItemClickListener中单击了哪个项目。因为使用if else会触发适配器中的所有单击侦听器。如果有任何好的解决方案,请告诉我。谢谢。
答案 2 :(得分:1)
gridView = root.findViewById(R.id.gridview);
CustomAdapter customAdapter = new CustomAdapter();
gridView.setAdapter(customAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
{
if(view.getId() == R.id.buyButton) {
Intent intent = new Intent(getActivity(), OrderSummary.class);
intent.putExtra("name", canWaterName[i]);
intent.putExtra("price", canWaterPrice[i]);
intent.putExtra("image", canWaterImage[i]);
startActivity(intent);
}
}
});
扩展基本适配器的内部自定义适配器
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View view1 = getLayoutInflater().inflate(R.layout.row_data,null);
//getting view in row_data
final TextView name = view1.findViewById(R.id.canwaterName);
final TextView price = view1.findViewById(R.id.canwaterPrice);
final ImageView image = view1.findViewById(R.id.images);
name.setText(canWaterName[position]);
price.setText(canWaterPrice[position]);
image.setImageResource(canWaterImage[position]);
final Button buy = view1.findViewById(R.id.buyButton);
buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((GridView)parent).performItemClick(v,position,0);
}
});
return view1;
}
答案 3 :(得分:0)
您必须使用onItemClickListener
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position,
long row) {
}
位置应告诉您有关元素的信息。 但我认为gridview在使用clicklisteners(如按钮)处理对象时遇到问题。也许会更好地改变其他容器的gridview。如果您需要gridview,可以使用setOnTouchListener在屏幕中捕获位置并创建手动onitemclicklistener。