即使我仅在一个listview项目中按下按钮,也要按下多个listView项目按钮

时间:2018-11-04 05:17:10

标签: android listview

我正在创建一个电子商务应用程序,以在listView中显示产品列表。 每个列表项都有一个标题,图像和按钮,分别命名为喜欢,不喜欢和喜欢。

当用户在特定列表项上按下“喜欢”按钮时,该按钮的图像应更改为“喜欢”,并调用特定的API。我已经使用ArrayAdapter类在getView()方法的onClickListener内部完成了此操作。

喜欢这个。

 @Override
public View getView(int position, View convertView, ViewGroup parent) 
{

    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.list_item, parent, false);
        likeButton= (Button) 
 listItemView.findViewById(R.id.like_button);
        //likeButton.setClickable(currentProduct.getmLikeButton());
        dislikeButton = (Button) 
 listItemView.findViewById(R.id.dislike_button);

        favoritesButton = (Button) 
  listItemView.findViewById(R.id.favorite_button);
    }

    TextView productNameView = (TextView) 
 listItemView.findViewById(R.id.product_name);
    ImageView productImageView = (ImageView) 
  listItemView.findViewById(R.id.product_image);

    currentProduct = getItem(position);
    likeButton.setTag(position);
    dislikeButton.setTag(position);
    favoritesButton.setTag(position);

    likeButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            int position=(Integer)v.getTag();
            currentProduct = getItem(position);
            productId = currentProduct.getProductId();

            likeButton = (Button) v.findViewById(R.id.like_button);

            Uri baseUri = Uri.parse(UNBXD_UACTION);
                Uri.Builder uriBuilder = baseUri.buildUpon();
                uriBuilder.appendQueryParameter("uaction", "like");
                uriBuilder.appendQueryParameter("user", "8222");
                uriBuilder.appendQueryParameter(PRODUCT_ID,productId);
                uriBuilder.appendQueryParameter(MATERIALL, "true");
                //uriBuilder.appendQueryParameter(USER_ID, "5");
                uriBuilder.appendQueryParameter(UNDO, "false");
                Intent intent = new 
                Intent(Intent.ACTION_WEB_SEARCH, uriBuilder.build());
                intent.getData();
                likeButton.setBackgroundResource(R.drawable.liked);
Log.v("liked url is ", uriBuilder.toString() + " " + 
String.valueOf(position));
        }
    });

我注意到的问题是,如果我在listView的第一项上单击“ like”按钮,则不仅是第一项的“ like”按钮变为“ liked”,而且每三个listView项目中的“ like”按钮也会变为“ liked”显示为“喜欢”的更改,但API调用仅发生一次且正确地适合于所单击的项目。

我无法弄清楚从我实际按下的like按钮开始如何以及为什么每三个项目的like按钮被按下,但是(幸运的是)只有一个被调用,并且正确的API也被调用。

请帮助。

1 个答案:

答案 0 :(得分:0)

那是因为您的视图在public static int numerOfSelfLoops(Graph G) { int count = 0; for (int v = 0; v < G.V(); v++) for (int w : G.adj(v)) if (v == w) count++; return count/2; } 中被回收。当ListView意味着您获得了回收的视图,则需要再次绑定该视图。

要解决此问题,您可能需要在Product类或适配器或某处中添加新属性,并简化点击侦听器中的操作:

convertView != null

然后使用您的likeButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { int position = (Integer)v.getTag(); Product currentProduct = getItem(position); currentProduct.setLiked(true); // or false notifyDataSetChanged(); // notify so ListView can update } // continue... 方法:

getView