0

我做了我的自定義ArrayAdapter來突出顯示ListView的選定項目。 的代碼如下:ListView在手機和模擬器上的行爲不同

public class HeroListViewAdapter extends ArrayAdapter<Hero> { 

public static int NO_POS = -1; 

private List<Hero> heroes; 
private int selected_pos = NO_POS; 

public HeroListViewAdapter(Context context, List<Hero> heroes){ 
    super(context, R.layout.hero_list_item_view, heroes); 
    this.heroes = heroes; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false); 
    if(position == selected_pos){ 
     rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color))); 
    } 
    return rowView; 
} 

public void setSelectedPosition(int selected_pos){ 
    this.selected_pos = selected_pos; 
} 

public int getSelectedPosition(){ 
    return selected_pos; 
} 

public Hero getSelectedHero(){ 
    if(selected_pos>=0 && selected_pos<heroes.size()) 
     return this.getItem(selected_pos); 
    else 
     return null; 
} 

} 

其中所述方法修改的內部構件以跟蹤所選擇的位置和所述getView方法,以便通過改變他的背景來突出項測試此內部構件的值。東西以下列方式使用:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
    list_adapter.setSelectedPosition(position); 
    listView.invalidate(); 
} 
}); 

現在...一切工作正常,我的2.2.1 Froyo(級別API 8)智能手機預期。但是當我點擊一個項目後,模擬器上的應用程序(級別API 16)不會改變。 所以問題是:這是一個API問題(和向後兼容?)或一個模擬器?我是否必須擔心該應用程序可能無法在我的其他設備上按預期工作。

回答

1

它在智能手機上工作的事實是純粹的運氣。這不是爲了工作。

listView.invalidate()僅僅是不夠的。在撥打list_adapter.setSelectedPosition(position)後,您應該在您的適配器中撥打notifyDataSetChanged()

invalidate()只是重繪視圖。在列表視圖佈局運行期間調用適配器的getView()(不是繪製運行),並且在getView()處更改背景。

此外,您可以調用listView.requestLayout()而不是listView.invalidate()。這是醜陋的,但它應該工作。

+0

是啊謝謝你的答案...我只是想通了... notifyDataSetChanged的作品! –

相關問題