2010-09-24 43 views
4

我有以下非常簡單的使用ListView的測試程序。我創建一個ListView並將其設置爲內容視圖。我設置了一個提供行的ListAdapter。有30行,每行包含一個LinearLayout ViewGroup。在該ViewGroup中,我放置了一個TextView和一個Button。當我運行該程序時,我發現我無法選擇列表中的行。但是,我可以滾動列表並單擊按鈕。使用Android,如何從包含按鈕控件的ListView中選擇行

如果我從LinearLayout中刪除按鈕(以便它只包含TextView),那麼我可以選擇列表中的行。我想 喜歡能夠在我單獨的行視圖上有按鈕,並且仍然能夠選擇列表中的行。在另一個論壇上,有人說這是可能的,但我對如何實現這一目標感到不知所措。

任何人都可以給我一個線索嗎?

謝謝。

public class ListViewTest extends Activity implements ListAdapter 
{ 
int m_count; 
DataSetObserver m_observer; 

public ListViewTest() 
{ 
    m_count = 30; 
    m_observer = null; 
} 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     ListView lv = new ListView(this); 
     lv.setAdapter(this); 
     lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     setContentView(lv); 
    } 

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

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 

@Override 
public int getCount() 
{ 
    return m_count; 
} 

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

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

@Override 
public int getItemViewType(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LinearLayout vg = new LinearLayout(this); 

    TextView tv = new TextView(this); 
    tv.setText("ListItem"); 

    Button bv = new Button(this); 
    bv.setText("Button"); 

    vg.addView(tv); 
    vg.addView(bv); 

    return(vg); 
} 

@Override 
public int getViewTypeCount() { 
    return 1; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isEmpty() { 
    return false; 
} 

@Override 
public void registerDataSetObserver(DataSetObserver observer) 
{ 
    m_observer = observer; 
} 

@Override 
public void unregisterDataSetObserver(DataSetObserver observer) { 

} 
} 
+0

這個問題已經出現了很多次。例如,請參閱http://stackoverflow.com/questions/3611551/textview-and-button-in-each-row-and-onlistitemclick/3611898#3611898。 – 2010-09-24 19:08:16

回答

5

正如其他答案指出的那樣,您是否可以自己選擇ListView行作爲完整項取決於這些行是否包含可聚焦項目。但是,解決方案通常不會在您的按鈕或類似設置上設置focusable = false。這將阻止您的應用程序通過d-pad,軌跡球,箭頭鍵或您有什麼可導航。

您希望您的列表項能夠控制自己的焦點屬性。你想要setItemsCanFocus。這將禁用ListView通常用來將列表項目作爲單個單元處理的特殊焦點/選擇處理。

現在,您可以在用作行的頂層元素的佈局上設置偵聽器,設置可繪製的有狀態背景以顯示焦點/按下狀態,以及focusLeft/Right屬性以控制焦點移動在項目本身內。

+0

感謝您的幫助 – 2010-09-25 14:39:03

+0

非常歡迎! :) – adamp 2010-09-25 16:01:18

+0

偉大的解決方案。需要更多的工作,而不是簡單地將焦點設置爲假,但像一個魅力。 – sven 2010-10-17 11:53:27

相關問題