如果ListActivity
有一个ListView
,并且要求根据用户输入更改项目,那么进行更改的方法是什么,以便更改能够滚动?
目前,该应用程序使用来自数据库的ResourceCursorAdapter
填充的Cursor
。当用户长按某个项目时,该项目的ImageView
会在View.VISIBLE
和View.GONE
之间切换。此外,管理支持视图状态的数据库中的标志。
但是当该项目滚动离开屏幕,然后返回到屏幕上时,该项目将在没有最近更改的情况下显示。换句话说,如果我通过长按使ImageView
可见,则显示正常。但是当我滚动远离那个项目,然后滚动回它,它就不再可见了。
我当前的解决方案(我认为错误)是保存滚动位置,从数据库刷新整个列表,然后再次定位到正确的位置。
我想有一些方法可以告诉某些Androidy事情将新的可见性状态放入其缓存中,但我找不到它。我已经尝试了setScrollingCacheEnabled(false)
,而其他一些缓存是错误的,但这些似乎没有任何区别。我试图弄清楚如何让Android意识到它是“脏”的,但我发现只是查询它是否isDirty()
。我还尝试了ResourceCursorAdapter.notifyDataSetChanged()
,这使setVisibility()
调用对可见性无效。我还在不同的地方尝试了invalidate()
和invalidateViews()
。如果以正确的顺序应用于正确的对象(在可见性被更改之前或之后),它可能是其中之一。
答案 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;
}