Android 는 QQ 친구 목록 을 모방 하여 그룹 을 나 누 어 삭제 및 지속 화 를 실현 합 니 다.

Android 가 자체 적 으로 가지 고 있 는 컨트롤 ExpandableListView 는 그룹 목록 기능 을 실 현 했 습 니 다.이 사례 는 이 를 바탕 으로 최적화 되 었 습 니 다.이 컨트롤 은 그룹 및 하위 항목 의 기능 을 추가 하고 목록 데이터 의 지속 화 를 추가 합 니 다.
데모 구현 효과:
 
GroupListDemo 구체 적 인 실현:
① demo 는 목록 페이지 를 Fragment 페이지 로 디자인 하여 후기 호출 에 편리 하도록 한다.메 인 인터페이스 MainActivity 에 GroupListFragment 페이지 를 동적 으로 추가 합 니 다.
MainActivity.java

package com.eric.grouplistdemo; 
 
 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.widget.RelativeLayout; 
 
public class MainActivity extends Activity { 
 public static GroupListFragment fragment; 
  
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
   
  fragment = new GroupListFragment(); 
   
  getFragmentManager().beginTransaction() 
  .replace(R.id.fragContainer, fragment).commit(); 
   
 } 
} 
인터페이스 의 fragContainer 레이아웃 에 GroupListFragment 인 스 턴 스 를 동적 으로 추가 합 니 다.fragment 를 static 로 선언 하여 Adapter 에서 하위 항목 을 추가 할 때 호출 합 니 다.
activity_main.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="match_parent" 
 android:orientation="vertical" > 
 <RelativeLayout 
  android:id="@+id/fragContainer" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  > 
 </RelativeLayout> 
</LinearLayout> 

② 사용자 정의 어댑터 클래스 MyAdapter 를 실현 하고 BaseExpandableListAdapter 에서 계승 합 니 다.그룹 항목 레이아웃 및 하위 항목 레이아웃;
list_item_parent.xml 그룹 항목 레이아웃 파일,아이콘 과 이름 을 펼 치고 아이콘 을 삭제 합 니 다.

<?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="50dp" 
 android:background="#0099ff" 
 android:orientation="horizontal"> 
 <ImageView 
  android:id="@+id/image_parent" 
  android:layout_width="50dp" 
  android:layout_height="50dp" 
  android:src="@drawable/image_parent1"/> 
 <TextView 
  android:id="@+id/text_parent" 
  android:layout_width="wrap_content" 
  android:layout_height="50dp" 
  android:textColor="#FFF" 
  android:textSize="20sp" 
  android:text="parent1" 
  android:layout_toRightOf="@id/image_parent" 
  android:gravity="center"/> 
 <ImageView 
  android:id="@+id/image_delete" 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_centerVertical="true" 
  android:layout_alignParentRight="true" 
  android:src="@drawable/delete"/> 
 <ImageView 
  android:id="@+id/image_add" 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_centerVertical="true" 
  android:layout_toLeftOf="@id/image_delete" 
  android:src="@drawable/add"/> 
</RelativeLayout>
list_item_child.xml 하위 항목 레이아웃 파일,이름 및 아이콘 삭제;

<?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="40dp" 
 > 
 <TextView 
  android:id="@+id/text_child" 
  android:layout_width="wrap_content" 
  android:layout_height="40dp" 
  android:layout_margin="5dp" 
  android:textColor="#0099ff" 
  android:text="child" 
  android:layout_centerInParent="true" 
  android:gravity="center"/> 
 <ImageView 
  android:id="@+id/image_delete" 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_alignParentRight="true" 
  android:layout_centerVertical="true" 
  android:src="@drawable/delete"/> 
</RelativeLayout> 

MyAdapter.java 사용자 정의 어댑터

package com.eric.grouplistdemo; 
 
import java.util.List; 
import java.util.Map; 
 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.TextView; 
 
public class MyAdapter extends BaseExpandableListAdapter{ 
 private List<String> parentList; 
 private Map<String,List<String>> map; 
 private Context context; 
 private EditText edit_modify; 
 private ModifyDialog dialog; 
  
