自定义ListView在Android中不工作的项目单击事件

自定义ListView在Android中不工作的项目单击事件,android,listview,android-listview,Android,Listview,Android Listview,我们正在处理一个项目,其中有一个自定义listview和一个baseadapter。我们正在尝试获取listview的item click事件。我在活动中的item click listener中粘贴了一个toast,但它没有显示。下面是我完成的代码 question_list is the ListView Object. question_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

我们正在处理一个项目,其中有一个自定义listview和一个baseadapter。我们正在尝试获取listview的item click事件。我在活动中的item click listener中粘贴了一个toast,但它没有显示。下面是我完成的代码

question_list is the ListView Object.

question_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               // TextView example = (TextView) view.findViewById(R.id.single_question_name);
              //  String a=example.getText().toString();
                Toast.makeText(MainActivity.this,"jo", Toast.LENGTH_LONG).show();
            }
        });
问题列表是ListView对象。
问题列表.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//TextView示例=(TextView)view.findViewById(R.id.single\u question\u name);
//字符串a=example.getText().toString();
Toast.makeText(MainActivity.this,“jo”,Toast.LENGTH_LONG.show();
}
});
listview的数据是动态添加的。我们在baseadapter中使用了两种动态布局进行膨胀。baseadapter中的代码如下:

public class QuestionAdapter extends BaseAdapter {
    ArrayList<QuestionsDataModel>  question_list_array;
    List<OptionsDataModel> option_list;
    Context context;
    LayoutInflater inflater;
    SingleHolder sh;
    int k=0,l=0;
    View v_single=null,v_multiple=null,v_final=null;
    MultipleHolder mh;
    int number_of_options;
    int position_counter=0;
    public  static  final  int TYPE_HEADER=0;
    public  static  final  int TYPE_ROW=1;
    public QuestionAdapter(ArrayList<QuestionsDataModel> question_list_array, Context context) {
        this.question_list_array=question_list_array;
        this.context=context;
        inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        return question_list_array.size();
    }

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

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

   @Override
    public int getViewTypeCount()
    {
        return 2;

    }

    @Override
    public int getItemViewType(int position) {
        return (question_list_array.get(position).getQuestion_type().equals("single"))?TYPE_HEADER :TYPE_ROW;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String question_type = question_list_array.get(position).getQuestion_type();
        option_list = question_list_array.get(position).option_list;
        number_of_options = option_list.size();

        if (question_type.equals("single"))
        {
            v_single=convertView;
            if (v_single == null)
            {
                v_single = inflater.inflate(R.layout.single_choice_layout, null);
                sh = new SingleHolder();
                sh.single_question_name = (TextView) v_single.findViewById(R.id.single_question_name);
                sh.single_radiogroup = (RadioGroup) v_single.findViewById(R.id.single_radiogroup);
                v_single.setTag(sh);
            }
            else
            {
                sh = (SingleHolder) v_single.getTag();
            }
            sh.single_radiogroup.clearCheck();
            sh.single_radiogroup.removeAllViews();
            sh.single_question_name.setText(question_list_array.get(position).getQuestion_name());
            for (int j = 0; j < number_of_options; j++)
            {
                RadioButton rb = new RadioButton(context);
                rb.setText(option_list.get(j).getOption_name());
                sh.single_radiogroup.addView(rb);
            }

           v_final=v_single;
        }



      else if(question_type.equals("multiple"))
        {

            v_multiple = convertView;
            if (v_multiple == null) {
                v_multiple = inflater.inflate(R.layout.multiple_choice_layout, null);
                mh = new MultipleHolder();
                mh.multiple_question_name = (TextView) v_multiple.findViewById(R.id.multiple_question_name);
                mh.ll_multiple = (LinearLayout) v_multiple.findViewById(R.id.ll_multiple);
                mh.ll_choice_child= (LinearLayout) v_multiple.findViewById(R.id.ll_choice_child);
                v_multiple.setTag(mh);

            } else {
                mh = (MultipleHolder) v_multiple.getTag();
            }
            mh.multiple_question_name.setText(question_list_array.get(position).getQuestion_name());
            mh.ll_choice_child.removeAllViews();
                for (int m = 0; m < number_of_options; m++)
                {
                    CheckBox c = new CheckBox(context);
                    c.setText(option_list.get(m).getOption_name());
                    mh.ll_choice_child.addView(c);
                }


            //return v;
            v_final=v_multiple;

        }
        return v_final;
    }



