web-dev-qa-db-ja.com

Android ListViewで選択したアイテムは強調表示されたままです

XMLには2つのListViewがあり、1つは選択クエリ(lv_cli)で満たされたクライアントのリスト、もう1つは選択されたクライアントの詳細(lv_cli_det)があります。 lv_cliで詳細を表示しながら、lv_cli_detでクライアントを選択したままにします。

XML:

<ListView
    Android:id="@+id/cli_lista"
    Android:layout_width="512dp"
    Android:layout_height="wrap_content"
    Android:fadeScrollbars="false"
    >
</ListView>

<ListView
    Android:id="@+id/cli_lista_det"
    Android:layout_width="512dp"
    Android:layout_height="wrap_content"
    Android:layout_toRightOf="@+id/cli_lista"
    Android:fadeScrollbars="false" >
</ListView>

Java:

Cursor cursor = db.rawQuery("Select NrCl||';'||Nome From Clientes", null);
final ListView t = (ListView)findViewById(R.id.cli_lista);
ArrayAdapter<String> myarrayAdapter = new ArrayAdapter<String>(this, Android.R.layout.simple_expandable_list_item_1, listItems);
t.setAdapter(myarrayAdapter);

final ListView td = (ListView)findViewById(R.id.cli_lista_detalhe);
final ArrayAdapter<String> myarrayAdapter2 = new ArrayAdapter<String>(this, Android.R.layout.simple_expandable_list_item_1, listItems2);

t.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String item = ((TextView)view).getText().toString();
        String[] strArray = item.split("\\;");

        cli.load(strArray[0].toString());
        td.setAdapter(myarrayAdapter2);
        listItems2.clear();
        listItems2.add("Nome: " + cli.getNome());
        listItems2.add("Morada: " + cli.getMorada());
        listItems2.add("Localidade: " + cli.getLoca());
        listItems2.add("Código Postal: " + cli.getCp());
        listItems2.add("Pais: " + cli.getPais());
        listItems2.add("Nif: " + cli.getNif());
        listItems2.add("Tel: " + cli.getTel());
        listItems2.add("Tlm: " + cli.getTlm());
        listItems2.add("Tipo Preço: " + cli.getTipoPvn());
        listItems2.add("Cond. Pagamento: " + cli.getCpg());
        listItems2.add("Obs: " + cli.getObs());
        td.setAdapter(myarrayAdapter2);
        myarrayAdapter2.notifyDataSetChanged(); 
    }
});
74
Celta

押したときにリストビューアイテムの色を保持するには、リストビューアイテムのレイアウトに次の行を含めます。

Android:background="@drawable/bg_key"

次に、drawableフォルダーでbg_key.xmlを次のように定義します。

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item 
        Android:state_selected="true"
        Android:drawable="@color/pressed_color"/>
    <item
        Android:drawable="@color/default_color" />
</selector>

最後に、これをListViewonClickListenerに含めます。

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long arg3) {
        view.setSelected(true);
        ... // Anything
    }
});

この方法では、常に1つのアイテムのみが色選択されます。 res/values/colors.xmlで次のような値を使用して色の値を定義できます。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="pressed_color">#4d90fe</color>
    <color name="default_color">#ffffff</color>
</resources>
129
Neoh

適切な方法を見つけました。とても簡単です。リソースで次のことを説明します。

Android:choiceMode="singleChoice"
Android:listSelector="#666666"

(または、色の値の代わりにリソースリンクを指定できます)

プログラム:

listView.setSelector(Drawable selector)
listView.setSelector(int resourceId)
listView.setChoiceMode(int mode)

modeは、AbsListView.CHOICE_MODE_SINGLE、AbsListView.CHOICE_MODE_MULTIPLE、AbsListView.CHOICE_MODE_NONE(デフォルト)のいずれかです。

(AbsListViewはListViewクラスの抽象祖先です)

追伸onItemClickを使用した操作やビューの背景の変更は、ビュー自体が一時的なオブジェクトであるため破産します。したがって、ビューを追跡しないでください。

リストが十分に長い場合、スクロールアウトされたアイテムに関連付けられているビューは階層から削除され、それらのアイテムが再び表示されるときに再作成されます(背景などのキャッシュされた表示オプションを使用)。したがって、追跡したビューはアイテムの実際のビューではなく、背景を変更しても実際のアイテムビューには何も影響しません。その結果、複数のアイテムが選択されています。

