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();
}
});
押したときにリストビューアイテムの色を保持するには、リストビューアイテムのレイアウトに次の行を含めます。
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>
最後に、これを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>
適切な方法を見つけました。とても簡単です。リソースで次のことを説明します。
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を使用した操作やビューの背景の変更は、ビュー自体が一時的なオブジェクトであるため破産します。したがって、ビューを追跡しないでください。
リストが十分に長い場合、スクロールアウトされたアイテムに関連付けられているビューは階層から削除され、それらのアイテムが再び表示されるときに再作成されます(背景などのキャッシュされた表示オプションを使用)。したがって、追跡したビューはアイテムの実際のビューではなく、背景を変更しても実際のアイテムビューには何も影響しません。その結果、複数のアイテムが選択されています。
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を使用して、現在選択されている要素をグローバル変数に保存することができます。
単純な方法は、xmlでリストビューを使用している場合、リストビューでこの属性を使用し、
Android:choiceMode="singleChoice"
Android:listSelector="#your color code"
xmlを使用しない場合、プログラムで
listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
listview.setSelector(Android.R.color.holo_blue_light);
次のようなセレクターが必要です。
<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に設定します。
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"も必要です。
マウロ
*リストビューコンテナのルートレイアウトにリップルがないことを確認してください
この行をリストビューに追加します
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>
これらの後
(クリックしたアイテムには、別のアイテムをクリックするまでオレンジ色が含まれています)
これを行う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();
.....