滚动时按钮onclick的位置更改列表视图

时间:2014-06-15 05:53:18

标签: android listview android-listview onclicklistener

我有一个列表视图并且它是可以扫描的。我有很少的listview项目,它从数据库中提取。我的问题是,每个listview项都有一个按钮,我有setOnclickListener到getView里面的按钮。现在让我们说5个项目,然后点击项目编号1的按钮,位置为0,当我滚动到列表的末尾时,我可以看到项目编号5的按钮被点击。当我滚动到列表的中间位置时,有时按钮随机点击,我可以从我的logcat看到,粒子按钮的位置是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;
    }

1 个答案:

答案 0 :(得分:2)

首先,要了解问题:发生这种情况是因为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)查询数据,setLiked(position, boolean)更新数据,setButtonAsLike(Button)setButtonAsUnlike(Button)更新Button的视觉属性,就像现在一样。