单击listview行中的单个组件

时间:2014-09-11 04:34:23

标签: android listview android-listview

我有一个由自定义适配器填充的列表视图。此列表视图具有自定义布局,其中包含图像视图和文本视图。

我想要做的是当我从任何一行按下该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?

2 个答案:

答案 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();

           }
          });