2013-11-18 4 views
1

В моем приложении у меня есть список и кнопка в моем списке, когда я выбираю родительский элемент, все элементы дочернего элемента выбираются, действительно, я хочу, чтобы дерево ячеек. Я использую расширяемая View, но у меня есть проблема в моем коде:Android: CheckBox tree

Мой код: list_group.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"> 


    <CheckBox 
      android:id="@+id/checkbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:layout_marginLeft="30dp" 
      android:layout_marginRight="2dp" 
      android:focusable="false"/> 

    <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="#ffffff" /> 

</LinearLayout> 

list_item2.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="horizontal" 
       android:background="#ffffff"> 

    <CheckBox 
      android:id="@+id/checkbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:layout_marginLeft="30dp" 
      android:layout_marginRight="2dp" 
      android:focusable="false"/> 

    <TextView 
      android:id="@+id/lblListItem" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="17dip" 
      android:paddingTop="5dp" 
      android:paddingBottom="5dp" 
      android:layout_marginLeft="-40dp" 
      android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"/> 

</LinearLayout> 

backup_list.xml:

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

    <ExpandableListView 
      android:layout_weight="1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:id="@+id/expandableListView"/> 

    <Button 
      android:id="@+id/backup" 
      android:layout_gravity="center_horizontal" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:text="BackUp" 
      android:clickable="true" /> 

</LinearLayout> 

Как я могу это исправить?

ExpandableListAdapter:

package com.mCloud.android.ui.activity; 

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; 
import com.mCloud.android.R; 

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_item2, 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; 
    } 
} 

ParentActivity:

package com.mCloud.android.ui.activity; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Environment; 
import android.widget.ExpandableListView; 
import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 
import com.actionbarsherlock.view.MenuItem; 
import com.mCloud.android.Log_OC; 
import com.mCloud.android.R; 
import com.mCloud.android.filters.MediaFilenameFilter; 

public class ParentActivity extends SherlockFragmentActivity { 

    private static final String TAG = "mCloudPreferences"; 
    ExpandableListAdapter listAdapter; 
    ExpandableListView expListView; 
    List<String> listDataHeader; 
    HashMap<String, List<String>> listDataChild; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.backup_list); 
     ActionBar actionBar = getSherlock().getActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 

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

     // preparing list data 
     prepareListData(); 

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


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


    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     super.onMenuItemSelected(featureId, item); 
     Intent intent; 

     switch (item.getItemId()) { 
      case android.R.id.home: 
       intent = new Intent(getBaseContext(), DisplayInfoActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent); 
       break; 
      default: 
       Log_OC.w(TAG, "Unknown menu item triggered"); 
       return false; 
     } 
     return true; 
    } 

    /* 
    * Preparing the list data 
    */ 

    private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataHeader.add("Files"); 
     listDataHeader.add("Apps"); 
     listDataHeader.add("SMS"); 
     listDataHeader.add("Contacts"); 
     listDataHeader.add("Call Logs"); 
     listDataHeader.add("Calender"); 
     listDataHeader.add("Setting"); 


     List<String> files = new ArrayList<String>(); 
     File file = Environment.getExternalStorageDirectory(); 
     String[] list = file.list(new MediaFilenameFilter()); 
     if (list != null) { 
      for (String name : list) 
       files.add(name); 
     } 
     files.add("Advance Selection"); 

     List<String> apps = new ArrayList<String>(); 
     apps.add("All Apps"); 

     List<String> sms = new ArrayList<String>(); 
     sms.add("Inbox"); 
     sms.add("Draft"); 
     sms.add("Send"); 

     List<String> contacts = new ArrayList<String>(); 
     contacts.add("All Contacts"); 

     List<String> calllogs = new ArrayList<String>(); 
     calllogs.add("Resived"); 
     calllogs.add("Missed"); 
     calllogs.add("Dailed"); 

     List<String> calender = new ArrayList<String>(); 
     calender.add("All calender"); 

     List<String> setting = new ArrayList<String>(); 
     setting.add("All setting"); 

     listDataChild = new HashMap<String, List<String>>(); 
     listDataChild.put(listDataHeader.get(0), files); 
     listDataChild.put(listDataHeader.get(1), apps); 
     listDataChild.put(listDataHeader.get(2), sms); 
     listDataChild.put(listDataHeader.get(3), contacts); 
     listDataChild.put(listDataHeader.get(4), calllogs); 
     listDataChild.put(listDataHeader.get(5), calender); 
     listDataChild.put(listDataHeader.get(6), setting); 

    } 
} 
+0

ну вы не дали нам фактический код ... только макет, мы не можем помочь вам без части java. также, какова фактическая проблема? когда вы проверяете родительский флажок, что происходит? –

+0

с этим кодом, когда я выбираю родительский флажок, ни один из дочерних элементов не будет выбран, но я хочу, чтобы все дочерние элементы были выбраны. –

+0

Мне нужна эта часть кода. –

ответ

0

, но вы же понимаете, что ExpandableListView работать как то, что я просил вас ..? , когда вы нажимаете на родителя, родительский расширяет (если вы не заявляете иначе), и когда вы снова нажимаете на него, родительский обрушивает .. , если вы хотите иметь возможность развернуть родителя, а также проверить и снять флажок родительского флажка нужно дать два представления в одной строке родителя, первый - это флажок, а второй - родительский заголовок (который может быть пустым, как «») они должны быть рядом.

вы можете сделать Somthing так:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/Rl11" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_margin="5dp" 
android:background="@drawable/desserts_main_expand" 
android:orientation="horizontal" > 

<ImageView 
    android:id="@+id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:clickable="true" 
    android:cropToPadding="true" 
    android:padding="4dp" 
    android:scaleType="fitXY" 
    android:src="@android:drawable/ic_menu_add" /> 

<TextView 
    android:id="@+id/ParentTextI" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="10dp" 
    android:layout_marginTop="10dp" 
    android:layout_toLeftOf="@+id/addIng" 
    android:layout_toRightOf="@+id/Side_image" 
    android:gravity="center_vertical" 
    android:scrollHorizontally="true" 
    android:text="dummy text" 
    android:textAlignment="center" 
    android:textColor="@color/white" 
    android:textSize="20sp" 
    android:textStyle="bold|italic" /> 
</RelativeLayout> 

, а затем в адаптере:

объявить глобальную переменную

CheckBox checkbox; 

** это только для родительского CheckBox части

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 
     ViewGroup parent) { 
checkbox.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        if(checkbox.isChecked()=true) 
         {checkbox.setChecked(false);} 
        else checkbox.setChecked(true); 
       ParentActivity.checkall(); 
       } 
      }); 

, а затем в ParentActivity:

добавить функцию, которая проверяет каждый ребенок одного и тот же родитель:

public static void checkall() 
{ 
for(int j=0 ; j<files.size() ; j++) 
{if (listAdapter.checkbox.isChecked()==true) 
{files.get(j).setChecked(true)}; 
} 

Я сделал код специально для вас, так что может быть какая-то причина ошибки я havnt проверила это .. , но это должно быть что-то вроде этого.

Смежные вопросы