2016-08-23 121 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