我有一个由自定义适配器填充的列表视图。此列表视图具有自定义布局,其中包含图像视图和文本视图。
我想要做的是当我从任何一行按下该imageview时,它将更改其UI(setAlpha)并运行后台网络请求。
但是,如果组件是单独的,我无法弄清楚如何做到这一点。当我从任何行单击imageview时,只会影响最后一行。我在适配器中完成了这一切。
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
vh = new ViewHolder();
view = layoutInflater.inflate(R.layout.row_list_follows, null);
vh.ivHeart = (ImageView) view.findViewById(R.id.imgHeart);
vh.tvMerchantName = (TextView) view.findViewById(R.id.txtMerchantName);
view.setTag(vh);
} else {
vh = (ViewHolder) view.getTag();
}
lf = arrListFollow.get(i);
vh.tvMerchantName.setText(lf.getMerchantName());
// only the last row affected
vh.ivHeart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!lf.isFollowed()) {
vh.ivHeart.setAlpha(1f);
lf.setFollowed(true);
} else {
vh.ivHeart.setAlpha(0.3f);
lf.setFollowed(false);
}
}
});
return view;
}
我认为这是显而易见的,因为在此布局上膨胀的所有图像视图都具有相同的ID。到目前为止,我就是这样做的,但不能使它运作良好。
如何单击列表视图行上的单个组件并以编程方式更改其UI?
答案 0 :(得分:1)
尝试使用onClick view
参数:
vh.ivHeart.setTag(lf);
// only the last row affected
vh.ivHeart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
YOUR_CLASS_NAME obj=(YOUR_CLASS_NAME)view.getTag();
if (!obj.isFollowed()) {
view.setAlpha(1f);
obj.setFollowed(true);
} else {
view.setAlpha(0.3f);
obj.setFollowed(false);
}
}
答案 1 :(得分:0)
我有很多问题要解决这个问题,但我找到了解决这个问题的方法。
在BaseAdapter扩展的类中 我在Object类型的构造函数中声明一个ArrayList,如:
ArrayList<Object> tags = new ArrayList<Object>();
为了什么?
问题是,事件Onclick按钮或其他组件只知道最后一个标签引用最后一行......这是仅影响最后一行的原因......
所以
view.setTag(holder);
tags.add(view.getTag());
这里保存标签引用holderview
public void onClick(View v) {
ComponentsHolder holder_current= (ComponentsHolder) tags.get(position); **//HERE we obtain the tag refer to correct holder of position row**
if(holder_current.Description.getVisibility()==View.VISIBLE)
holder_current.Description.setVisibility(View.GONE);
else
holder_current.Description.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
});