2011-03-09 5 views
11

나는 간단한 ListView을 가지고 있으며, 나는 그것들 각각이 사용자의 터치에 강조 표시되기를 원한다. 나는 이것이 디폴트로 일어나야한다고 생각했으나 그렇지 않다. 조언 해 줄 수 있니?터치시 ListView 항목을 강조 표시하는 방법?

의 ListView XML :

<ListView 
    android:id="@+id/list_view"  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:divider="#206600" 
    android:dividerHeight="2dp" 
    android:smoothScrollbar="true" 
    android:background="#ffffff" 
    > 
</ListView> 

그리고 내 어댑터의 코드 :

private class MyAdapter extends ArrayAdapter<Task> { 
     private LayoutInflater mInflater; 

     public MyAdapter(Context context, int resource, List<Task> list) { 
      super(context, resource, list); 
      mInflater = LayoutInflater.from(context); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      if (v == null) { 
       v = mInflater.inflate(R.layout.list_item, null); 
      } 

      Task task = taskList.get(position); 

      /* Setup views from your layout using data in Object here */ 

      return v; 
     } 

답변

23

실제 행 레이아웃 코드를 게시 할 수도 있지만 목록 행에 배경색을 설정하는 것이 좋습니다. 기본적으로 선택기는 목록 항목 뒤에 그려집니다 (하이라이트 색상이 텍스트 뒤에 있으므로보기가 좋습니다). 목록 항목에 배경색을 설정하지 않거나 ListView의 drawSelectorOnTop XML 속성 대신 상단에 선택기를 그리도록 설정하십시오.

편집 : 기본 상태에 대해 실제로 불투명 한 배경이 있어야하고 drawSelectorOnTop을 사용하지 않으려면 다음을 시도해보십시오. 목록 행에 배경을 설정하고 StateListDrawable을 사용하여 모두에 대해 @android:drawable/list_selector_background을 사용하십시오. 하지만 기본 상태 (이것에 대한 드로어 블 폴더에 xml 파일을 정의 할 수 있습니다 : StateList documentation 참조).

또한 배경이 @android:drawable/list_selector_background으로 설정된 외부 배경 행 레이아웃 내부에 레이아웃을 중첩 할 수 있습니다. 그런 식으로 배경이 배경 위에 그려 지지만 내용 아래에 그려집니다.

+0

또한 기본 질문에 대한 오해가 있습니까? 눌러 진 상태에 대해 이야기하고 있습니까, 아니면 터치 및 취소 후에도 선택 상태를 유지하고 싶습니까 (이 경우 RivieraKid의 대답이 더 적절합니까)? –

+0

백그라운드를 제거해도 변경되지 않았으므로 선택 사항을 볼 수있었습니다. 감사합니다. – Eugene

1

나는 이것이 ListAdapter의 항목의 "사용"속성과 관련이있다 생각합니다.

@Override 
public boolean areAllItemsEnabled() { 
    return true; 
} 

그런 다음 각 항목 (건드리지에 강조해야하므로 등)을 클릭해야한다 : 당신의 어댑터는 코드가 포함 된 경우

.

이 목록에 사용중인 어댑터 종류에 대한 세부 정보 (및 코드)를 게시 할 수 있습니까?

+0

아니요, 도움이되지 않았습니다. 나는 Adapter에 대한 코드를 추가했다. – Eugene

+1

흠, 자매 메서드 isEnabled (int position)가 있습니다. getView() 메소드 내부에 호출을 추가하고 디버거를 통해 단계별로 실행하면 Enabled가 아닌 항목이 문제인지 확인할 수 있습니다. – Cephron

2

ListView은 터치 모드에서 초점 (또는 선택)을 시각적으로 표시하지 않습니다. 하드웨어 키보드 나 컨트롤을 사용하여 UI를 탐색 할 때만이 정보가 표시됩니다.

자세한 내용은 Google Touch Mode Android 블로그 기사를 참조하십시오.

터치 모드 만 사용하는 경우 ListView에 포커스 나 선택 항목이 표시되지 않습니다.

0

나는 며칠 동안 고생했다. 결국 Checkable 인터페이스를 지원하는 위젯을 만들어 어댑터의 getiew() 함수에서 해당 위젯/뷰를 반환해야합니다. listview는 UI에서 선택한 선택 사항을 추적하기 위해 ListView.CHOICE_MODE_SINGLE (또는 android:choiceMode으로 지정된 다른 모든 모드)에 있어야합니다.

그래서 본질적으로, 다음의 모든 요구 사항리스트 뷰 항목에 대한 장소로가 강조 숙박 :

  1. ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  2. ListAdapter.getView() 반환 Checkable 인터페이스
  3. ListView.OnItemClickListenersetItemChecked(position, true)를 호출해야합니다 구현하는보기 검사 할 항목을 표시하십시오 (따라서 목록보기에서 강조 표시하십시오)

희망이 있기 때문에 이것으로 어려움을 겪고있는 누군가를 도울 수 있기를 바랍니다.

관련 문제