【问题标题】:Android: CheckBox treeAndroid:复选框树
【发布时间】:2013-11-18 08:02:34
【问题描述】:

在我的应用程序中,我有一个列表和一个按钮,在我的列表中,当我选择父项时,我想要选择所有子项,确实我想要一个复选框树。我使用可扩展列表视图,但我的代码有问题:

我的代码是: 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;
    }
}

父活动:

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);

    }
}

【问题讨论】:

  • 好吧,你没有给我们实际的代码..只有布局,如果没有 java 部分,我们无法帮助你。另外,实际问题是什么?当您检查父复选框时会发生什么?
  • 当我选择父复选框时,使用此代码不会选择任何子项,但我希望选择所有子项。
  • 我需要那个代码部分..
  • 您想在按下父复选框时检查所有子项对吗?那部分的代码在哪里?
  • 是的,我的问题是,我不知道该怎么做?

标签: android checkbox expandablelistview


【解决方案1】:

但您确实了解 ExpandableListView 的工作方式就像我问您的那样......? 当您按下父级时,父级会展开(除非您另有说明),而当您再次单击它时,父级会崩溃.. 如果您希望能够扩展父级并且还能够选中和取消选中父级复选框,您需要在父级的同一行中提供两个视图,第一个是复选框,第二个是父级标题(可以像“”一样为空) 他们应该并排。

你可以这样做:

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

**这仅适用于父复选框部分

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

我专门为你制作了代码,所以可能有一些错误,因为我没有检查它.. 但它应该是这样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多