簡體   English   中英

具有實時傳感器更新的android listview

[英]android listview with real-time sensor updates

我正在開發一個顯示列表視圖中某些位置的應用程序。 在每個listview項目中都有一個指向該地方的箭頭(酒店,酒吧等)。

問題是我不知道如何有效地更新此箭頭,而無需在本地兌換視圖(根據Google I / O視頻,這是我永遠不應該做的事情)。

需要在每個手機方向傳感器事件上更新箭頭,該事件是每秒多次。

那么有沒有比在每個事件上調用notifyDataSetChanged()並重新編譯每個列表項數據更好的方法?

更新 (對於@dharan和任何感興趣的人):

我已經停止了這個項目,因為我現在有一份全職工作,但我想到了一個解決方案(未實現/未經測試)。

首先將旋轉角度限制為固定步長(例如:5,10,15,20,... 355,360)然后緩存每個旋轉角度的旋轉圖像,以避免昂貴的圖像旋轉計算(但是在更高的內存成本)。

之后我會讓我的getView()方法知道何時只更新圖像而不是所有數據。 就我而言,這很簡單:

public View getView(int position, View convertView, ViewGroup parent) {
     if (convertView != null && place[position].id == (Integer)convertView.getTag()){
         //the place information is already set correctly so just update the image
     }
     ...
}

經過這些修改后,我認為調用notifyDataSetChanged()不應該導致嚴重的性能問題。

如果ListView中沒有太多項目,您可以轉換為使用普通的LinearLayout並單獨控制這些項目。 但是,LinearLayout的問題是,如果某個項目的大小發生變化,那么所有內容(即所有子項)都必須被中繼。 因此,觸發一個項目的更改也可以重新觸發其他布局。 現在,因為你正在更換羅盤針,你可以繞過它,因為這不應該導致每一行改變它的整體尺寸。 你只需要重新繪制該項目。

另一個選擇是編寫自己的布局,采取一些捷徑,做出一些假設,通用布局管理器不能。 我可能會關注的最后一件事是notifyDataSetChanged()做了什么。 您可以擴展ListView並編寫一個只重繪已更改行的方法(當然這假設行的高度沒有改變)。 如果行高度發生變化,那么該行之后的所有內容都必須被中繼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM