2013-11-01 55 views
11

我很新的android編程,並試圖實現一個基本的可擴展列表視圖顯示一個課程列表,它應該顯示一些額外的細節,當點擊。我覺得問題是非常基本的,因爲我沒有在任何觀點中包含任何幻想,但我仍然無法在網上找到解決方案,其他大多數問題都更具體。Android ExpandableListView不展開/不可點擊

第一部分工作正常(顯示課程列表),問題是該列表不可點擊,這意味着它不會展開。

我已經確定,現在是這樣的:
1. getChildView沒有被調用(調試器從來沒有在斷點處停止)
2.有針對兒童的數據,因爲它是一個的用於groupheading相同的數據這工作正常。

我也嘗試設置從未調用的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> 

child_row佈局:

<?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); 
    } 

} 

感謝很多提前!編輯: 我發現它是偶然的。 groupheader內部的複選框是可調焦的,從列表中竊取所有點擊。要解決此問題,只需將列表中的複選框/按鈕的可調焦屬性設置爲false即可。

回答

42

我偶然發現它。 groupheader內部的複選框是可調焦的,從列表中竊取所有點擊。要解決此問題,只需將列表中的複選框/按鈕的可聚焦屬性設置爲false即可:

checkbox.setFocusable(false);在Java中,或 機器人:可調焦=「假」

+3

太棒了!,你救了我的時間。 –

+0

謝謝+1 :) – semih

+0

您節省了我的時間。謝謝 –

0

我面臨同樣的問題,但我加了下面一行到我父視圖

android:descendantFocusability="blocksDescendants" 

和它的工作對我來說是什麼。