 //     
 public MyAdapter(Context context, List<String> parentList, Map<String,List<String>> map) { 
  this.context = context; 
  this.parentList = parentList; 
  this.map = map; 
 } 
  
 //      
 @Override 
 public int getGroupCount() { 
  return parentList.size(); 
 } 
 //          
 @Override 
 public int getChildrenCount(int groupPosition) { 
  String groupName = parentList.get(groupPosition); 
  int childCount = map.get(groupName).size(); 
  return childCount; 
 } 
 //        
 @Override 
 public Object getGroup(int groupPosition) { 
  String groupName = parentList.get(groupPosition); 
  return groupName; 
 } 
 //         
 @Override 
 public Object getChild(int groupPosition, int childPosition) { 
  String groupName = parentList.get(groupPosition); 
  String chidlName = map.get(groupName).get(childPosition); 
  return chidlName; 
 } 
 //   ID 
 @Override 
 public long getGroupId(int groupPosition) { 
  return groupPosition; 
 } 
 //    ID 
 @Override 
 public long getChildId(int groupPosition, int childPosition) { 
  return childPosition; 
 } 
 
 @Override 
 public boolean hasStableIds() { 
  return true; 
 } 
 //       
 @Override 
 public View getGroupView(int groupPosition, boolean isExpanded, 
   View convertView, ViewGroup parent) { 
  final int groupPos = groupPosition; 
   
  if(convertView == null){ 
   convertView = LayoutInflater.from(context).inflate(R.layout.list_item_parent, null); 
  } 
   
  ImageView image = (ImageView) convertView.findViewById(R.id.image_parent); 
  ImageView image_add = (ImageView) convertView.findViewById(R.id.image_add); 
  ImageView image_delete = (ImageView) convertView.findViewById(R.id.image_delete); 
   
  if(isExpanded){ 
   image.setImageResource(R.drawable.image_parent2); 
  }else{ 
   image.setImageResource(R.drawable.image_parent1); 
  } 
   
  image_add.setOnClickListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    alertAddDialog(MainActivity.fragment.getActivity(), "    ", groupPos); 
   } 
  }); 
  image_delete.setOnClickListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    GroupListFragment.deleteGroup(groupPos); 
   } 
  }); 
   
   
  TextView parentText = (TextView) convertView.findViewById(R.id.text_parent); 
  parentText.setText(parentList.get(groupPosition)); 
  return convertView; 
 } 
 //        
 @Override 
 public View getChildView(int groupPosition, int childPosition, 
   boolean isLastChild, View convertView, ViewGroup parent) { 
  final int groupPos = groupPosition; 
  final int childPos = childPosition; 
   
  if(convertView == null){ 
   convertView = LayoutInflater.from(context).inflate(R.layout.list_item_child, null); 
  } 
  TextView childText = (TextView) convertView.findViewById(R.id.text_child); 
  ImageView image_delete = (ImageView) convertView.findViewById(R.id.image_delete); 
  String parentName = parentList.get(groupPosition); 
  String childName = map.get(parentName).get(childPosition); 
  childText.setText(childName); 
   
  image_delete.setOnClickListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    GroupListFragment.deleteChild(groupPos, childPos); 
   } 
  }); 
  return convertView; 
 } 
 
 @Override 
 public boolean isChildSelectable(int groupPosition, int childPosition) { 
  return true; 
 } 
  
 //         
 public void alertAddDialog(Context context, String title, int currentGroup){ 
  final int group = currentGroup; 
   
  dialog = new ModifyDialog(context, title, null); 
  edit_modify = dialog.getEditText(); 
  dialog.setOnClickCommitListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    GroupListFragment.addChild(group, edit_modify.getText().toString()); 
    dialog.dismiss(); 
   } 
  }); 
  dialog.show(); 
 } 
} 
구조 함수:들 어 오 는 parentList 와 map 를 데이터 동기 화하 고 parentList 는 그룹 데 이 터 를 저장 하 며 map 는 대응 하 는 그룹 과 하위 항목 list 데 이 터 를 저장 합 니 다.
그룹 수 와 하위 항목 수 등 을 가 져 오 는 것 은 간단 합 니 다.소개 하지 않 겠 습 니 다.주로 그룹 보기 초기 화 와 하위 항목 보기 초기 화 두 함 수 를 설명 합 니 다.
그룹 보기 초기 화 getGroupView():convertView 를 최대한 재 활용 하여 메모리 유출 을 방지 합 니 다.우선 convertView 가 비어 있 으 면 그룹 보기 초기 화,list 불 러 오기item_parent 하위 항목 레이아웃;그룹 레이아웃 컨트롤 가 져 오기:아이콘 이미지 펼 치기,아이콘 이미지 추가add,아이콘 이미지 삭제delete;전 달 된 불 형식 매개 변수 isExpanded 를 통 해 이미지 할당 에 아이콘 을 펼 치 거나 아이콘 을 통합 하 는 것 을 판단 합 니 다.각각 아이콘 추가 와 아이콘 삭제 에 클릭 이 벤트 를 추가 하고 그룹 ListFragment 의 팝 업 추가 창 함수 alertAddDialog()와 그룹 함수 deleteGroup()을 호출 합 니 다.
하위 항목 보기 초기 화 getChildView():메모리 유출 을 방지 하기 위해 convertView 를 최대한 재 활용 합 니 다.우선 convertView 가 비어 있 으 면 하위 항목 보 기 를 초기 화하 고 list 를 불 러 옵 니 다.item_child 하위 항목 레이아웃;하위 레이아웃 컨트롤 가 져 오기:내용 텍스트 ChildText 와 아이콘 삭제 Imagedelete;parentList 와 map 에서 각각 가 져 옵 니 다.현재 하위 항목 의 그룹 이름 parentName 과 하위 항목 이름 childName,할당 ChildText,아이콘 을 삭제 하고 클릭 이 벤트 를 추가 하 며 하위 항목 함수 deleteChild()를 호출 합 니 다.
③ 사용자 정의 대화 상자 류 ModifyDialog 를 실현 하고 Dialog 류 에서 계승 하여 수정 내용 을 입력 하거나 추가 항목 의 내용 을 과도 합 니 다.
no_title_dialog.xml,values 디 렉 터 리 에서 Dialog 의 style 형식 xml 를 사용자 정의 하고 Dialog 의 제목 표시 줄 을 제거 합 니 다.

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
 <style name="noTitleDialog" parent="android:style/Theme.Dialog"> 
  <item name="android:width">300dp</item> 
  <item name="android:height">40dp</item> 
  <item name="android:windowNoTitle">true</item> 
 </style> 
