77

私はXML2 つの を持ってい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>

ジャワ:

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(); 
    }
});
4

9 に答える 9

136

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

android:background="@drawable/bg_key"

次に、次のようにフォルダーに定義bg_key.xmldrawableます。

<?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>

最後に、これを に含めますListView onClickListener:

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>
于 2013-04-24T10:59:33.893 に答える
38
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 を使用して、現在選択されている要素をグローバル変数に保存したい場合があります。

于 2013-11-26T10:23:22.610 に答える
5

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

<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に設定します。

于 2014-11-18T10:20:35.057 に答える
1

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

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

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

次に、ListView で次のようなことができます。

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);
}

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

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

于 2013-04-24T11:02:26.073 に答える