2013-11-01 5 views
11

Ich bin ziemlich neu in der Android-Programmierung und habe versucht, eine einfache erweiterbare Listenansicht zu implementieren, die eine Liste von Kursen zeigt, die beim Klicken zusätzliche Details anzeigen sollen. Ich habe das Gefühl, dass das Problem sehr einfach ist, da ich in den Ansichten nichts Besonderes finde, aber ich konnte immer noch keine Lösung online finden, die meisten anderen Fragen sind viel spezifischer.Android ExpandableListView nicht erweiterbar/nicht anklickbar

Der erste Teil funktioniert gut (Anzeige der Liste der Kurse), das Problem ist, dass die Liste nicht anklickbar ist, was bedeutet, dass es nicht erweitert wird.

, was ich jetzt festgestellt habe, ist die folgende:
1. die getChildView nie genannt werden (Debugger hört nie auf Breakpoint)
2. gibt es Daten für die Kinder, da es die gleichen Daten sind, die für das groupheading verwendet werden das funktioniert gut.

Ich habe auch versucht, einen onGroupClickListener zu setzen, der nie aufgerufen wurde, also habe ich es wieder entfernt.

mein Code:

Gruppe Überschrift Layout:

<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 Layout:

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

Aktivität Layout:

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

Adapter 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; 
    } 

} 

Aktivität 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); 
    } 

} 

Vielen Dank im Voraus!

EDIT: ich fand es zufällig. Das Kontrollkästchen innerhalb des Groupheaders war fokussierbar und stehlte alle Klicks von der Liste weg. Um dieses Problem zu lösen, setzen Sie einfach das fokussierbare Attribut der Checkbox/Schaltfläche in Ihrer Liste auf false.

Antwort

42

Ich habe es zufällig gefunden. Das Kontrollkästchen innerhalb des Groupheaders war fokussierbar und stehlte alle Klicks von der Liste weg. Um dieses Problem zu lösen, setzen Sie einfach das fokussierbare Attribut des Kontrollkästchens/der Schaltfläche in Ihrer Liste auf "Falsch":

checkbox.setFocusable (false); in Java oder android: fokussierbarem = „false“

+3

Fantastisch !!!, Sie haben meine Zeit gerettet. –

+0

Vielen Dank +1 :) – semih

+0

Sie haben meine Zeit gerettet. Danke –

0

ich das gleiche Problem konfrontiert war, aber was hinzugefügt ich die unterhalb der Linie meiner Eltern Ansicht

android:descendantFocusability="blocksDescendants" 

und es funktionierte für mich.