2013-11-01 3 views
11

sono abbastanza nuovo per la programmazione Android e ho provato a implementare una listview espandibile di base che mostra un elenco di corsi che dovrebbero mostrare alcuni dettagli aggiuntivi quando si fa clic. sento che il problema è molto semplice in quanto non includo niente di particolare in nessuna delle visualizzazioni, ma non riesco ancora a trovare una soluzione online, la maggior parte delle altre domande è molto più specifica.Android ExpandableListView non si espande/non è selezionabile

La prima parte funziona correttamente (visualizzando l'elenco dei corsi), il problema è che l'elenco non è selezionabile, il che significa che non si espande.

quello che ho deciso in questo momento è la seguente:
1. la getChildView non viene mai chiamato (debugger non si ferma mai al punto di interruzione)
2. c'è dati per i bambini in quanto è lo stesso di dati che viene utilizzato per la groupheading che funziona bene.

Ho anche provato a impostare un onGroupClickListener che non è mai stato chiamato, quindi l'ho rimosso di nuovo.

il mio codice:

Gruppo voce Layout: il 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: il 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> 

attività:

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

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

} 

attività 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); 
    } 

} 

Grazie mille in anticipo!

MODIFICA: l'ho trovato per caso. la casella di controllo all'interno del groupheader era focalizzabile, rubando tutti i clic dall'elenco. per risolvere questo problema è sufficiente impostare l'attributo focalizzabile della casella di controllo/pulsante nell'elenco su false.

risposta

42

L'ho trovato per caso. la casella di controllo all'interno del groupheader era focalizzabile, rubando tutti i clic dall'elenco. per risolvere questo problema è sufficiente impostare l'attributo focusable della casella di controllo/pulsante nell'elenco su false con:

checkbox.setFocusable (false); in java, o Android: attivabile = "false"

+3

Fantastico !!!, mi hai salvato il tempo. –

+0

Grazie +1 :) – semih

+0

Hai salvato il mio tempo. Grazie –

0

stavo affrontando lo stesso problema, ma quello che ho aggiunto la riga sotto alla mia vista primaria

android:descendantFocusability="blocksDescendants" 

e ha funzionato per me.