159
AJG
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            for (int j = 0; j < adapterView.getChildCount(); j++)
                adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

            // change the background color of the selected element
            view.setBackgroundColor(Color.LTGRAY);
});

おそらく、インデックスiを使用して、現在選択されている要素をグローバル変数に保存することができます。

36
Chris623

単純な方法は、xmlでリストビューを使用している場合、リストビューでこの属性を使用し、

Android:choiceMode="singleChoice"
Android:listSelector="#your color code"

xmlを使用しない場合、プログラムで

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(Android.R.color.holo_blue_light);
13
Ashana.Jackol

次のようなセレクターが必要です。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
<item Android:drawable="@color/app_primary_color_light" Android:state_pressed="true" />

<!-- Used when the view is "activated". -->
<item Android:drawable="@color/app_primary_color" Android:state_activated="true" />

<!-- Default, "just hangin' out" state. -->
<item Android:drawable="@Android:color/transparent" /></selector>

そして、Android:choiceMode="singleChoice"をListViewに設定します。

4

Avinash Kumar Pankajの例から

View v;

次にoncreateメソッドで

v = new View(getActivity());

そして、私が書いたonlistitemclickメソッド

public void onListItemClick(ListView listView, View view, int position,
       long id) {
   v.setBackgroundResource(0);
   view.setBackgroundResource(R.color.green);
   v = view;
}

それは私のために働いた。ありがとうございました。

交換しました

v = new View(getActivity());

v = new View(this);

そして、コードはうまくいきました。

前の例のXMLファイル「colors」と「bg_key」、およびListView属性Android:background = "@ drawable/bg_key"も必要です。

マウロ

2
Mauro Simoes

*リストビューコンテナのルートレイアウトにリップルがないことを確認してください

この行をリストビューに追加します

Android:listSelector="@drawable/background_listview"

これは「background_listview.xml」ファイルです

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/white_background" Android:state_pressed="true" />
<item Android:drawable="@color/primary_color" Android:state_focused="false" /></selector>

background_listview.xmlファイルで使用されている色:

<color name="primary_color">#cc7e00</color>
<color name="white_background">#ffffffff</color>

これらの後

(クリックしたアイテムには、別のアイテムをクリックするまでオレンジ色が含まれています)

2
ShahinFasihi

これを行う1つの方法は、アクティビティで現在選択されている位置を追跡することです。

@Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {
        currentPosition = position
        lv_cli.notifyDataSetChanged();
    }

ここで、リストアイテムの親レイアウト(linearLayout、boxLayout、relativeLayoutなど)にIDを割り当ててください。

その後、リストビューで次のようなことができます:

layoutBackground = (LinearLayout) convertView.findViewById(R.id.layout_background);

if (YourActivity.this.currentPosition == position) {
    layoutBackground.setBackgroundColor(YourActivity.this.getResources().getColor(R.color.hilight_color));
} else{
    layoutBackground.setBackgroundResource(R.drawable.list_item_drawable);
}

基本的に、現在の選択した位置と同じ場合、ハイライトの色を背景としてレイアウトに設定するだけです。アイテムが選択されていないときに描画可能な背景リソースを設定する方法に注目してください。あなたの場合、これは異なる可能性があります(コードを投稿していないため)。私の場合、このドロウアブルはセレクターであり、これを押すとアイテムがハイライト表示されます。

注:この単純なコードはビューホルダーを使用しませんが、使用することをお勧めします。

代わりにIDを使用します。

これは、リストが長い場合でも処理できる最も簡単な方法です。

public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Holder holder=new Holder();
    View rowView;
    rowView = inflater.inflate(R.layout.list_item, null);
    //Handle your items.
    //StringHolder.mSelectedItem is a public static variable.
    if(getItemId(position)==StringHolder.mSelectedItem){
        rowView.setBackgroundColor(Color.LTGRAY);

    }else{
        rowView.setBackgroundColor(Color.TRANSPARENT);
    }
    return rowView;
}

そして、onclicklistenerで:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1);
            catagoryAdapter.notifyDataSetChanged();
.....
0
Wasiun A. Khan