</resources> 
dialog_modify.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="match_parent" 
 android:orientation="vertical" > 
 <TextView 
  android:id="@+id/text_title" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:layout_gravity="center_horizontal" 
  android:gravity="center" 
  android:background="#0099ff" 
  android:text="    " 
  android:textColor="#FFF" 
  android:textSize="20sp"/> 
 <EditText 
  android:id="@+id/edit_modify" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="   "/> 
 <Button 
  android:id="@+id/btn_commit" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:text="  " 
  android:textColor="#FFF" 
  android:background="#0099ff" 
  /> 
</LinearLayout> 
ModifyDialog.java

package com.eric.grouplistdemo; 
 
import android.app.Dialog; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
public class ModifyDialog extends Dialog{ 
 private TextView text_title; 
 private EditText edit_modify; 
 private Button btn_commit; 
  
 public ModifyDialog(Context context, String title, String name) { 
  super(context, R.style.noTitleDialog); 
   
  View view = LayoutInflater.from(getContext()) 
    .inflate(R.layout.dialog_modify, null); 
  text_title = (TextView) view.findViewById(R.id.text_title); 
  edit_modify = (EditText)view.findViewById(R.id.edit_modify); 
  btn_commit = (Button) view.findViewById(R.id.btn_commit); 
  text_title.setText(title); 
  edit_modify.setText(name); 
   
  super.setContentView(view); 
 } 
  
 public EditText getEditText(){ 
  return edit_modify; 
 } 
  
