ListView在手机和模拟器上的行为有所不同

时间:2012-08-29 13:51:37

标签: android android-emulator android-listview android-arrayadapter

我使用自定义ArrayAdapter来突出显示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 个答案:

答案 0 :(得分:1)

它适用于智能手机的事实是一个纯粹的运气。这不是为了工作。

listView.invalidate()还不够。在notifyDataSetChanged()致电后,您应该在适配器中拨打list_adapter.setSelectedPosition(position)

invalidate()只是重绘一个视图。在列表视图布局运行期间(不是绘制运行)调用适配器getView(),并在getView()更改背景。

您也可以调用listView.requestLayout()而不是listView.invalidate()。这很难看但它应该有效。