2016-12-26 23 views
0

我使用一個異步任務,我要改變每行的顏色兩次,如何從異步任務更改列表視圖行的顏色?

1.I想在開始我的長期運行的任務之前,更改行的顏色

2.我想在完成長時間運行任務後更改行的顏色

1.and 2.都來自doinBackground。

這是我的適配器:

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,al); 
    listView.setAdapter(arrayAdapter); 

這是我的異步任務

class AT extends AsyncTask<List<String>,Void,Void>{ 

    @Override 
    protected Void doInBackground(List<String>... list) { 

     for(int i=0;i<n;i++){ 
    //iterating my list , so that for every item of my list,i am performing my long running task and changing the color of rach row 

       final int t=i; 
     //trying to change the associate row color before starting my task   
      handler.post(new Runnable() { 
       @Override 
       public void run(){ 
       Log.d("sri","listView.performItemClick;"); 
       listView.performItemClick(listView.getAdapter().getView(t,null,listView),t,t); 
       }}); 


      try { 
       Thread.sleep(5000); 
       Log.d("TAG","doInBackground =====> Thread.sleep(5000);"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      //my long running task would be here 

      try { 
       Thread.sleep(3000); 
       Log.d("sri","doInBackground =====> Thread.sleep(3000);"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     //trying to change the associate row color after completing my task   
      handler.post(new Runnable() { 
       @Override 
       public void run(){ 
       Log.d("sri","listView.performItemClick;"); 
       listView.performItemClick(listView.getAdapter().getView(t,null,listView),t,t); 
       }}); 


     } 

     return null; 
    }} 

這是onItemClick代碼:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      Log.d("TAG","onItemClick --> pos is " + i + "-->id is " + l); 

      view.setBackgroundColor(Color.parseColor("#1234ab")); 
      //adapterView.getChildAt(i-adapterView.getFirstVisiblePosition()).setBackgroundColor(Color.BLUE); 

      Log.d("TAG","onItemClick --> pos is " + i + "-->id is " + l); 
     } 
    }); 

我的問題是

* listView.performItemClick調用OnItemClick代碼*(和變量POS和id是正確的),但 view.setBackgroundColor(Color.parseColor( 「#1234ab」));沒有效果,所以顏色不變。

+0

不要從AsyncTask更新ListView UI。更新適配器中的數據並讓適配器相應地設置背景 –

回答

0

試試這個:

listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adpterView, View view, int position, 
       long id) { 
        listView.getChildAt(i).setBackgroundColor(Color.BLUE);  
      } 
     } 
    }); 
+0

listView.getChildAt(i)返回null ... – adi

0

你不能像這樣做,只要用戶滾動更改將丟失。你可以做的是將項目標記爲在數組中選中,並將notifydatasetChanged選中,然後在適配器中進行檢查,或者簡單的選擇可以將項目設置爲選擇,如此處所述(https://stackoverflow.com/a/10791326/2418640)。

相關問題