滚动时按钮随机选择的Listview项目

时间:2013-08-12 08:34:30

标签: android listview

我在滚动时面临奇怪的列表视图选项。

初始选择截图(选择第1个条目) enter image description here

滚动列表视图项后自动选择为什么? (见下面的截图)

enter image description here

适配器源代码为here

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView title = (TextView)vi.findViewById(R.id.title); // title
    TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name
    TextView duration = (TextView)vi.findViewById(R.id.duration); // duration
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);

    // Setting all values in listview
    title.setText(song.get(CustomizedListView.KEY_TITLE));
    artist.setText(song.get(CustomizedListView.KEY_ARTIST));
    duration.setText(song.get(CustomizedListView.KEY_DURATION));
    imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image);
    return vi;
}

在setonitemclicklistner()中显示make按钮正在解决问题

list.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
view.setSelected(true);
view.setBackgroundResource(R.drawable.gradient_bg_hover);   
TextView title;
TextView artist;
title = (TextView)view.findViewById(R.id.title); // title
artist = (TextView)view.findViewById(R.id.artist); // artist
title.setTextColor(getResources().getColor(android.R.color.white));
artist.setTextColor(getResources().getColor(android.R.color.white));

ImageButton btnChild = (ImageButton)view.findViewById(R.id.arrow);
btnChild.setVisibility(View.VISIBLE);

if(lastselected!= null)
{

    title = (TextView)lastselected.findViewById(R.id.title); // title
    artist = (TextView)lastselected.findViewById(R.id.artist); // artist
    title.setTextColor(getResources().getColor(android.R.color.black));
    artist.setTextColor(getResources().getColor(android.R.color.black));

     btnChild = (ImageButton)lastselected.findViewById(R.id.arrow);
    btnChild.setVisibility(View.INVISIBLE);
    lastselected.setBackgroundResource(R.drawable.gradient_bg);
}

lastselected= view;

在图像按钮可见后,getview会为下一个显示项目回收相同的视图。我不知道如何解决这个问题。

4 个答案:

答案 0 :(得分:1)

使用

listview.setSelector(drawable)

如果您想更改选择器或禁用它。

答案 1 :(得分:0)

您可以使用onScrollListener来检测列表何时滚动并阻止选择项目。

在这里查看(click)

onScroll() 

滚动列表或网格时要调用的回调方法。滚动完成后将调用此方法

onScrollStateChanged()

在滚动列表视图或网格视图时调用的回调方法。如果正在滚动视图,则在渲染滚动的下一帧之前将调用此方法。

答案 2 :(得分:0)

这是适配器getView()的常见缺陷。当视图被回收(convertView不为空)时,您需要将回收的视图重置为其初始状态。在这种情况下,请重置已回收列表行的已检查/已选状态。

答案 3 :(得分:0)

试试这个:

Selected Item issue while scrolling listview

由于延迟加载,视图的状态无法保证。如果你存储一个额外的布尔值,或者在你的情况下另外一对字符串到你的HashMap,如果它更容易,标记是否选择了该歌曲将更加精确。实现ViewHolders也不会受到伤害。希望这会有所帮助。