2012-02-02 61 views
6

我想在父列表中只做一个项目,一次展开,我的onCreate代码当前是下面的代码。 (它的工作原理,因为我想,但该方法只允许一位家长在时间不工作打开)Android中的ExpandableLists,我想只允许一个父列表一次展开

public void onCreate(Bundle savedInstanceState) { 
     try{ 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

     final SimpleExpandableListAdapter expListAdapter = 
      new SimpleExpandableListAdapter(
         //FOR LEVEL 1 SCREEN 
        this, 
        createGroupList(),    // METHOD TO CREATE PARENTLIST Creating group List. 
        R.layout.group_row,    // REF TO XML FILENAME.   
        new String[] { "Group Item" }, // STRING ARRAY HOLDING ONE KEY THAT REF'S ALL PARENT LIST ITEMS. 
        new int[] { R.id.row_name }, // REF TO I.D. OF PARENT XML. ID of each group item.-Data under the key goes into this TextView.      
        createChildList(),    // METHOD TO CREATE CHILD LST. childData describes second-level entries. 
        R.layout.child_row,    // XMLFILE NAME FOR CHILD LIST.Layout for sub-level entries(second level). 
        new String[] {"Sub Item"},  // KEY FOR CHILD ITEMS IN HASHMAP. Keys in childData maps to display. 
        new int[] { R.id.grp_child}  // XML ID FOR TEXTVIEW. Data under the keys above go into these TextViews. 
       ); 
      setListAdapter(expListAdapter);  // setting the adapter in the list. 

     //**THIS IS WHAT I DONT KNOW HOW TO CODE:** 


      list = (ExpandableListView) findViewById(R.id.row_name); 
      list.setAdapter(expListAdapter); 
      list.setGroupIndicator(null); 


      list.setOnGroupExpandListener(new OnGroupExpandListener() { 

       public void onGroupExpand(int groupPosition) { 
        int len = expListAdapter.getGroupCount(); 
        for (int i = 0; i < len; i++) { 
         if (i != groupPosition) { 
          list.collapseGroup(i); 
         } 
        } 
       } 
      }); 

     }catch(Exception e){ 

      System.out.println("Errrr +++ " + e.getMessage()); 
     } 
    } 

我明白了上面的代码,但是,我不使用expandableListViews,林refferncing我的计划,我的.XML文件与可扩展列表的布局。所以,我不知道如何将上述适用于我的计划......

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<ExpandableListView android:id="@+id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@drawable/bkg"/> 

    <TextView android:id="@+id/android:empty" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:text="No items"/> 
</LinearLayout> 

,我不知道如何运用的方法如下:

    list = (ExpandableListView) findViewById(R.id.row_name); 
      list.setAdapter(expListAdapter); 
      list.setGroupIndicator(null); 

      list.setOnGroupExpandListener(new OnGroupExpandListener() { 
        public void onGroupExpand(int groupPosition) { 
        int len = expListAdapter.getGroupCount(); 
        for (int i = 0; i < len; i++) { 
         if (i != groupPosition) { 
          list.collapseGroup(i); 
         } 
        } 
       } 
      }); 

1)我如何将“列表”重新引用到我的expandablelist活动中?

列表中的类定义为private ExpandableListView list;

我没有任何错误的权利,但该方法是行不通的。

任何帮助,非常感谢!

+0

我仍然停留在这之后.. – user1180937 2012-02-06 17:34:47

+0

请问有没有什么办法,我可以碰到这到列表的顶部? – user1180937 2012-02-08 15:16:54

+0

你可以在下面的链接找到解决方案: - http://stackoverflow.com/questions/4314777/programmatically-collapse-a-group-in-expandablelistview – 2012-11-27 07:51:22

回答

1

该问题已通过创建一个名为list的公共explist变量,然后通过以下调用将其引用到适配器中来解决。

list = getExpandableListView(); 

之前的展开方法导致应用程序崩溃。在引用list.collapsegroup之后,它工作正常。

public void onGroupExpand(int groupPosition) { 
        System.out.println("GROUP LISTENER WORKS?"); 
        if(adptr=="expListAdapter"){ 
         int len = expListAdapter.getGroupCount(); 
         //System.out.println(len); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 

        } 
        else if(adptr=="expListAdapter2"){ 
         int len = expListAdapter2.getGroupCount(); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 
         //System.out.println(len); 
        } 
        else if(adptr=="expListAdapter3"){ 
         int len = expListAdapter3.getGroupCount(); 
         for (int i = 0; i < len; i++) { 
          if (i != groupPosition) { 
          list.collapseGroup(i); 
          } 
         } 

        } 
      } 
3

我相信一个简单的解决办法是实现一个适配器来处理任何你感兴趣的事件。

public class MyExpandableListAdapter extends SimpleExpandableListAdapter { 

    public Activity mActivity; 

    public MyExpandableListAdapter([ARGS USED IN QUESTION], Activity activity) {super([ARGS USED IN QUESTIONS]); mActivity = activity; } 

