android中的可扩展列表

时间:2012-08-10 06:50:08

标签: android xml-parsing expandablelistview

我开发了一个xml解析exmaple.here我必须使用expandable listview.but我不能开发这个。请帮我锄头做。

这是代码:

 public class CustomExpandableListExampleActivity extends ExpandableListActivity {

ExpandableListAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set up our adapter
    mAdapter = new MyExpandableListAdapter();
    setListAdapter(mAdapter);
    registerForContextMenu(getExpandableListView());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Sample menu");
    menu.add(0, 0, 0, "Sample action");
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

    String title = ((TextView) info.targetView).getText().toString();

    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
        Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,
                Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    // Sample data set.  children[i] contains the children (String[]) for groups[i].
    private String[] groups = { "Order Info", "Customer Info" };
    private String[][] children = {
            { "abc", "xyz", "ash", "anu" },
            { "SSE", "TJ", "PM", "SE" },

    };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

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

    public int getChildrenCount(int groupPosition) {
        return children[groupPosition].length;
    }

    public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);

        TextView textView = new TextView(CustomExpandableListExampleActivity.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding(36, 0, 0, 0);
        return textView;
    }

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
            View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
    }

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    public int getGroupCount() {
        return groups.length;
    }

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

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

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

    public boolean hasStableIds() {
        return true;
    }

  }
 }

这里上面的代码在orderinfomation上有子项(abc,xyz,ash,anu)项目。但如果我点击orderinfo意味着它被扩展并希望显示这个单一的名称值(payment_method,subtotal,discount)。如何做。请帮帮我。

public class SingleMenuItemActivity  extends Activity {

// XML node keys
static final String KEY_ARTIST = "payment_method";
static final String KEY_SUBTOTAL = "subtotal";
static final String KEY_DISCOUNT = "discount";
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_list_item);

    // getting intent data
    Intent in = getIntent();

    // Get XML values from previous intent
    String subtotal = in.getStringExtra(KEY_SUBTOTAL);
    String discount = in.getStringExtra(KEY_DISCOUNT);
    String payment_method = in.getStringExtra(KEY_ARTIST);
    TextView lblSub = (TextView) findViewById(R.id.subtotal_label);

    TextView lblPayment = (TextView) findViewById(R.id.payment_label);
    TextView lbldiscount = (TextView) findViewById(R.id.discount_label);
    lblSub.setText(subtotal);
    lbldiscount.setText(discount);
    lblPayment.setText(payment_method);
     }
       } 

2 个答案:

答案 0 :(得分:1)

在这里,您可以使用ExpandableListView创建xml文件并获取对您的活动的参考。创建一个如下所示的适配器。从您设置项目的活动如下

           Map<String, List<CommonTask>> map = new HashMap<String, List<CommonTask>>();

    List<CommonTask> childItem1 = new ArrayList<CommonTask>();
    childItem1.add(new CommonTask("Child 1"));


    List<CommonTask> childItem2 = new ArrayList<CommonTask>();
         childItem2.add(new CommonTask("Child 2"));

            map.put("Parent 1", childItem1);
    map.put("Parent 2", childItem2);

          // Set on listview ExpandableListView reference

           expandListView.setAdapter(adapter);

public class ExpandableListViewAdapter扩展了BaseExpandableListAdapter {

private static final class ViewHolder {
    TextView textLabel;
    TextView groupTextLabel;

}

private final Map.Entry<Object, List<Object>> entries[];

private final LayoutInflater inflater;


public ExpandableListViewAdapter(final Context theContext,
        final Map<String, List<CommonTask>> map) {
    inflater = LayoutInflater.from(theContext);

    entries = map.entrySet().toArray(new Map.Entry[0]);

}

@Override
public Object getChild(final int groupPosition, final int childPosition) {
    final List<Object> childList = entries[groupPosition].getValue();

    return childList.get(childPosition);
}

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

@Override
public int getChildrenCount(final int groupPosition) {

    final List<Object> childList = entries[groupPosition].getValue();

    final int childCount = childList.size();

    return childCount;
}

@Override
public View getChildView(final int groupPosition, final int childPosition,
        final boolean isLastChild, final View theConvertView,
        final ViewGroup parent) {
    View resultView = theConvertView;

    ViewHolder holder = null;

    if (resultView == null) {
        resultView = inflater.inflate(R.layout.child_layout, null);

        holder = new ViewHolder();

        holder.textLabel = (TextView) resultView.findViewById(R.id.title);

        resultView.setTag(holder);
    } else {
        holder = (ViewHolder) resultView.getTag();
    }

    final Object item = getChild(groupPosition, childPosition);
    CommonTask commonTask = (CommonTask) item;
    holder.textLabel.setText(commonTask.getName());

    return resultView;
}

@Override
public Object getGroup(final int groupPosition) {
    return entries[groupPosition].getKey();
}

@Override
public int getGroupCount() {
    final int groupCount = entries.length;

    return groupCount;
}

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

@Override
public View getGroupView(final int groupPosition, final boolean isExpanded,
        final View theConvertView, final ViewGroup parent) {
    View resultView = theConvertView;

    ViewHolder holder = null;

    if (resultView == null) {
        resultView = inflater.inflate(R.layout.group_layout, null);

        holder = new ViewHolder();
        holder.groupTextLabel = (TextView) resultView
                .findViewById(R.id.tvGroup);

        resultView.setTag(holder);
    } else {
        holder = (ViewHolder) resultView.getTag();
    }

    final Object item = getGroup(groupPosition);

    holder.groupTextLabel.setText(item.toString());

    return resultView;
}

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

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

}

