Android 带有按钮onclick'的Listview;s的位置在滚动时发生变化

Android 带有按钮onclick'的Listview;s的位置在滚动时发生变化,android,listview,android-listview,onclicklistener,Android,Listview,Android Listview,Onclicklistener,我有一个列表视图,它是可伸缩的。我有几个listview项目,它是从数据库中提取的。我的问题是,每个listview项都有一个按钮,我在getView中设置了一个按钮ClickListener。现在假设有5个项目,我点击项目1的按钮,位置是0,当我滚动到列表的末尾时,我可以看到项目5的按钮被点击。当我滚动到列表中间时,有时按钮会随机点击,我可以从我的日志中看到,特别按钮的位置是0。为什么 这是我的getView代码 public View getView(final int position,

我有一个列表视图,它是可伸缩的。我有几个listview项目,它是从数据库中提取的。我的问题是,每个listview项都有一个按钮,我在getView中设置了一个按钮ClickListener。现在假设有5个项目,我点击项目1的按钮,位置是0,当我滚动到列表的末尾时,我可以看到项目5的按钮被点击。当我滚动到列表中间时,有时按钮会随机点击,我可以从我的日志中看到,特别按钮的位置是0。为什么

这是我的getView代码

public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.newsfeed_layout, parent, false);
        }
        final Button btnLike = (Button) v.findViewById(R.id.buttonLike);
        btnLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    String buttonText = btnLike.getText().toString();
                    if(buttonText.equals("LIKE")){
                        Toast.makeText(postedItems.this, "Liked This item" + position, Toast.LENGTH_SHORT).show();
                        btnLike.setPadding(4,0,12,0);
                        btnLike.setText("UNLIKE");
                        btnLike.setTextColor(Color.parseColor("#ffffff"));
                        btnLike.setBackgroundResource(R.drawable.likedredbutton);
                    }else if(buttonText.equals("UNLIKE")){
                        Toast.makeText(postedItems.this, "Unlike This Item" + position, Toast.LENGTH_SHORT).show();
                        btnLike.setPadding(4,0,20,0);
                        btnLike.setText("LIKE");
                        btnLike.setTextColor(Color.parseColor("#737373"));
                        btnLike.setBackgroundResource(R.drawable.cornerstyledbutton);
                    }
            }
        });
        return v;
    }

首先,要了解问题:出现这种情况是因为
ListView
在滚动时重用视图以提高性能。这就是
convertView
参数的解释

因此,您需要确保要为每个项存储的任何状态都存储在适配器本身或存储其备份数据的任何位置,并且当您实现
getView()
时,UI会完全更新以反映此数据(因为它将具有上次使用时您在其上设置的任何属性)

在这种情况下,您需要存储每个项目是“喜欢”还是“不喜欢”。然后,在返回之前,始终设置
btnLike
的属性以反映这一点

例如,您的代码必须大致如下所示:

public View getView(final int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = ...;
    }

    final Button btnLike = (Button) v.findViewById(R.id.buttonLike);

    if (isLiked(position))
        setButtonAsUnlike(btnLike);
    else
        setButtonAsLike(btnLike);

    btnLike.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (!isLiked(position))
            {
                // Not liked before, so like now.
                setLiked(position, true); // store this value.
                setButtonAsUnlike(btnLike); // the button is now "unlike"
            }
            else
            {
                // Liked before, unliked now.
                setLiked(position, false); // store this value.
                setButtonAsLike(btnLike); // the button is now "like"
            }
        }
    });

    return v;
}

如果
isLiked(position)
查询数据,
setlike(position,boolean)
更新数据,
setButtonAsLike(Button)
setbuttonasulike(Button)
像现在这样更新按钮的视觉属性。

Hi matiash感谢您的时间和解决方案。我对你的解决方案有点困惑。isLiked(位置)将查询数据,但它将如何查询数据?你能分享一些简单的代码吗?谢谢。我猜你的适配器包含每个新闻提要项目的数组或列表,对吗?你应该有一个“喜欢”的标志。是的,让我试试并更新结果。顺便说一下,谢谢你。:)嘿,伙计,我修改了一些部件,现在工作正常了。谢谢你的主意。。祝你有愉快的一天。:)