![](/img/trans.png)
[英]Android ListView : changing dataset and calling notifyDataSetChanged inside of getView
[英]notifyDataSetChanged() is canceling changing setColor in ListView
與主題一樣,當我在已更改的單元格中使用adapter.notifyDataSetChanged()
文本顏色時,將設置回默認值。 我不知道為什么會這樣,我把改變顏色的方法放在這里:
for(int l=0;l<list.size();l++){
System.out. println("kolorujemy! "+ list.size() );
LinearLayout root = (LinearLayout) getViewByPosition(l,listView);
((TextView) root.findViewById(R.id.wartosc_calosci)).setTextColor(Color.YELLOW);
我還要補充一點,這部分代碼在其他線程中處於循環中,因為單元格的值每 30 秒更新一次。 這是 getViewByPosition 方法:
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount();
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition+1;
return listView.getChildAt(childIndex);
}
}
獲取視圖:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListViewHolder listViewHolder;
if(convertView == null){
listViewHolder = new ListViewHolder();
convertView = activity.getLayoutInflater().inflate(R.layout.lista_wlasnych_spolek, null);
listViewHolder.txtFirst = (TextView) convertView.findViewById(R.id.nazwa_spolki);
listViewHolder.txtSecond = (TextView) convertView.findViewById(R.id.wartosc_akt);
listViewHolder.txtThird = (TextView) convertView.findViewById(R.id.wartosc_kupna);
listViewHolder.txtFourth = (TextView) convertView.findViewById(R.id.wartosc_calosci);
convertView.setTag(listViewHolder);
} else {
listViewHolder = (ListViewHolder) convertView.getTag();
}
首先這一行return listView.getAdapter().getView(pos, null, listView);
沒有任何意義,因為通過手動調用,您將始終在內部為列表視圖創建和膨脹新行,但此視圖從未在您的ListView
。 看到你總是傳遞第二個參數convertView
null 所以在內部這個方法將創建新視圖但這個視圖永遠不會在你的ListView
。 Tip 1. 不要自己調用getView()
方法
您可能知道,當您正確使用ViewHolder
模式時, ListView
在內存中存儲的行/視圖僅與它們在屏幕上可見的行數/視圖一樣多。
因此,現在您正在為可見的每一行設置顏色,甚至為ListView
中真正不存在的那些不可見的行設置顏色。
提示 2.對任何行進行着色或更改任何內容的最佳方法是在getView()
方法實現中執行此操作,具體取決於您的適配器項狀態。 不要從外面做,因為它看起來像是某種黑客或錯誤的架構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.