2011-12-12 23 views
1

我通過使用基本適配器來擴展列表視圖在列表視圖中,它們是兩個小部件Textview和Edittext。當任何UI元素的行被觸摸時突出顯示列表視圖行

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

感謝吉姆這是爲我工作。我有四個視圖裏面的列表視圖3是Textview和1是Edittext。 Listener設置在Textview上,顏色正在改變但是當我點擊Edittext時,顏色不會改變。編輯文本上的監聽器未設置。 –

+1

發生這種情況是因爲EditText捕獲觸摸事件並執行它自己的操作(如顯示鍵盤等)。如果你想禁止在EditText中輸入文本,只需執行'setClickable(false)'。如果你想離開文本輸入的可能性,請點擊EditText.setOnFocusChanged()' - 並在那裏標記孔列表項。 – Jin35

+0

感謝Jim,你能解釋一下我必須做些什麼來設置List視圖的編輯文本上的點擊監聽器。以便我的問題得到解決。我不理解我有3文本視圖,當我點擊其中任何一個監聽器正在設置,但當我點擊編輯文本什麼都不會發生 –

1

那麼,它的簡單。這是我如何做到的。

首先,您需要兩張圖像來顯示ListView項目的高亮和正常狀態。然後你需要爲你的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,對於這樣一個奇妙的解釋。我正在擴展活動,這就是爲什麼他們的任何替代方案都是@Override protected void onListItemClick方法,以及您爲列表視圖設置單擊監聽器的位置。 –

相關問題