0

我的主要活动中有一个列表视图,后面是一个文本视图。列表视图中包含按钮。当单击列表中的按钮时,我希望一些文本出现在 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,如下所示。但是当我点击列表中的按钮时,点击不会被捕获。为什么会这样?

主.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>

按钮.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>
4

2 回答 2

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);       
    } 
于 2012-10-13T13:26:56.993 回答
0

将此代码android:descendantFocusability="blocksDescendants"放在 listview 子 xml 中。

于 2012-10-13T12:23:55.967 回答