列表视图显示多个选定项目

时间:2011-10-30 21:58:22

标签: android android-listview

我有一种感觉这是由于某种渲染优化或其他原因,但我不确定是什么。

我有一个列表视图,当选择一个项目时,我会更改其背景颜色,以便在视觉上保持选中状态。

当列表超出屏幕(滚动)时出现问题,如果我选择顶部附近的项目然后向下滚动它还会显示另一个选定的项目,该项目曾经不在视图中(我永远看不到2个已选中)屏幕上的项目同时)。这也是相反的方式,如果我选择靠近底部的项目然后滚动到顶部,它将显示另一个项目被选中。

另外注意,所选项目之间的距离不均匀,如果我将设备旋转到横向,所选项目之间的距离会更短。

如果不清楚问题是什么,我也附上照片。

这是一个最小的列表,它只显示一个选定的项目。 enter image description here

这里我选择了顶部附近的项目。 enter image description here

向下滚动(请参阅滚动条)后,它会显示另一个项目。 enter image description here

现在代码。

列表片段。

public class ResultListFragment extends ListFragment {

BookListAdapter mBooksArray;
BookData api;
View footer;
ListView list;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Activity parent = getActivity();    
        BookSearch app = (BookSearch) parent.getApplicationContext();

    api = app.bookAPI;

    mBooksArray = new BookListAdapter(/*some params*/);
    mBooksArray.currentActivity = parent;


}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        list = (ListView) inflater.inflate(R.layout.search_results, null);

    footer = inflater.inflate(R.layout.load_more, null);

    return list;
}

public void onActivityCreated( Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    list.addFooterView(footer);

    list.setAdapter(mBooksArray);
}

}

在ArrayAdapter中,onClick方法中的颜色发生了变化。

public class BookListAdapter extends ArrayAdapter<Book> {

ArrayList<Book> books;
private BookData bookData;
Activity currentActivity;
final BookListAdapter self = this;
private View selected = null;



public void update() {
    currentActivity.runOnUiThread(new Runnable() {
        public void run() {     
            self.notifyDataSetChanged();
        }
    }); 
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {

        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.search_list_view_item, null);
    }
    /*some code to set the image and text */
    v.setOnClickListener(new OnItemClickListener(position));
    return v;
}

public void onClick(int position, View view) {
            // this log always reports the correct position when i select a list item
    Log.i(new Integer(position).toString(), books.get(position).title);
    if(selected != null) {
        selected.setBackgroundResource(R.drawable.list_view_bg);
    }
    selected = view;
    selected.setBackgroundResource(R.color.listSelected);

}

private class OnItemClickListener implements OnClickListener{           
        private int mPosition;

        OnItemClickListener(int position){
            mPosition = position;
        }
        @Override
        public void onClick(View view) {
        BookListAdapter.this.onClick(mPosition, view);
        }               
    }
}

1 个答案:

答案 0 :(得分:2)

ListView回收视图(带有View v = convertView; if (v == null) { } ...的部分),因此您要在一次又一次使用的视图上设置背景。相反,您还需要在模型上设置“选定”标志(Book对象本身)。在您注释掉的getView部分中,您可以说:

if (book.isSelected()) { 
  v.setBackgroundResource(R.color.listSelected) 
}