    // then just override the method 
    public void onGroupExpanded(int groupPosition) { 
    int len = super.getGroupCount(); 
    ExpandableListView list = (ExpandableListView) mActivity.findViewById(R.id.list); 
    for (int i = 0; i < len; i++) { 
     if (i != groupPosition) { 
      list.collapseGroup(i); 
     } 
    } 
    } 
} 

通过分离列表适配器插入另一个类,你就不会弄乱具有一次性侦听器实现的活动代码。相反,在每个活动简单地初始化适配器和更新的解决方案

mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 
    // Keep track of previous expanded parent 
    int previousGroup = -1; 

    @Override 
    public void onGroupExpand(int groupPosition) { 
     // Collapse previous parent if expanded. 
     if ((previousGroup != -1) && (groupPosition != previousGroup)) { 
      mExpandableList.collapseGroup(previousGroup); 
     } 
     previousGroup = groupPosition; 
    } 
}); 
+0

我会建议不采用这种方法,因为它限制了可重用性并导致适配器与活动和布局之间不必要的紧密耦合。我会提出一个基于听众的解决方案(如Itam的回答) – Makibo 2014-06-23 03:18:25

18
// Declare variable 
private static int prev = -1; 
// and OnGroupExpandListener implement 


mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       if(prev!=-1) 
       { 

        mExpandableList.collapseGroup(prev);  

       } 
       prev=groupPosition; 
      } 
     }); 

更新: 所以您可以重新打开同一组

// Listview Group expanded listener 
    expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      if (prevouriousExpandedGroupNumber != -1 && prevouriousExpandedGroupNumber != groupPosition) { 
       expListView.collapseGroup(prevouriousExpandedGroupNumber); 
      } 
      prevouriousExpandedGroupNumber = groupPosition; 
     } 
    }); 
+6

将检查“prev!= - 1”更改为“prev!= - 1 && prev!= groupPosition”,或者无法按顺序扩展组。 – 2013-05-28 09:48:38

+0

或者你可以添加一个OnGroupCollapseListener并设置prev = -1。 – JWqvist 2014-08-02 16:35:28

0
@Override 
    public void onGroupExpanded(int groupPosition) { 
     super.onGroupExpanded(groupPosition); 
     int len = getGroupCount(); 

     for (int i = 0; i < len; i++) { 
      if (i != groupPosition) { 
       expListView.collapseGroup(i); 
      } 
     } 
    } 
0

从IRAM修改答案设置就行了

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // No try catch needed 
    MyExpandableListAdapter mAdapter = new MyExpandableListAdapter([ARGS SHOWN IN QUESTION], MainActivity.this); 

    ExpandableListView epView = (ExpandableListView) findViewById(R.id.list); 
    epView.setAdapter(mAdapter); 

    return true; 
} 
4

最简单的方法

您可以实现ExpandableListView.OnGroupExpandListener,在你运行collapseGroup()除了为被点击了一个所有列表中的组。这将做你想要的。

expandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 
     int previousGroup = -1; 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      if(groupPosition != previousGroup) 
       expandableList.collapseGroup(previousGroup); 
      previousGroup = groupPosition; 
     } 
    }); 
0

Iram Bukhari的答案工作正常。但我做过一次改变:

private static int prev = -1; 
// and OnGroupExpandListener implement 


mExpandableList.setOnGroupExpandListener(new OnGroupExpandListener() { 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       if(prev!=-1 && prev!=groupPosition) 
       { 

        mExpandableList.collapseGroup(prev);  

       } 
       prev=groupPosition; 
      } 
     }); 

我已经添加prev!= groupPosition作为额外的条件。因为如果

item 1 has clicked(opened) 
item 1 has clicked(closed) 
item 1 has clicked(Not opening. because prev has same position so the item is opened and collapsed immediatly) 

添加条件

item 1 has clicked(opened) 
item 1 has clicked(closed) 
item 1 has clicked(opened) 
0

enter image description here其工作而看到的屏幕快照

package com.keshav.myexpandablelistviewexampleworkinginactivity; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ExpandableListView; 
import android.widget.ExpandableListView.OnChildClickListener; 
import android.widget.ExpandableListView.OnGroupClickListener; 
import android.widget.ExpandableListView.OnGroupCollapseListener; 
import android.widget.ExpandableListView.OnGroupExpandListener; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

public class MainActivity extends Activity { 

    ExpandableListAdapter listAdapter; 
    ExpandableListView expListView; 
    List<String> listDataHeader; 
    HashMap<String, List<String>> listDataChild; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // tODO get the listview 
     expListView = (ExpandableListView) findViewById(R.id.lvExp); 

     // TODO preparing list data 
     prepareListData(); 

     listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

     // setting list adapter 
     expListView.setAdapter(listAdapter); 

