2011-12-12 2 views
1

베이스 어댑터를 사용하여 목록 뷰를 부 풀리고 있습니다 Listview 내부에는 두 개의 위젯 Textview 및 Edittext가 있습니다.UI 요소 중 하나가 터치되었을 때 Listview 행 강조 표시

Listview가 적절하게 팽창했으며 또한 표시됩니다. 우리의 요구 사항은 행이 색 또는 강조 표시되어야하는 행 중 하나를 클릭했을 때입니다. 사용자가 강조 표시된 다른 행을 클릭했을 때 이전 행 색상이 정상이됩니다.

답변

1

그 터치 된 뷰에서이 요청 초점을 수행하는 가장 좋은 방법은, 어댑터이 재정 방식의 getView을 할 :

 @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      <prepare or create view here> 
      convertView.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        convertView.requestFocus(); 
       } 
      }); 
      return convertView; 
     } 

를 다른 상태에 대해 서로 다른 색상을 제공하기 위해 당신이 selector 배경을 사용할 수 있습니다 의지.

+0

감사합니다. Jim It 's Work for me. 나는 4 개의 전망이있다 Listview 3 안은 Textview이고 1은 Edittext이다. Listener가 Textview에 설정되고 색상이 변경됩니다. 그러나 Edittext를 클릭하면 색상이 변경되지 않습니다. 편집 텍스트의 수신기가 설정되어 있지 않습니다. –

+1

이것은'EditText'가 터치 이벤트를 잡아 자신의 행동 (예 : 키보드 쇼 등)을하기 때문에 발생합니다. EditText에서 텍스트를 입력하지 못하게하려면'setClickable (false)'를 수행하십시오. 텍스트 입력의 가능성을 남기고 싶다면'EditText.setOnFocusChanged()'를 놓고 그곳에서 선택된 것과 같이 구멍 목록 항목을 표시하십시오. – Jin35

+0

감사합니다. 짐, 목록보기의 편집 텍스트에서 클릭 리스너를 설정하기 위해해야 ​​할 일을 설명해 주시겠습니까? 그래서 내 문제가 해결됩니다. 나는 그들 중 하나를 클릭 할 때 3 개의 텍스트보기를 가지고있는 것을 이해하지 못한다. 청취자가 설정되어 있지만 편집 텍스트를 클릭 할 때 아무 일도 일어나지 않을 것이다. –

1

음, 간단합니다. 여기 내가 어떻게하는지.

먼저 ListView Item의 하이라이트 및 정상 상태를 표시하기 위해 두 개의 이미지가 필요합니다. 그런 다음 ListView에 사용자 정의 행을 사용해야합니다. TextView가 들어 있다고 가정 해 봅시다.

활동에 정수 변수를 유지하십시오. 이 정수는 ListView의 선택된 인덱스를 유지합니다. 처음에는 -1 값을 지정하십시오.

이제 사용자 정의 어댑터를 사용할 때 getView()에서 int 변수 == postition인지 여부를 확인할 수 있습니다. 동일하면 TextView의 배경을 강조 표시로 설정하고, 그렇지 않으면 일반으로 설정하십시오. 그리고 OnListItemClick()을 재정의하십시오. 이 경우 해당 int 변수의 위치를 ​​저장하고 notifyDataSetChanged()를 호출하십시오. 다음은 이에 대한 샘플 코드입니다.

public class MySampleActivity extends ListActivity 
{ 
    ArrayList<String> lst_string = new ArrayList<String>(); 
    int selected_item = -1; 
    MyListAdapter adptr; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     lst_string.add("item 1"); 
     lst_string.add("item 2"); 
     lst_string.add("item 3"); 
     lst_string.add("item 4"); 
     lst_string.add("item 5"); 
     lst_string.add("item 6"); 
     lst_string.add("item 7"); 
     lst_string.add("item 8"); 
     lst_string.add("item 9"); 

     adptr = new MyListAdapter(); 
     setListAdapter(adptr); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
     selected_item = position; 
     adptr.notifyDataSetChanged(); 
    } 

    private class MyListAdapter extends BaseAdapter 
    { 
     @Override 
     public int getCount() 
     { 
      return lst_string.size(); 
     } 

     @Override 
     public Object getItem(int position) 
     { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) 
     { 
      return position; 
     } 

     private LayoutInflater mInflater; 

     public MyListAdapter() 
     { 
      mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null; 
      if (convertView == null) 
      { 
       convertView = mInflater.inflate(R.layout.list_row, null); 
       holder = new ViewHolder(); 
       holder.textView = (TextView)convertView.findViewById(R.id.tv_row); 
       convertView.setTag(holder); 
      } 
      else 
      { 
       holder = (ViewHolder)convertView.getTag(); 
      } 
      holder.textView.setText(lst_string.get(position)); 
      if(selected_item == position) 
      { 
       holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_selected)); 
      } 
      else 
      { 
       holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_normal)); 
      } 
      return convertView; 
     } 
    } 

    public static class ViewHolder 
    { 
     public TextView textView; 
    } 
} 
+0

감사합니다. Khawar, 그런 wonderfull 설명. Activity를 확장하여 @Override protected void onListItemClick 메서드와 목록 뷰의 On click 수신기를 설정하는 이유가 무엇인지 설명합니다. –

관련 문제