 public void setOnClickCommitListener(View.OnClickListener listener){ 
  btn_commit.setOnClickListener(listener); 
 } 
} 
Modify Dialog 사용자 정의 구조 함수 에서 슈퍼()를 통 해 사용자 정의 no 를 불 러 옵 니 다.title_dialog.xml,성명 View 로드 레이아웃 레이아웃 dialogmodify.xml;또한 레이아웃 에 있 는 해당 컨트롤 을 가 져 와 구조 함수 에서 들 려 오 는 문자열 title 과 name 을 각각 제목 텍스트 와 입력 상자 컨트롤 에 할당 합 니 다.마지막 으로 setContentView()를 호출 하여 대화 상자 보 기 를 초기 화 합 니 다.
입력 상자 컨트롤 을 되 돌려 주 는 함수 getEditText()를 추가 하여 입력 상자 에 입력 한 내용 을 가 져 옵 니 다.
이벤트 모니터 를 사용자 정의 로 눌 러 서 확인 단추 에 연결 해 야 합 니 다. 
④ 준비 작업 이 완료 되 었 습 니 다.다음은 GroupListFragment 를 실현 합 니 다.데이터 의 초기 화 와 지속 적 인 저장,그룹 항목 과 하위 항목 의 추가 삭제 작업,목록 하위 항목 클릭 이벤트,목록 그룹 항목 과 하위 항목 의 길 이 를 포함 합 니 다. 
fragment_group_list.xml 페이지 의 레이아웃 파일 ExpandableListView 목록 과 그룹 아이콘 추가;

<?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" 
 > 
 <ExpandableListView 
  android:id="@+id/expandablelistview" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:groupIndicator="@null" 
  > 
 </ExpandableListView> 
 <ImageView 
  android:id="@+id/image_add" 
  android:layout_width="40dp" 
  android:layout_height="40dp" 
  android:layout_centerHorizontal="true" 
  android:layout_alignParentBottom="true" 
  android:src="@drawable/add"/> 
</RelativeLayout> 
ExpandableListView 의 groupIndicator 속성 을@null 로 설정 하고 자체 적 으로 펼 치 는 아이콘 을 사용 하지 않 습 니 다.
GroupListFragment.java 목록 을 불 러 오 는 페이지

package com.eric.grouplistdemo; 
 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
 
