簡體   English   中英

notifyDataSetChanged() 正在取消更改 ListView 中的 setColor

[英]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.

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