     // Listview Group click listener 
     expListView.setOnGroupClickListener(new OnGroupClickListener() { 

      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, 
             int groupPosition, long id) { 
       Toast.makeText(getApplicationContext(), 
         "Group Clicked " + listDataHeader.get(groupPosition), 
         Toast.LENGTH_SHORT).show(); 
       return false; 
      } 

     }); 

     // Listview Group expanded listener 
     expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 

      // TODO Colapse Here Using this... in android 
      int previousGroup = -1; 
      boolean flag = false; 

      @Override 
      public void onGroupExpand(int groupPosition) { 

       Log.e("keshav", "onGroupClick is -> " + groupPosition); 

       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Expanded", 
         Toast.LENGTH_SHORT).show(); 

       if (groupPosition != previousGroup && flag) { 
        expListView.collapseGroup(previousGroup); 
       } 
       previousGroup = groupPosition; 

       flag = true; 

      } 
     }); 


     // Listview Group collasped listener 
     expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 

      @Override 
      public void onGroupCollapse(int groupPosition) { 
       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Collapsed", 
         Toast.LENGTH_SHORT).show(); 

      } 
     }); 


     // Todo Listview on child click listener 
     expListView.setOnChildClickListener(new OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
             int groupPosition, int childPosition, long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(
         getApplicationContext(), 
         listDataHeader.get(groupPosition) 
           + " : " 
           + listDataChild.get(
           listDataHeader.get(groupPosition)).get(
           childPosition), Toast.LENGTH_SHORT) 
         .show(); 
       return false; 
      } 
     }); 
    } 

    /* 
    * Preparing the list data 
    */ 
    private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataChild = new HashMap<String, List<String>>(); 

     // Adding child data 
     listDataHeader.add("Months"); 
     listDataHeader.add("Top 250"); 
     listDataHeader.add("Now Showing"); 
     listDataHeader.add("Coming Soon.."); 


     // Adding child data 
     List<String> weeks = new ArrayList<String>(); 
     weeks.add("Sunday"); 
     weeks.add("Monday"); 
     weeks.add("Tuesday"); 
     weeks.add("Wednesday"); 
     weeks.add("Thursday"); 
     weeks.add("Friday"); 
     weeks.add("Saturday"); 


     // Adding child data 
     List<String> top250 = new ArrayList<String>(); 
     top250.add("Om Shanti Om"); 
     top250.add("Badshah"); 
     top250.add("Bahubali Part 1"); 
     top250.add("Carry on Jatta"); 
     top250.add("Sholey"); 
     top250.add("Mard"); 
     top250.add("Dewwar"); 


     List<String> nowShowing = new ArrayList<String>(); 
     nowShowing.add("Bahubali"); 
     nowShowing.add("Kabali"); 
     nowShowing.add("Luckky Di Unlukky Story"); 
     nowShowing.add("Sachin Billions Dream"); 
     nowShowing.add("Red 2"); 

     List<String> comingSoon = new ArrayList<String>(); 
     comingSoon.add("Tubelight "); 
     comingSoon.add("Bahubali 3 2018"); 
     comingSoon.add("Dhoom 4"); 
     comingSoon.add("Hindi Medium"); 

     listDataChild.put(listDataHeader.get(0), weeks); 
     listDataChild.put(listDataHeader.get(1), top250); // Header, Child data 
     listDataChild.put(listDataHeader.get(2), nowShowing); 
     listDataChild.put(listDataHeader.get(3), comingSoon); 
    } 
} 


ExpandableListAdapter 


package com.keshav.myexpandablelistviewexampleworkinginactivity; 

import java.util.HashMap; 
import java.util.List; 

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

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context _context; 
    private List<String> _listDataHeader; // header titles 
    // child data in format of header title, child title 
    private HashMap<String, List<String>> _listDataChild; 

    public ExpandableListAdapter(Context context, List<String> listDataHeader, 
      HashMap<String, List<String>> listChildData) { 
     this._context = context; 
     this._listDataHeader = listDataHeader; 
     this._listDataChild = listChildData; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosititon) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .get(childPosititon); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

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

     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, null); 
     } 

     TextView txtListChild = (TextView) convertView 
       .findViewById(R.id.lblListItem); 

     txtListChild.setText(childText); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
       .size(); 
    } 

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

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

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     String headerTitle = (String) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_group, null); 
     } 

     TextView lblListHeader = (TextView) convertView 
       .findViewById(R.id.lblListHeader); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle); 

     return convertView; 
    } 

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

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

} 


activity_mail.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#f4f4f4" > 

      <ExpandableListView 
       android:id="@+id/lvExp" 
       android:layout_height="match_parent" 
       android:layout_width="match_parent" 
       android:cacheColorHint="#00000000"/> 

</LinearLayout> 


list_grou.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="8dp" 
    android:background="#000000"> 


    <TextView 
     android:id="@+id/lblListHeader" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft" 
     android:textSize="17dp" 
     android:textColor="#f9f93d" /> 

</LinearLayout> 


list_item.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="55dip" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/lblListItem" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="17dip" 
     android:paddingTop="5dp" 
     android:paddingBottom="5dp" 
     android:textColor="#000000" 
     android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" /> 

</LinearLayout> 
+0

<样式名称= “AppBaseTheme” 父= “机器人:Theme.Light”> <样式名称= “AppTheme” 父= “AppBaseTheme”> 2017-06-20 07:45:05

相关问题