Android ListView 선택한 항목이 강조 표시됨
하나는 선택 쿼리 ( )로 채워진 클라이언트 목록이 있고 다른 하나는 선택한 클라이언트의 세부 정보 ( ) 가있는 XML
두 개의를 가지고 있습니다 . 세부 사항을 보여주는 동안 클라이언트를 계속 선택하고 싶습니다 .ListView
lv_cli
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();
}
});
목록보기 항목을 누를 때 색상을 유지하려면 목록보기 항목 레이아웃에 다음 행을 포함하십시오.
android:background="@drawable/bg_key"
그리고 정의 bg_key.xml
에 drawable
이 같은 폴더 :
<?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
}
});
이렇게하면 한 번에 하나의 항목 만 색상이 선택됩니다. 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을 사용한 PS 조작 및보기 배경 변경은 파산입니다. 따라서 뷰를 추적해서는 안됩니다.
목록이 충분히 길면 스크롤 된 항목과 관련된보기가 계층 구조에서 제거되고 해당 항목이 다시 표시 될 때 다시 생성됩니다 (백그라운드와 같은 캐시 된 표시 옵션 사용). 따라서 추적 한보기는 이제 항목의 실제보기가 아니며 배경을 변경해도 실제 항목보기에는 영향을주지 않습니다. 결과적으로 우리는 여러 항목을 선택했습니다.
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에서 listview를 사용하는 경우 listview에서이 속성을 사용하는 것입니다.
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"도 필요합니다.
마우로
* 목록보기 컨테이너의 루트 레이아웃에 Ripple이 없는지 확인하십시오.
이 줄을 목록보기에 추가
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>
이 후
(클릭 한 항목은 다른 항목을 클릭 할 때까지 주황색으로 표시됩니다.)
One way you can do this, is to Keep track of the current selected position in your activity:
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
currentPosition = position
lv_cli.notifyDataSetChanged();
}
Now, be sure you assign an ID to the parent layout (linearLayout, boxLayout, relativeLayout, .. Whatever you prefer) of your list item.
Then in your ListView you can do something Like this:
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);
}
Basically, you just set the hilight color to the layout as a background when it equals your current selected position. Notice how I set a drawable background resource when the item is not selected. This could be in your case different (since you posted no code). In my case, this drawable is a selector which makes sure the item is hi-lighted when pressed.
NOTE: This simple code doesn't use a view-holder, but I really recommend using one.
Use the id instead:
This is the easiest method that can handle even if the list is long:
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;
}
And then in your 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();
.....
참고URL : https://stackoverflow.com/questions/16189651/android-listview-selected-item-stay-highlighted
'IT박스' 카테고리의 다른 글
PHP 변환 날짜 형식 dd / mm / yyyy => yyyy-mm-dd (0) | 2020.10.20 |
---|---|
컬렉션을 채울 때 쿼리에서 반환되지 않도록 Mongoose / MongoDB의 암호 필드를 보호하는 방법은 무엇입니까? (0) | 2020.10.20 |
플래시 기반 웹 사이트가 왜 그렇게 나쁜가요? (0) | 2020.10.20 |
Console.WriteLine을 사용하여 열의 텍스트를 어떻게 정렬 할 수 있습니까? (0) | 2020.10.20 |
ASP.NET MVC 4는 들어오는 모든 요청을 가로 챕니다. (0) | 2020.10.19 |