Android 安卓:通过长按修改视图的背景

Android 安卓:通过长按修改视图的背景,android,android-listview,contextual-action-bar,Android,Android Listview,Contextual Action Bar,从TabHost中包含的片段中的列表视图中,我实现了一个CAB以及高亮显示longPressed(selected)行。这在运行>=API14时可以完美地工作。但是,我支持api>8 在API8中,我看到了奇怪的行为,在长按列表项时,错误的视图有时会在列表中突出显示。似乎取决于列表中可见的行数决定了高亮显示是否有效。这是非常令人费解的,因为执行背景颜色更改的方法使用传递给它的视图,并且位置参数确实是正确的 这是一个错误还是我遗漏了什么 listView.setAdapter(

从TabHost中包含的片段中的列表视图中,我实现了一个CAB以及高亮显示longPressed(selected)行。这在运行>=API14时可以完美地工作。但是,我支持api>8

在API8中,我看到了奇怪的行为,在长按列表项时,错误的视图有时会在列表中突出显示。似乎取决于列表中可见的行数决定了高亮显示是否有效。这是非常令人费解的,因为执行背景颜色更改的方法使用传递给它的视图,并且位置参数确实是正确的

这是一个错误还是我遗漏了什么

 listView.setAdapter(
            new myAdapter(
                    inflater,
                    tvSeason)
    );
    listView.setOnItemLongClickListener( new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            if (mActionMode != null) {
                dismissActionMode();
                return false;
            }
            // Start the CAB using the ActionMode.Callback defined above
            mActionMode = getSherlockActivity().startActionMode(mActionModeCallback);
            view.setSelected(true);

            selectedTvEpisode = (TvEpisode)listView.getAdapter().getItem(position);
            mActionMode.setTitle(MyApp.getResourceString(R.string.tv_episode_number, selectedTvEpisode.getNumber()));

    view.setBackgroundColor(getActivity().getResources().getColor(R.color.lime));
            selectedView = view;
            return true;
        }
    });
listView.setAdapter(
新myAdapter(
充气机,
电视季)
);
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
if(mActionMode!=null){
dismissActionMode();
返回false;
}
//使用上面定义的ActionMode.Callback启动CAB
mActionMode=getSherlockActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
SelectedTvePiNode=(TveSpide)listView.getAdapter().getItem(位置);
mActionMode.setTitle(MyApp.getResourceString(R.string.tv_插曲号,selectedtvepicode.getNumber());
view.setBackgroundColor(getActivity().getResources().getColor(R.color.lime));
selectedView=view;
返回true;
}
});

小心,不要那样设置视图背景色!请记住:
ListView
中的视图可以循环使用。您应该做的是获取数据项,设置所选标志,然后在
适配器中调用
notifyDataSetChanged()
。根据
Adapter.getView()

中选择的标志设置背景是的,我知道回收,但我认为视图在可见且用户长按时不会回收…不,不是,但正确的方法仍然是在数据端处理选中/未选中,并让适配器在后台处理。我相信这会解决你的问题。我尝试了你建议的方法,我同意这是正确的方法。然而,同样的问题。在API 8上进行测试时,高亮显示的视图被关闭1或2行。请确保设置为“选择”的位置正确。将日志添加到
getView()
,该日志可能会输出项目名称和选择状态。它合适吗?正确的项目是否在数据中标记为选中?将您的答案标记为正确,因为您的建议确实帮助我通过在Adapter.getView()方法中有条件地设置背景色来解决此问题。