0

ListViewの選択したアイテムを強調表示するために、カスタムArrayAdapterを実行しました。コードは次のとおりです。

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.1Froyo(レベルAPI 8)スマートフォンで意図したとおりにすべてが正常に機能します。ただし、アイテムをクリックしてもエミュレーター(レベルAPI 16)でアプリケーションを実行しても、背景は変わりません。したがって、問題は次のとおりです。これはAPIの問題(および下位互換性?)ですか、それともエミュレーターの問題ですか?私以外のデバイスでは、アプリケーションが意図したとおりに動作しない可能性があることを心配する必要がありますか?

4

1 に答える 1

1

スマートフォンで動作するという事実は純粋な運です。これは機能することを意図したものではありません。

listView.invalidate()だけでは十分ではありません。notifyDataSetChanged()呼び出し後にアダプターを呼び出す必要がありますlist_adapter.setSelectedPosition(position)

invalidate()ビューを再描画するだけです。アダプターgetView()は、リスト ビュー レイアウトの実行中に呼び出され (描画の実行ではありません)、getView()背景を変更する場所です。

また、listView.invalidate() の代わりに listView.requestLayout() を呼び出すこともできます。醜いですが、うまくいくはずです。

于 2012-08-29T14:31:11.253 に答える