我的主要活动中有一个列表视图,后面是textview。列表视图中包含按钮。单击列表中的按钮时,我希望在textatrea上显示一些文本。但我无法捕捉到按钮的点击。
以下是我使用过的代码。请告诉我有什么问题。 (我不想要替代解决方案,但我想知道代码中有什么问题)
public class MyFirstAppActivity extends Activity implements OnItemClickListener {
ListView listview ;
String[] array = new String[] {"Click1","Click2"};
ArrayAdapter <String> arrayadapter;
TextView textview;
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.main);
arrayadapter = new ArrayAdapter<String>(this, R.layout.button,array);
listview = (ListView)findViewById(R.id.lv_1);
listview.setAdapter(arrayadapter);
listview.setOnItemClickListener(this);
}
public void onItemClick(AdapterView<?>arg1,View v,int Position, long id){
textview = (TextView)findViewById(R.id.textview);
textview.setText("Hello, you just clicked a button"+Position);
}
}
这将活动设置为main.xml,如下所示。但是,当我单击列表中的按钮时,不会捕获单击。为什么会这样?
main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ListView android:id="@+id/lv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
<TextView android:id = "@+id/textview"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_below = "@id/lv_1"
android:text="Message about the button is displayed here">
</TextView>"
</RelativeLayout>
button.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/button" >
</Button>
答案 0 :(得分:1)
你说的是一件事并编码另一件事......
onItemClick
处理单击列表中的行,而不是按钮。
在这种情况下,按钮会从行中窃取点击,因此不会调用onItemClick。
根据您真正想要发生的事情,有两种方法可以解决这个问题。
如果您确实想要单击按钮本身而不是行,则需要覆盖适配器的getView
方法,并为按钮添加OnClickListener
。
如果您对单击该行感觉很开心(这看起来像是单击按钮,因为这是该行中的唯一内容),您需要停止按钮来窃取列表行中的点击。您可以通过在xml中的按钮上设置android:focusable="false"
和android:focusableInTouchMode="false"
来实现这一目标。
一旦你这样做,你就会有一个NPE ......
您的行布局中没有R.id.textview
,因此onItemClick
将抛出NPE,因为您的findViewById
将返回null,然后setText失败。您需要从单击的行导航到父布局,然后找到textview(如果从getView
方法执行此操作也几乎相同...
假设你坚持使用OnItemClick
方法:
public void onItemClick(AdapterView<?>arg1,View v,int Position, long id){
ListView lv = (ListView) v.getParent();
RelativeLayout rl = (RelativeLayout) lv.getParent();
textview = (TextView) rl.findViewById(R.id.textview);
textview.setText("Hello, you just clicked a button"+Position);
}
答案 1 :(得分:0)
将此代码android:descendantFocusability="blocksDescendants"
放入listview child xml。