如何在android中的自定义列表视图的子视图上进行单击事件

时间:2012-09-03 07:15:54

标签: android android-layout android-widget android-listview textview

基本上我是Android新手,对此并不了解。我正在制作一个测验计划,其中我使用自定义ListView和5个自定义TextViews,一个用于提问,另外4个用于选项。我的问题是我希望TextView可点击以及LisView作为选择模式作为单一。也就是说,如果我单击一个文本,则所有其他TextView应该变为不可点击。我的问题是每当我点击子布局中的TextView时,只有外部布局,即ListView的项目被选中。 这是我的listview的截图

https://picasaweb.google.com/108429569548433380582/Android?authkey=Gv1sRgCJ3kxJz7tLvaTg#5783846428648608706

5 个答案:

答案 0 :(得分:1)

您可以通过两种方式实现:

1。直接使用onClickListener,如下所示:

textView.setOnClickListener(new View.OnClickListener(
        public void onClick(View arg0) {

            // Do anything here.

        }
    });

OR

2。XML文件中,在<TextView />声明中添加一个属性:

android:onClick="onClickTextView"

在你的活动中,添加这个功能:

public void onClickTextView(View view) {

         // Do anything here.
}

<强>更新

使用以下代码在TextView上获取点击事件:

// Click event for single list row
        getListView().setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                TextView tv = (TextView) (findViewById(R.id.title));
                if (tv != null) {
                    tv.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Toast.makeText(MainActivity.this, "CLICKED",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                } else {
                    Toast.makeText(MainActivity.this, "TV not found",
                            Toast.LENGTH_LONG).show();
                }
            }
        });

答案 1 :(得分:0)

假设您扩展BaseAdapter以设置列表视图内容 - &gt;

打开当前持有人位置的TextView监听器和settag,并在onclick方法中执行操作。

答案 2 :(得分:0)

试试这个:

当您选择一个文本视图时,其他三个将无法点击

    final TextView texta = (TextView) findViewById(R.id.text_a);
    final TextView textb = (TextView) findViewById(R.id.text_b);
    final TextView textc = (TextView) findViewById(R.id.text_c);
    final TextView textd = (TextView) findViewById(R.id.text_d);
    texta.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v) {

            textb.setClickable(false);
            textc.setClickable(false);
            textd.setClickable(false);
        }

    });
    textb.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v) {

            texta.setClickable(false);
            textc.setClickable(false);
            textd.setClickable(false);
        }

    });
    textc.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v) {

            texta.setClickable(false);
            textb.setClickable(false);
            textd.setClickable(false);
        }

    });
    textd.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v) {

            texta.setClickable(false);
            textb.setClickable(false);
            textc.setClickable(false);
        }

    });

答案 3 :(得分:0)

这是ListView的默认行为。只有一个可以点击:列表行或行内的项目。

  

例如:如果行项是textView(如您的情况),则列表行将是可单击的,但如果行项是按钮,则列表行将不可单击。如果将TextView设置为可单击,则情况相同。

根据您的要求,更好的方法是使用RadioGroup(而不是多个文本视图并禁用和启用它们)。 您应该为列表项使用自定义布局,其中包含TextView for question和RadioGroup for options。

布局可能是这样的:
enter image description here

请点击以下链接以供参考: listView
RadioGroup

我希望这会有所帮助

答案 4 :(得分:0)

感谢Shrikant和adam的帮助对不起,我为很晚的回复而道歉。

在适配器类中使用它,如Shrikant:

textViewa.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do anything here.
        }
    });

    textViewb.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
            // Do anything here.
        }
    });

    //and so on...

    // or better to use ViewHolder holder; for these type of listviews;

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // Do what you want to do.

            // for my i have to call a method in my parent activity. so in    constructor of adapter, I passed the activity and then typecasted it like

            ParentActivity parent = (ParentActivity) activity;
            parent.chosenAnswer(view.getId());

            // then in chosenAnswer(int id) in parentActivity use a switch case for the same logic as in Adam's answer.

            // OR 
            //you can write like this too..

            switch (view.getId()) {
                case R.id.textViewa:
                    break;
                case R.id.textViewb:
                    break;
                case R.id.textViewc:
                    break;
                case R.id.textViewd:
                    break;
            }
        }
    };