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

单击列表视图项中的按钮时,其他一些列表视图项也会发生更改

管峻
2023-03-14

我正在制作一个有评论和描述的帖子的应用程序。每个帖子上有三个按钮。1描述2评论,第三个是喜欢按钮。我在自定义适配器的getview方法中设置了一个按钮点击侦听器。当我点击描述按钮时,该帖子的描述应该显示在按钮下。但是当我点击描述按钮时,其他一些列表视图项目的描述也显示出来。我只想显示被点击描述按钮的帖子的描述。这是我的代码:

getview代码:

public View getView(int position, View convertView, ViewGroup parent) {
        a = getItem(position);

        View view = convertView;
        try
        {
            if (convertView == null) {
                v = new ViewHolder();
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_list_item, parent, false);
                v.imgView = (ImageView) convertView.findViewById(R.id.iv_list_image);
                v.desc = (Button) convertView.findViewById(R.id.btn_desc);
                v.des = (TextView) convertView.findViewById(R.id.tv_list_desc);
                v.ll = (LinearLayout) convertView.findViewById(R.id.ll_desc);


                convertView.setTag(v);
            }
            else {
                v = (ViewHolder) convertView.getTag();
            }
            v.desc.setTag(position);
            //Picasso.with(getContext()).load(a.getFile()).fit().into(v.imgView);
            Glide.with(context).load(a.getFile()).centerCrop().placeholder(R.drawable.dualring).into(v.imgView);

            v.desc.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v1) {
                    Toast.makeText(getContext(), ""+v.desc.getTag(), Toast.LENGTH_SHORT).show();
                    v.des.setText(""+a.getDescription());
                    v.ll.setVisibility(View.VISIBLE);
                }
            });


            return convertView;

        }catch (Exception e)
        {
            return null;
        }

    }

XML代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="35dp">
    <ImageView
        android:id="@+id/iv_list_image"
        android:layout_width="match_parent"
        android:layout_height="300dp" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="6">
        <Button
            android:id="@+id/btn_desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="Description"
            />
        <Button
            android:id="@+id/btn_comment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="Comments"
            />
        <Button
            android:id="@+id/btn_likes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="Likes"
            />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp"
        android:background="#ffffff"
        android:visibility="invisible"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Description:"
            android:textStyle="bold"/>
        <TextView
            android:id="@+id/tv_list_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Default Desc"
            android:textColor="#333"
            />
    </LinearLayout>
</LinearLayout>

共有2个答案

袁增
2023-03-14

最好的方法是在适配器中实现on click listener,并设置tag on按钮。在onclick方法中,通过获取按钮的标记id来执行所需任务之后,这肯定会起作用。

吕宣
2023-03-14

在更新ListView的项之前,将列表项位置的int标志用作条件语句。

所以在你的例子中,Adapter类看起来像这样:

...

private int mPosition = -1; // Int flag that doesn't take effect UNTIL it has been set

...

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    a = getItem(position);

    View view = convertView;
    try {
        if (convertView == null) {
            v = new ViewHolder();
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_list_item, parent, false);
            v.imgView = (ImageView) convertView.findViewById(R.id.iv_list_image);
            v.desc = (Button) convertView.findViewById(R.id.btn_desc);
            v.des = (TextView) convertView.findViewById(R.id.tv_list_desc);
            v.ll = (LinearLayout) convertView.findViewById(R.id.ll_desc);

            convertView.setTag(v);
        } else {
            v = (ViewHolder) convertView.getTag();
        }

        v.desc.setTag(position);

        //Picasso.with(getContext()).load(a.getFile()).fit().into(v.imgView);
        Glide.with(context).load(a.getFile()).centerCrop().placeholder(R.drawable.dualring)
                .into(v.imgView);

        // Runs the following functionality if the positions match. Otherwise, hides the layout.
        if (mPosition == position) {
            Toast.makeText(getContext(), ""+v.desc.getTag(), Toast.LENGTH_SHORT).show();
            v.des.setText(""+a.getDescription());
            v.ll.setVisibility(View.VISIBLE);
        } else {
            v.ll.setVisibility(View.INVISIBLE);
        }

        v.desc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v1) {
                mPosition = position; // Sets the flag to the position that was clicked

                notifyDataSetChanged(); // Updates the data instantly
            }
        });

        return convertView;

    } catch (Exception e) {
        return null;
    }
}

如果有用,请告诉我。

 类似资料:
  • 我有一个奇怪的场景,每次我从的第一项中的微调器中选择一个值,最后一个项的微调器值与第一项相同。只有当ListView项目总数为5个及以上时,才会发生这种情况。我注释掉了代码,只保留了声明,但它仍在发生。这是Android系统的漏洞吗? 澄清: > 我的ListView的为空 我的微调器的被注释掉。 Android SDK工具版本为22.6.2 Android SDK平台工具是19.0.1 以下是适

  • 我有一个从适配器展开的列表视图。当我点击其中一个按钮时,我得到了错误的项目。在我添加了< code>whatsApp按钮之前,它一直工作正常。 这是我的适配器: 在代码中添加了一个onClickListener,如果按下waze按钮,它将检查位置,如果按下whatsapp按钮,则检查名称。这是代码 如何更改此项以获得正确的项目?

  • 我有一个带有textView的列表视图,每行都有一个按钮,我试图通过单击按钮而不是通过单击整行来获取文本view方法:(AdapterView arg0,View v,int position,long arg3)不适用于按钮单击。 这就是我如何通过单击列表视图的行来选择项目,但是,我想通过单击按钮而不是整行来选择项目:

  • 我有一个listView,它充满了字符串的数组列表,我想让它可点击...但我无法识别哪个项目被点击了 我做了这个,但没用! 有办法知道被点击的字符串吗?如果没有,是否有办法知道被点击项目的位置?

  • 但当接收者发送“hello”时,这条聊天信息会显示在左侧位置,但它也会将其他信息显示在左侧位置,发送信息时也是如此。。下面是用户收到“Hello”时的屏幕截图 我不知道我错在哪里 我的回收者视图发送者布局 chat_layout_self.xml chat_layout_other.xml MessageAdapter.java

  • 我做了一个列表视图。计划是,当你选择一个项目时,它应该显示为选中状态(背景颜色改变),当你选择另一个项目时,之前选择的项目再次正常。有办法做到这一点吗?我一直在尝试很多事情,但都没用。。。 这是我目前的代码。。。 标记其中一个是有效的,但删除选择是我的问题。有什么建议吗? 编辑:我要找的是,在我选择另一个项目之前,它一直处于选中状态