Android:更新ListView中仍然可以滚动的项目

时间:2016-08-23 21:56:10

标签: android listview android-scrolling

如果ListActivity有一个ListView,并且要求根据用户输入更改项目,那么进行更改的方法是什么,以便更改能够滚动?

目前,该应用程序使用来自数据库的ResourceCursorAdapter填充的Cursor。当用户长按某个项目时,该项目的ImageView会在View.VISIBLEView.GONE之间切换。此外,管理支持视图状态的数据库中的标志。

但是当该项目滚动离开屏幕,然后返回到屏幕上时,该项目将在没有最近更改的情况下显示。换句话说,如果我通过长按使ImageView可见,则显示正常。但是当我滚动远离那个项目,然后滚动回它,它就不再可见了。

我当前的解决方案(我认为错误)是保存滚动位置,从数据库刷新整个列表,然后再次定位到正确的位置。

我想有一些方法可以告诉某些Androidy事情将新的可见性状态放入其缓存中,但我找不到它。我已经尝试了setScrollingCacheEnabled(false),而其他一些缓存是错误的,但这些似乎没有任何区别。我试图弄清楚如何让Android意识到它是“脏”的,但我发现只是查询它是否isDirty()。我还尝试了ResourceCursorAdapter.notifyDataSetChanged(),这使setVisibility()调用对可见性无效。我还在不同的地方尝试了invalidate()invalidateViews()。如果以正确的顺序应用于正确的对象(在可见性被更改之前或之后),它可能是其中之一。

1 个答案:

答案 0 :(得分:0)

在ListView中覆盖getView方法并尝试使用它:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.your.layout, parent, false);
            viewHolder.img = (TextView) convertView.findViewById(R.id.img);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (condition) {
            viewHolder.img.setVisibility(VIEW.VISIBLE);
        else { 
           viewHolder.img.setVisibility(VIEW.GONE);
        }

        // Return the completed view to render on screen
        return convertView;
    }