2014-12-22 114 views
0

我正在從自定義ArrayAdapter調用的Async類中檢索一些數據。當我添加一條新評論時,我更新了評論文本視圖並且工作正常,但是在我重新加載整個列表後,更新不再出現。我可以在logcat中看到有新的評論nr,但不在UI上。從ListView更新TextView android行

不應該這樣:answersListView.invalidateViews夠嗎?我試圖從列表視圖中更新該單行,以避免一段時間後未更新註釋nr的問題。

private void updateView(int index) { 
     System.out.println("index: " + index); 
     View v = answersListView.getChildAt(index - answersListView.getFirstVisiblePosition()); 

     if (v == null) 
      return; 

     final TextView nrComments = (TextView) v.findViewById(com.dub.mobile.R.id.showCommentsTxt); 
     if (nrComments != null) { 
      if (nrComments.getText().toString().trim().length() == 0) { 
       // first comment 
       nrComments.setText("1 comments"); 
      } else { 
       // comments exist already 
       int newNr = Integer.parseInt(nrComments.getText().toString().trim() 
         .substring(0, nrComments.getText().toString().trim().indexOf("comments")).trim()) + 1; 
       nrComments.setText(newNr + " comments"); 
      } 
      System.out.println("final nr of comments: " + nrComments.getText()); 
      nrComments.setVisibility(View.VISIBLE); 
     } 

     answersListView.getAdapter().getView(position, v, answersListView); 
     v.setBackgroundColor(Color.GREEN); 

     answersListView.invalidateViews(); 
    } 

和:

updateView(position); 
adapter.notifyDataSetChanged(); 
+0

您是否在更新listview適配器後使用notifyDataSetChanged()? – Rohit5k2

+0

是的,現在更新了問題。 –

+0

你應該在'updateView(position)' – Rohit5k2

回答

1

答案是幾乎什麼@Rami在你的問題中留言說。你不直接更新視圖,你只需要更新數據。在您的適配器中,您重寫getView方法,在這裏進行所有更改,您不需要updateViews方法。 讓我試着解釋它是如何工作的。

  1. ListView中使用一個適配器。
  2. List視圖使用getView方法詢問適配器「給我X視圖中的視圖」。
  3. 適配器創建該視圖,返回到ListView,並顯示所顯示的內容。
  4. 適配器本身應該包含一個帶有要顯示的數據的列表。
  5. 這些意見(行)創建和銷燬每次在屏幕的這些觀點將變得可見或不可見,或者如果調用notifyDataSetChanged方法。

    因此,現在的問題是,如果您更改了適配器的位置5中的對象,並使用新數據列出其他對象,那麼下次ListView請求適配器向我提供視圖在位置5中,適配器將使用新數據創建視圖(行)。而已。

0

那不是你如何在列表視圖更改數據的項目。您必須使用一些字符串數組來填充適配器的getView函數中textview中的數據。您只需要更改該數組,然後在適配器上調用notifydatasetchanged。視圖由適配器回收,因此以上沒有意義

getView(...) { TextView tv = new TextView(context); tv.setText(myData [index]); //你需要改變的myData數組內容 }

+0

自定義適配器擴展了ArrayAdapter,但使用自定義對象不僅僅是一個簡單的字符串。我正在使用來自對象的數據來更新列表視圖行中的一些元素。你上面說的是正確的,我在適配器中使用它。 –

+1

是的,請僅更改自定義對象內容,並調用notifydatasetchagned。讓我知道如果它的作品 –

+0

嘗試。謝謝。 –

1

你需要在UI線程來更新數據。 如果您在異步類的使用有背景

runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //update here 
      } 
     }); 

android.os.Handler handler = new android.os.Handler(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       //update here 
      } 
     });