Android可扩展列表视图无法展开/不可点击。

14
我刚开始学习安卓编程,尝试实现一个基本的可扩展列表视图,展示一些课程,并在点击后显示更多详细信息。我感觉问题非常基础,因为我在任何视图中都没有包含任何花哨的东西,但我仍然在网上找不到解决方法,大多数其他问题都更具体。第一部分很好用(显示课程列表),问题是列表无法点击,也就是说它没有展开。我现在确定的是:
1.getChildView从未被调用(调试器从未停在断点处)
2.有子数据,因为与工作正常的组标题使用的是相同的数据。
我还尝试设置onGroupClickListener,但从未被调用,所以我将其删除了。我的代码:
组标题布局:
    <TextView
        android:id="@+id/CourseName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="bottom"
        android:text="CourseName"
        android:layout_weight="7"
        android:layout_marginRight="25dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />


    <TextView
        android:id="@+id/CourseDate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="bottom"
        android:layout_weight="3"
        android:text="CourseDate" />


    <CheckBox
        android:id="@+id/checkBox"
        style="?android:attr/starStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

子行布局:

<?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="wrap_content"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/button1"
        android:text="Button" />

    <TextView
        android:id="@+id/phases"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:layout_below="@+id/button1"
        android:text="phases:" />

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/phases"
        android:gravity="center"
        android:text="information:" />

</RelativeLayout>

活动布局:

<?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" >

    <TextView
        android:id="@+id/sportName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:text="Sport Name"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="@dimen/profile_title" />

    <RatingBar
        android:id="@+id/ratingBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:numStars="5"
        android:stepSize="1"
        android:layout_centerInParent="true" />

    <ExpandableListView
        android:id="@+id/expandableListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/sportName" >
    </ExpandableListView>

</RelativeLayout>

Java适配器:

package ch.unibe.unisportbern.views.details;

import java.util.ArrayList;

import com.example.unisportbern.R;

import ch.unibe.unisportbern.support.Course;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class SportsAdapter extends BaseExpandableListAdapter  {
    private Context context;
    private ArrayList<Course> courseList;



    public SportsAdapter(Context context, ArrayList<Course> courseList) {
        this.context = context;
        this.courseList = courseList;
    }



    @Override
    public Object getChild(int index, int stub) {
        return courseList.get(index);
    }

    @Override
    public long getChildId(int index, int stub) {
        return stub;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

        if (convertView == null){
            LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               convertView = inflater.inflate(R.layout.child_row, null);
        }

        TextView phases = (TextView) convertView.findViewById(R.id.phases);
        TextView info = (TextView) convertView.findViewById(R.id.info);

        phases.setText("phases:\n" + courseList.get(groupPosition).getPhases());
        info.setText(courseList.get(groupPosition).getInformation());

        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return 1;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return courseList.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return courseList.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return courseList.get(groupPosition).getId();
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        if (convertView == null) {
               LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               convertView = inf.inflate(R.layout.group_heading, null);
              }

        TextView courseName = (TextView) convertView.findViewById(R.id.CourseName);
        TextView courseDate = (TextView) convertView.findViewById(R.id.CourseDate);

        courseName.setText(courseList.get(groupPosition).getName());
        courseDate.setText(courseList.get(groupPosition).getDay() + courseList.get(groupPosition).getTime());

        return convertView;
    }

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

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}

Java中的活动:

package ch.unibe.unisportbern.views.details;

import java.util.ArrayList;

import com.example.unisportbern.R;

import ch.unibe.unisportbern.support.Course;
import ch.unibe.unisportbern.support.DBMethodes;
import ch.unibe.unisportbern.support.Sport;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ExpandableListView;

public class DActivity extends Activity{


    public final static String NAME = "SportName";
    public final static String ID = "SportID";

    private Sport sport;
    private ArrayList<Course> courses;
    private SportsAdapter sportsadapter;

    private ExpandableListView myList;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        getSport();
        getCourses();

        setContentView(R.layout.details_layout);

        myList = (ExpandableListView) findViewById(R.id.expandableListView);
        sportsadapter = new SportsAdapter(this, courses);
        myList.setAdapter(sportsadapter);
    }

    private void getCourses() {
        DBMethodes dbMethodes = new DBMethodes(this);
        try {
            courses = dbMethodes.getAllCourses(sport);
        } catch (Exception e) {
        }
    }

    private void getSport() {
        Intent intent = this.getIntent();
        int id = intent.getIntExtra(ID, 0);
        String name = intent.getStringExtra(NAME);
        this.sport = new Sport(id, name);
    }

}

事先非常感谢!

编辑: 我偶然发现,组标题内的复选框是可聚焦的,会夺走列表所有的点击事件。为解决此问题,请将列表中的复选框/按钮的focusable属性设置为false。

2个回答

44

我偶然发现了它。组标题内的复选框可以获得焦点,从列表中窃取所有的点击事件。解决这个问题很简单,只需通过以下方法将列表中的复选框/按钮的 focusable 属性设置为 false:

Java中:

checkbox.setFocusable(false);

或者,在XML中:

android:focusable="false"

你节省了我的时间。谢谢。 - Eslam Sameh Ahmed
你真是个救命恩人。我浪费了大约5个小时,重新实现了三次listview。 - Vivek Mishra
由于某些原因,android:focusable="false" 没有生效,但是 setFocusable(false); 却奏效了。谢谢。 - TastyCatFood

1
我遇到了同样的问题,但我在父视图中添加了以下行:
android:descendantFocusability="blocksDescendants"

它对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接