2016-08-23 183 views
0

给定ListActivityListView以及根据用户输入更改项目的要求,如何进行更改以使更改能够继续滚动?Android:更新ListView中滚动的项目

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

但是,当该项目滚动屏幕,然后回到屏幕上,该项目表示没有最近的变化。换句话说,如果我通过长时间点击使ImageView可见,它就会显示正常。但是当我从那个项目滚动时,然后回滚到它,它不再可见。

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

我想有一些方法可以告诉一些Androidy的东西把新的可见性状态放入它的缓存中,但我找不到它。我试过setScrollingCacheEnabled(false),还有一些其他的缓存是错误的,但这些都没有什么区别。我试图找出如何让Android意识到这是'肮脏',但我发现只是查询它是否isDirty()。我也尝试了ResourceCursorAdapter.notifyDataSetChanged(),并且这使得setVisibility()调用对可见性无效。我也在各个地方试过invalidate()invalidateViews()。如果以正确的顺序(在更改可视性之前或之后)将其应用于正确的对象,这可能是其中的一种。 ListView中

+1

你改变任何行时数据用户长点击?您应该更改数据模型,以便下一次根据新的Data模型类进行充气。 ... – Kushal

+0

“ListView”功能的首选方法现在是“RecylcerView”。这里的答案包含管理列表的一些细节,该列表管理用户首选方法实现的列表中用户更改的数据:http://stackoverflow.com/a/40568269/897007 – Dale

回答

0

覆盖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; 
    } 
+0

感谢您的建议,但我不知道如何因为我目前通过从扩展ListActivity的类中调用getListView()来获得我的'ListView'。这让我产生了一个问题,我可以重写'ListActivity'提供的'ListView'。 – Dale

+1

您确定需要使用ListActivity?只需扩展AppCompatActivity并将ListView添加到内容即可。 – mayosk

+1

@Dale:在Adapter类中覆盖'getView()'而不是在'ListView'子类中 – Kushal