    private   class SingleHolder
    {
        TextView single_question_name;
        RadioGroup single_radiogroup;

    }
    private  class MultipleHolder
    {
        TextView multiple_question_name;
        LinearLayout ll_multiple;
        LinearLayout ll_choice_child;
    }
}
公共类QuestionAdapter扩展了BaseAdapter{
数组列表问题列表数组;
列表选项\u列表;
语境;
充气机;
单持有人sh;
int k=0,l=0;
视图v_single=null,v_multiple=null,v_final=null;
多弹头mh;
整数-选项的个数;
int位置_计数器=0;
公共静态final int TYPE_头=0;
公共静态最终整型_行=1;
公共问题适配器(数组列表问题列表数组,上下文){
这个.question\u list\u数组=question\u list\u数组;
this.context=context;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
@凌驾
public int getCount(){
返回问题列表数组.size();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置)
{
返回0;
}
@凌驾
public int getViewTypeCount()
{
返回2;
}
@凌驾
public int getItemViewType(int位置){
返回(问题列表数组.get(position).getQuestion类型().equals(“single”))?类型标题:类型行;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
字符串question_type=question_list_array.get(position.getQuestion_type();
选项列表=问题列表数组。获取(位置)。选项列表;
选项的数量=选项列表。大小();
如果(问题类型等于(“单一”))
{
v_single=转换视图;
if(v_single==null)
{
v_single=充气机。充气(R.layout.single_choice_layout,null);
sh=新的单支架();
sh.single\u question\u name=(TextView)v\u single.findviewbyd(R.id.single\u question\u name);
sh.single\u radiogroup=(radiogroup)v\u single.findViewById(R.id.single\u radiogroup);
v_单个设置标签(sh);
}
其他的
{
sh=(SingleHolder)v_single.getTag();
}
sh.single_radiogroup.clearCheck();
sh.single_radiogroup.removeallview();
sh.single_question_name.setText(question_list_array.get(position.getQuestion_name());
对于(int j=0;j
编辑: 我已添加了单项xml文件:

single_choice_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical"
   >
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/single_question_name"
      />
    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/single_radiogroup"
        android:orientation="vertical"></RadioGroup>


</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/ll_multiple"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/multiple_question_name"
        android:text="second question"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/ll_choice_child"
        android:orientation="vertical"></LinearLayout>
</LinearLayout>

multiple_choice_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical"
   >
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/single_question_name"
      />
    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/single_radiogroup"
        android:orientation="vertical"></RadioGroup>


</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/ll_multiple"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/multiple_question_name"
        android:text="second question"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/ll_choice_child"
        android:orientation="vertical"></LinearLayout>
</LinearLayout>


尝试在onCreate()方法中定义ClickListener。

尝试在onCreate()方法中定义ClickListener。

您必须返回BaseAdapter的
getItem
方法中的
列表视图的项的位置

 @Override
    public QuestionsDataModel getItem(int position) {
        return question_list_array.get(position);
    }

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

您必须返回baseAdapter的
getItem
方法中
Listview
项的位置

 @Override
    public QuestionsDataModel getItem(int position) {
        return question_list_array.get(position);
    }

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

发布列表项xml,可能是焦点问题。问题的可能重复是,listView中有其他焦点视图(我猜是因为适配器代码)。您必须设置listView项的属性android:DegenantFocusability=“BlocksDescents”才能获得listView上的click事件。@SanjeetAjnabee我已将android:Focusability属性设置为