当前位置: 首页 > 知识库问答 >
问题:

即使只在一个listView项中按下按钮,也会按下多个listView项按钮

鲜于喜
2023-03-14
 @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));
        }
    });

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

请帮忙。

共有1个答案

唐炳
2023-03-14

这是因为您的视图是在listview中回收的。当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方法中:

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    // ...
    likeButton = (Button) v.findViewById(R.id.like_button);
    likeButton.setBackgroundResource(currentProduct.isLiked() ? R.drawable.liked : R.drawable.something);
    // continue...
 类似资料:
  • 我有一个包含我的数据的listView,但我需要能够按下向上滚动的按钮(如果listView可以向上滚动)和向下滚动的按钮(如果listView可以向下滚动),而不是使用滚动条滚动 listView可以转到的最大Y位置 listView滚动到的当前Y位置 使用这些值,我可以编写其余的代码。

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 问题内容: 当我单击一个按钮时,我想运行多种功能。例如,我希望我的按钮看起来像 当我执行此语句时,出现错误,因为我无法两次为参数分配内容。如何使命令执行多个功能。 问题答案: 您可以创建一个用于组合功能的通用功能,看起来可能像这样: 然后,您可以像这样创建按钮:

  • 如您所见,我制作了对话框,displaynotedate用于读取与金额相关的其他数据,并在对话框中读取:

  • 我知道以前可能有人问过这个问题,但我似乎找不到适合我情况的合理答案。 我有一个表单,表单中有多个提交按钮,我需要知道按下了哪个按钮。 表单内部的一个小代码段可能如下所示: fmt:消息部分只是考虑了客户端的语言并将单词放在按钮上。 到目前为止,我在submit按钮上添加了一个动作处理程序,并在表单上添加了一个隐藏的input元素,告诉我哪个按钮被按下了,但是我需要在不依赖javascript的情况

  • 我正在使用Android Studio v3。1.2. 我有一对带有列表视图和按钮的活动。无论ListView中有多少项,按钮都应对齐底部。 在我的主活动中,ListView和按钮在RelativeLayout上完美渲染。我可以添加很多项目到ListView和按钮保持不变。 另一方面,我的JournalAbFragment是一个在表格布局中使用RelativeLayout的片段。该片段由PetDe