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

我做了我的自定义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问题(和向后兼容?)或一个模拟器?我是否必须担心该应用程序可能无法在我的其他设备上按预期工作。

回答:

它在智能手机上工作的事实是纯粹的运气。这不是为了工作。

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

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

此外,您可以调用listView.requestLayout()而不是listView.invalidate()。这是丑陋的,但它应该工作。

以上是 ListView在手机和模拟器上的行为不同 的全部内容, 来源链接: utcz.com/qa/266344.html

回到顶部