小编Ale*_*top的帖子

setSelected()与ListView一起工作

我正在尝试单击ListView的单击项来更改背景.但在我看来,实际上并不可能.有很多帖子都有这样做的例子,但没有一个可靠地运作.据我所知 - 它与"回收"有某种关系.

我在适配器的OnItemClickListener中调用view.setSelected(),它根据我的设置很好地将另一个背景应用于所选项目.但是当我选择导致ListView缺少空间的项目(不确切的重要程度)并且在ListView内部出现(或消失)scollbar时 - android会忘记我的选择并应用默认样式.旋转屏幕时会发生同样的错误 - 该项目取消选择.所以我认为在调用适配器的getView()时会发生"取消选择".

有趣的是,我的onClick事件导致向后台服务发送json请求并接收和解码json响应,因此项目点击和活动内容更改之间需要一些时间.这是它的样子:

  1. 我单击一个ListView项目.它将背景更改为"选定颜色".
  2. 我等待的几分钟.
  3. 活动内容根据服务响应而变化.ListView中会出现一个滚动条.项目背景更改为"默认颜色"(取消选择项目).

单击不会导致滚动条显示的项目可以很好地工作 - 在处理服务的响应后,所选项目不会被取消选中.

试图在适配器的getView()中调用setSelected()不会影响bug.物品仍然被取消选择.我尝试在getView()中手动设置项目的背景 - 它变得更有趣:导致滚动条外观的项目开始正常工作,但是不会导致滚动条出现的项目(实际上这意味着它们不会导致getView()调用)停止工作!

所有代码都非常复杂,所以我只发布一些重要的片段.这是我的OnItemClickListener:

private AdapterView.OnItemClickListener onCategoryClickListener =
        new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, final int position,
            long id) {
        categoriesAdapter.setSelectedPosition(position);
        view.setSelected(true);
        // More code here
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我的适配器代码的一个片段:

private int selectedPosition;
private boolean selectable = true;

public void setSelectedPosition(int position) {
    this.selectedPosition = position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView label = (TextView) …
Run Code Online (Sandbox Code Playgroud)

android listview recycle

4
推荐指数
1
解决办法
2075
查看次数

标签 统计

android ×1

listview ×1

recycle ×1