import android.R.integer; 
import android.app.Fragment; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.ExpandableListView; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class GroupListFragment extends Fragment{ 
 private View view; 
 private ExpandableListView expandableListView; 
 public static MyAdapter adapter; 
 public static List<String> parentList; 
 public static Map<String,List<String>> map; 
 private ModifyDialog dialog; 
 private EditText edit_modify; 
 private ImageView image_add; 
 private int currentGroup,currentChild; 
 public static SharedPreferences sp; 
 public static Editor editor; 
 public static String dataMap,dataParentList; 
  
 @Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
   Bundle savedInstanceState) { 
   
  view = inflater.inflate(R.layout.fragment_group_list, container, false); 
  expandableListView = (ExpandableListView) view.findViewById(R.id.expandablelistview); 
  image_add = (ImageView) view.findViewById(R.id.image_add); 
  image_add.setOnClickListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    alertAddDialog(getActivity(), "   "); 
   } 
  }); 
   
  initData(); 
   
  adapter = new MyAdapter(getActivity().getApplicationContext(), parentList, map); 
  expandableListView.setAdapter(adapter); 
   
  //         
  MyOnClickListener myListener = new MyOnClickListener(); 
  expandableListView.setOnChildClickListener(myListener); 
   
  //         
  MyOnLongClickListener myLongListener = new MyOnLongClickListener(); 
  expandableListView.setOnItemLongClickListener(myLongListener); 
   
  return view; 
 } 
  
 public void initData(){ 
  map = new HashMap<String, List<String>>(); 
  parentList = new ArrayList<String>(); 
   
  sp = getActivity().getApplicationContext().getSharedPreferences("spfile", getActivity().MODE_PRIVATE); 
  dataMap = sp.getString("dataMap", null); 
  dataParentList = sp.getString("dataParentList", null); 
   
  if(dataMap == null || dataParentList == null){ 
   parentList = new ArrayList<String>(); 
   parentList.add("  "); 
   parentList.add("  "); 
   parentList.add("  "); 
   
   List<String> list1 = new ArrayList<String>(); 
   list1.add("    "); 
   list1.add("    "); 
   list1.add("    "); 
   map.put("  ", list1); 
  
   List<String> list2 = new ArrayList<String>(); 
   list2.add("     "); 
   list2.add("    "); 
   list2.add("    "); 
   map.put("  ", list2); 
  
   List<String> list3 = new ArrayList<String>(); 
   list3.add("    "); 
   list3.add("    "); 
   list3.add("    "); 
   map.put("  ", list3); 
  }else{ 
   try { 
    //   parentList 
    JSONArray jsonArray = new JSONArray(dataParentList); 
    for (int i = 0; i < jsonArray.length(); i++) { 
     parentList.add(jsonArray.get(i).toString()); 
    } 
     
    //   map 
    JSONObject jsonObject = new JSONObject(dataMap); 
    for (int i = 0; i < jsonObject.length(); i++) { 
     String key = jsonObject.getString(parentList.get(i)); 
     JSONArray array = new JSONArray(key); 
     List<String> list = new ArrayList<String>(); 
     for (int j = 0; j < array.length(); j++) { 
      list.add(array.get(j).toString()); 
     } 
     map.put(parentList.get(i), list); 
    } 
     
    Log.d("eric", "①:"+map+"②:"+parentList); 
   } catch (JSONException e) { 
    e.printStackTrace(); 
    Log.e("eric","String Map List  "+e); 
   } 
  } 
  Log.e("eric", dataMap+"!&&!"+dataParentList); 
  saveData(); 
 } 
  
 //          
 public class MyOnClickListener implements ExpandableListView.OnChildClickListener{ 
  @Override 
  public boolean onChildClick(ExpandableListView parent, View v, 
    int groupPosition, int childPosition, long id) { 
   String str = "choose"+groupPosition+"-"+childPosition; 
   Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show(); 
   return false; 
  } 
 } 
  
 //          
 public class MyOnLongClickListener implements AdapterView.OnItemLongClickListener{ 
  @Override 
  public boolean onItemLongClick(AdapterView<?> parent, View view, 
    int position, long id) { 
   //     
   if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD){ 
    long packedPos = ((ExpandableListView) parent).getExpandableListPosition(position); 
    int groupPosition = ExpandableListView.getPackedPositionGroup(packedPos); 
    int childPosition = ExpandableListView.getPackedPositionChild(packedPos); 
     
    currentGroup = groupPosition; 
    currentChild = childPosition; 
     
    String str = (String)adapter.getChild(groupPosition, childPosition); 
    alertModifyDialog("      ",str); 
    Toast.makeText(getActivity(),str,Toast.LENGTH_SHORT).show(); 
    return true; 
   //    
   }else if(ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP){ 
    long packedPos = ((ExpandableListView) parent).getExpandableListPosition(position); 
    int groupPosition = ExpandableListView.getPackedPositionGroup(packedPos); 
    int childPosition = ExpandableListView.getPackedPositionChild(packedPos); 
     
    currentGroup = groupPosition; 
    currentChild = childPosition; 
     
    String group = parentList.get(groupPosition); 
    alertModifyDialog("     ", group); 
     
    String str = (String)adapter.getGroup(groupPosition); 
    Toast.makeText(getActivity(),str,Toast.LENGTH_SHORT).show(); 
   } 
    return false; 
   } 
 } 
  
 //    
 public static void addGroup(String newGroupName){ 
  parentList.add(newGroupName); 
  List<String> list = new ArrayList<String>(); 
  map.put(newGroupName, list); 
  adapter.notifyDataSetChanged(); 
  saveData(); 
 } 
  
 //         
 public static void addChild(int groupPosition, String newChildName){ 
  String groupName = parentList.get(groupPosition); 
  List<String> list = map.get(groupName); 
  list.add(newChildName); 
  adapter.notifyDataSetChanged(); 
  saveData(); 
 } 
  
 //      
 public static void deleteGroup(int groupPos){ 
  String groupName = parentList.get(groupPos); 
  map.remove(groupName); 
  parentList.remove(groupPos); 
  adapter.notifyDataSetChanged(); 
  saveData(); 
 } 
 //       
 public static void deleteChild(int groupPos, int childPos){ 
  String groupName = parentList.get(groupPos); 
  List<String> list = map.get(groupName); 
  list.remove(childPos); 
  adapter.notifyDataSetChanged(); 
  saveData(); 
 } 
  
 //       
 public void modifyName(int groupPosition, int childPosition, String modifyName){ 
  Toast.makeText(getActivity(), String.valueOf(groupPosition)+'-'+String.valueOf(childPosition), Toast.LENGTH_SHORT).show(); 
  if(childPosition<0){ 
   //      
   String groupName = parentList.get(groupPosition); 
   if(!groupName.equals(modifyName)){ 
    map.put(modifyName, map.get(groupName)); 
    map.remove(groupName); 
    parentList.set(groupPosition, modifyName); 
   } 
    
  }else{ 
   //       
   String group = parentList.get(groupPosition); 
   List<String> list =map.get(group); 
   list.set(childPosition, modifyName); 
   map.put(group, list); 
  } 
  adapter.notifyDataSetChanged(); 
  saveData(); 
 } 
  
 //       
 public void alertModifyDialog(String title, String name){ 
  dialog = new ModifyDialog(getActivity(), title, name); 
  edit_modify = dialog.getEditText(); 
  dialog.setOnClickCommitListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    modifyName(currentGroup, currentChild, edit_modify.getText().toString()); 
    dialog.dismiss(); 
   } 
  }); 
  dialog.show(); 
 } 
  
 //        
 public void alertAddDialog(Context context, String title){ 
  dialog = new ModifyDialog(context, title, null); 
  edit_modify = dialog.getEditText(); 
  dialog.setOnClickCommitListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    addGroup(edit_modify.getText().toString()); 
    dialog.dismiss(); 
   } 
  }); 
  dialog.show(); 
 } 
  
 //     
 public static void saveData(){ 
  JSONObject jsonObject = new JSONObject(map); 
  dataMap = jsonObject.toString(); 
  dataParentList = parentList.toString(); 
   
  editor = sp.edit(); 
  editor.putString("dataMap", dataMap); 
  editor.putString("dataParentList", dataParentList); 
  editor.commit(); 
 } 
  
} 
내용 이 좀 많 습 니 다.하나씩 하 세 요.
Fragment 페이지 함수 onCreateView()초기 화:
우선,layot 레이아웃 fragmentgroup_list.xml 로 딩,해당 컨트롤 의 인 스 턴 스,expandableListView 목록 컨트롤 및 그룹 아이콘 추가 imageadd,그룹 아이콘 추가 클릭 이벤트 추가;initData()방법 을 호출 하여 그룹 데이터 parentList 와 그룹 이 대응 하 는 하위 항목 map 를 초기 화 합 니 다.그리고 실례 화 된 adapter 는 parentList 와 map 데 이 터 를 사용자 정의 어댑터 MyAdapter 에 전송 하고 expandableListView 에 연결 합 니 다.마지막 으로 expandableListView 에 사용자 정의 하위 항목 클릭 이벤트 감청 기 를 추가 하고 그룹 항목 과 하위 항목 의 길 이 는 이벤트 감청 기 를 누 릅 니 다.
데이터 함수 initData()초기 화:이 함 수 는 ShareReference 를 통 해 데 이 터 를 저장 합 니 다.
우선,parentList 와 map 를 예화 하여 ShareReference 에서 저 장 된 String 형식의 parentList 와 map 실제 데 이 터 를 얻 고 dataMap 과 dataParentList 에 할당 합 니 다.만약 에 데이터 가 존재 하지 않 으 면 기본적으로 null 로 돌아 갑 니 다.첫 번 째 프로그램 을 실행 할 때 분명 근거 가 없 기 때문에 데 이 터 를 얻 지 못 하면 parentList 와 Map 에'거실'을 부여 합 니 다.'주방','침실'등 일련의 데이터;데이터 가 있 으 면 데이터 변환 을 해 야 합 니 다.이전에 저 장 된 String 형식 데이터 때문에 parentList 초기 화:dataParentList 를 JSONarray 형식 으로 변환 하고 순환 을 통 해 데 이 터 를 parentList 에 할당 합 니 다.마찬가지 로 dataMap 을 JSONobject 형식 으로 바 꾸 고 2 층 for 순환 을 통 해 데 이 터 를 map 에 할당 합 니 다.
사용자 정의 클릭 하위 항목 감청 클래스 MyOnClickListener:ExpandableListView 를 실현 합 니 다.OnChildClickListener 인 터 페 이 스 는 Toast 조작 을 간단하게 하고 독 자 는 점프 등 다른 사용자 정의 기능 으로 수정 할 수 있 습 니 다.
그룹 항목 이나 하위 항목 의 감청 기 류 를 사용자 정의 합 니 다.MyOnLongClickListener:AdapterView 를 실현 합 니 다.OnitemLongClickListener 인 터 페 이 스 는 ExpandableListView 의 getPacked Position Type()방법 으로 이 때 그룹 항목 을 길 게 누 르 는 지 하위 항목 을 판단 합 니 다.여기 서 길 이 를 그룹 과 하위 항목 에 따라 분리 하여 기능 에 따라 수정 하기에 편리 하 다.그룹 항목 이 든 하위 항목 이 든 길 게 누 르 면 alertModify Dialog()를 호출 하여 현재 항목 의 이름 을 입력 합 니 다.
그룹 addGroup 함수 추가:전 달 된 new GroupName 을 parentList 에 추가 하고 빈 list 를 정의 합 니 다.new GroupName 을 연결 하여 이 string 과 list 를 map 에 추가 합 니 다.마지막 으로 adapter.notifyDataSetChanged()를 호출 하여 목록 을 새로 고치 고 saveData()를 호출 하여 ShareReference 에 저장 합 니 다.
마찬가지 로 지정 한 그룹 addChild()에 하위 항목 을 추가 하고 지정 한 그룹 deleteGroup()을 삭제 하 며 지정 한 하위 항목 deleteChild()를 삭제 합 니 다.모두 parentList 와 map 를 조작 하고 마지막 으로 목록 을 새로 고치 고 데 이 터 를 저장 합 니 다.
이 항목 의 이름 modifyName()을 수정 합 니 다.childPosition 을 전달 하여 판단 합 니 다.항목 이 그룹 항목 일 때 childPosition 의 값 은-1 로 그룹 항목 과 하위 항목 을 구분 합 니 다.여기 서 문제 가 발생 했 습 니 다.그룹 항목 이 제출 한 이름 이 원래 이름 과 같 으 면 오류 가 발생 할 수 있 습 니 다.따라서 판단 을 추가 하고 제출 한 이름 만 다 르 면 수정 작업 을 할 수 있 습 니 다.수 정 된 구체 적 인 실현 은 parentList 와 map 에 대한 작업 입 니 다.그룹 항목 을 수정 하 는 것 을 예 로 들 어 새로 추 가 된 그룹 과 modifyName 의 그룹 을 추가 합 니 다.해당 하 는 List 는 원래 그룹 이름 에 대응 하 는 List 데이터 이 고 원래 의 groupName 그룹 과 해당 하 는 list 를 삭제 하여 수정 합 니 다.마지막 으로 목록 을 새로 고치 고 데 이 터 를 저장 해 야 합 니 다.
수정 대화 상자 alertModify Dialog()함수:먼저 사용자 정의 dialog 를 예화 하고 제목 과 입력 상자 의 데 이 터 를 초기 화 합 니 다.getEditText()함 수 를 호출 하여 입력 상자 의 인 스 턴 스 를 가 져 오고 제출 단 추 를 추가 하여 이 벤트 를 클릭 하 며 modifyName 방법 으로 현재 그룹 과 하위 항목 의 데 이 터 를 전송 하고 입력 상자 에 제출 한 텍스트 를 입력 합 니 다.
새 그룹 대화 상자 alertAddDialog()함 수 를 연주 합 니 다.마찬가지 로,실례 화 된 dialog 를 사용 하여 입력 상자 컨트롤 을 가 져 옵 니 다.이벤트 에서 addGroup()방법 으로 데 이 터 를 추가 하려 면 누 르 십시오.
데이터 savedata()함수 저장:parentList 와 map 데 이 터 를 String 형식 으로 바 꾸 고 각각 값 을 부여 하여 ShareReference 의 Editor 에 저장 하고 제출 합 니 다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기