答案 1 :(得分:0)

首先为可扩展列表创建main.xml,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <ExpandableListView
        android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:groupIndicator="@drawable/group_indicator"

        android:layout_weight="1" >
    </ExpandableListView>      
</TextView>    



</LinearLayout>

然后为group_row.xml创建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/tvGroupName" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:textStyle="bold"
android:layout_gravity="center_vertical"
    android:paddingLeft="30dp"
    android:gravity="center_vertical" />
</LinearLayout>

然后编写child_row.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/tvPlayerName" 
    android:paddingLeft="50dp"   
    android:layout_width="wrap_content" 
    android:layout_height="30dip" 

    android:gravity="center_vertical">

</TextView>    
</LinearLayout>

现在在drawable文件夹中创建group_indicator.xml文件以定义可扩展列表的样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_empty="true" android:drawable="@android:color/transparent"></item>

    <item android:state_expanded="true" android:drawable="@android:color/transparent"></item>
    <item android:drawable="@android:color/transparent"></item>
</selector>

现在创建ExpList.java Activity类来编写代码,

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

public class ExpList extends ExpandableListActivity
{

    static final String arrGroupelements[] = 
        {
        "India",
        "Australia",
        "England",
        "South Africa"
        };

    static final String arrChildelements[][] = 
        {
        {
            "Sachin Tendulkar",
            "Raina",
            "Dhoni",
            "Yuvi"
        },
        {
            "Ponting",
            "Adam Gilchrist",
            "Michael Clarke"
        },
        {
            "Andrew Strauss",
            "kevin Peterson",
            "Nasser Hussain"
        },
        {
            "Graeme Smith",
            "AB de villiers",
            "Jacques Kallis"
        }
        };

    DisplayMetrics metrics;
    int width;
    ExpandableListView expList;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        expList = getExpandableListView();
        metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        width = metrics.widthPixels;

//        this code for adjusting the group indicator into right side of the view
        expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
        expList.setAdapter(new ExpAdapter(this));


        int groupPosition = 0;
        expList.expandGroup(0);

//        if (listView.isGroupExpanded(groupPosition))
//            listView.collapseGroup(groupPosition);
//        else
//            listView.expandGroup(groupPosition);

        expList.setOnGroupExpandListener(new OnGroupExpandListener()
        {
            @Override
            public void onGroupExpand(int groupPosition) 
            {
                Log.d("onGroupExpand", "OK");
            }
        });

        expList.setOnGroupCollapseListener(new OnGroupCollapseListener()
        {
            @Override
            public void onGroupCollapse(int groupPosition) 
            {
                Log.d("onGroupCollapse", "OK");
            }
        });

        expList.setOnChildClickListener(new OnChildClickListener()
        {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) 
            {
                Toast.makeText(getApplicationContext(), "" +  childPosition , Toast.LENGTH_LONG).show();
                Log.d("OnChildClickListener", "OK");
                return false;
            }
        });
    }

    public int GetDipsFromPixel(float pixels)
    {
//      Get the screen's density scale
        final float scale = getResources().getDisplayMetrics().density;
//      Convert the dps to pixels, based on density scale
        return (int) (pixels * scale + 0.5f);
    }
}

现在,最后一件事是为可扩展列表创建一个适配器ExpAdapter.java,

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 ExpAdapter extends BaseExpandableListAdapter {

    static final String arrGroupelements[] = 
    {
   "India",
   "Australia",
   "England",
   "South Africa"
 };

    /**
  * strings for child elements
  */
 static final String arrChildelements[][] = 
 {
   {
  "Sachin Tendulkar",
  "Raina",
  "Dhoni",
  "Yuvi"
   },
   {
  "Ponting",
  "Adam Gilchrist",
  "Michael Clarke"
   },
   {
  "Andrew Strauss",
  "kevin Peterson",
  "Nasser Hussain"
   },
   {
  "Graeme Smith",
  "AB de villiers",
  "Jacques Kallis"
   }
    };
      private Context myContext;
      public ExpAdapter(Context context) {
       myContext = context;
      }
      @Override
      public Object getChild(int groupPosition, int childPosition) {
       return null;
      }

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

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

       if (convertView == null) {
        LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.child_row, null);
       }

       TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
       tvPlayerName.setText(arrChildelements[groupPosition][childPosition]);

       return convertView;
      }

      @Override
      public int getChildrenCount(int groupPosition) {
       return arrChildelements[groupPosition].length;
      }

      @Override
      public Object getGroup(int groupPosition) {
       return null;
      }

      @Override
      public int getGroupCount() {
       return arrGroupelements.length;
      }

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

      @Override
      public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {

       if (convertView == null) {
        LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.group_row, null);
       }

       TextView tvGroupName = (TextView) convertView.findViewById(R.id.tvGroupName);
       tvGroupName.setText(arrGroupelements[groupPosition]);

       return convertView;
      }

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

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

在这里,编译并运行代码。 希望它有所帮助。