2017-09-01 94 views
1

我使用SimpleAdapter填充ListView。這樣做後,我有一個函數,試圖循環子視圖以編程方式設置其背景顏色。問題是在調用listView.setAdapter()之後,ListView可能沒有任何兒童。我不知道是哪個回調來粘貼我的功能。Android ListView適配器「填充」回調

 // A HashMap to store the values for the ListView rows 
    List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>(); 

    for (int i = 0; i < steps.length; i++) { 
     HashMap<String, String> hm = new HashMap<String, String>(); 
     hm.put("txt", steps[i]); 
     hm.put("icon", Integer.toString(step_images[i])); 
     aList.add(hm); 
    } 

    // Keys used in Hashmap 
    String[] from = {"icon", "txt"}; 

    // Ids of views in layout 
    int[] to = {R.id.icon, R.id.txt}; 

    // Instantiating an adapter to store each items 
    // R.layout.listview_steps defines the layout of each item 
    SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), aList, R.layout.listview_steps, from, to); 

    // Setting the adapter to the listView 
    listView.setAdapter(adapter); 



    //fixme after the listView adapter is set, the listView may not have any children immediately. 
    //I'm not sure which callback to use to properly call refreshStepsListView().. So I'm hacking it and I just wait 250ms 
    (new Handler()) 
      .postDelayed(
        new Runnable() { 
         public void run() { 
          refreshStepsListView(); 
         } 
        }, 250); 
+1

你需要在適配器上實現getView –

回答

1

不需要回調。不要住在一起

public class ColoredAdapter extends SimpleAdapter { 

    ColoredAdapter(...) { 
     super(context, list, reslayout, from, to); 
    } 

    getView(...) { 
     // set colors here 
    } 

或者你可以創建一個Step類,而不是一個HashMap的名單,加上使用ArrayAdapter<Step>

+0

謝謝!這應該工作。顏色由另一個模型中的狀態標誌驅動,但我會解決這個問題。我是Android新手。一般來說,我需要花更多的時間在適配器上。 – voodoodrul

0

做你的轉接器內你的背景色工作。您可以簡單地擴展SimpleAdapter,並在創建視圖時訪問視圖。在適配器中,您期望執行任何視圖操作邏輯。

不建議對子代進行迭代,並且會導致錯誤,不可維護的代碼和糟糕的性能。

public class ColorAdapter extends SimpleAdapter { 

    public ColorAdapter(Context context, 
         List<? extends Map<String, ?>> data, 
         int resource, 
         String[] from, 
         int[] to) { 

     super(context, data, resource, from, to); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 
     view.setBackgroundColor(Color.RED); 
     return view; 
    } 
} 
1

從我的理解。你只是想改變列表視圖中每個項目的背景。

首先,定義適配器的類項目。

public class Item { 
     private String mTitle; 
     private String mBackgroundColor; 

     public void setTittle(String title){ 
     this.mTitle = title; 
     } 

     public void setBackgroundColor(int color){ 
     this.mBackgroundColor= color; 
     } 

     public void getTitle(){ 
     return this.mTitle; 
     } 


     public void getBackgroundColor(){ 
     return this.mBackgroundColor; 
     } 
    } 

然後使用ArrayAdapter代替SimpleAdapter 見這個樣本Here

確保裏面你ArrayAdapter,您已設置項目的背景顏色的getView()item.getBackgroundColor()

itemView.setBackgroundResource(item.getBackgroundColor()); 

當你想改變背景顏色,您可以將新顏色設置爲item.setBackgroundColor(newColor)並致電adapter.notifyDataSetChanged()刷新適配器。

+0

確實。這基本上是我去的方式,它運作良好。 – voodoodrul

+0

很高興聽到:) –