为expandablelistview的子项创建单独的onClick()方法

时间:2013-04-11 01:56:03

标签: android expandablelistview buttonclick

我有一个expandablelistview,如下所示。我已经做到这一点,以便在点击每个孩子时弹出一个Toast消息。我需要每个孩子开始他们自己的活动/片段,这需要单独的onClick()方法。有谁知道如何实现这一目标?谢谢。注意:我使用的是SimonVT的slidemenu库,我对android编程很新。

MainActivity.java:

package press.linx.expandablelistdemo;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.xml.sax.SAXException;

import net.simonvt.menudrawer.MenuDrawer;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

ExpandableListView exv;
MenuDrawer mDrawer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDrawer = MenuDrawer.attach(this);
    mDrawer.setContentView(R.layout.activity_main);
    mDrawer.setMenuView(R.layout.leftmenu);

    exv=(ExpandableListView)findViewById(R.id.expandableListView1);
    exv.setAdapter(new MyAdapter(this));

    exv.setOnChildClickListener(new OnChildClickListener() {

        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                int groupPosition, int childPosition, long id) {
            // TODO Auto-generated method stub
            String itemclicked = MyAdapter.childList[groupPosition][childPosition];
            Toast.makeText(getApplicationContext(), "you clicked " + itemclicked, Toast.LENGTH_SHORT).show();
            return false;
        }

    });
}

private void setListAdapter(SimpleAdapter adapter) {
    // TODO Auto-generated method stub

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

MyAdapter.java

package press.linx.expandablelistdemo;


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

public class MyAdapter extends BaseExpandableListAdapter {
private Context context;
Typeface typeface;
String []parentList = {"Tech", "Best Of", "Art & Design", "Other"};

static String [][] childList = {
        {
            "All Tech", "Reviews", "Gaming", "Gadgets"
        },
        {
            "Android"
        },
        {
            "Architecture"
        },
        {
            "Infographics"
        }
};
public MyAdapter(Context context) {
    // TODO Auto-generated constructor stub
    this.context=context;

}

@Override
public Object getChild(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getChildId(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
        ViewGroup parent) {
    // TODO Auto-generated method stub
    //typeface = Typeface.createFromAsset(context.getAssets(), "font/robotochild.ttf"); 
    TextView tv = new TextView(context);
    tv.setText(childList[groupPosition][childPosition]);
    tv.setPadding(30, 10, 0, 10);
    tv.setTextSize(15);
    //tv.setTypeface(typeface); 
    tv.setTextColor(Color.WHITE);
    return tv;
}

@Override
public int getChildrenCount(int groupPosition) {
    // TODO Auto-generated method stub
    return childList[groupPosition].length;
}

@Override
public Object getGroup(int groupPosition) {
    // TODO Auto-generated method stub
    return groupPosition;
}

@Override
public int getGroupCount() {
    // TODO Auto-generated method stub
    return parentList.length;
}

@Override
public long getGroupId(int groupPosition) {
    // TODO Auto-generated method stub
    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    TextView tv = new TextView(context);
    typeface = Typeface.createFromAsset(context.getAssets(), "font/roboto.ttf"); 
    tv.setText(parentList[groupPosition]);
    tv.setPadding(50, 10, 0, 10);
    tv.setTextSize(20);
    tv.setTextColor(Color.WHITE);
    tv.setTypeface(typeface); 
    return tv;
}

@Override
public boolean hasStableIds() {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    // TODO Auto-generated method stub
    return true;
}

}

menulistview.xml

<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" 
android:background="@drawable/geowall">

<ExpandableListView
    android:id="@+id/expandableListView1"
    android:groupIndicator="@null"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:padding="3dp" >
</ExpandableListView>

HERE

2 个答案:

答案 0 :(得分:0)

如果您希望每个按钮具有不同的功能,请考虑将它们存储为按钮“tag属性(在XML布局中)”。 View v监听器中的onChildClick参数是被点击的孩子的View;然后可以使用它来检索标记,如下所示:

v.getTag();

你可以有一个switch-case块来根据标记调用正确的活动,或者在标记中存储活动的完全名称,并通过反射传递它以检索类为了活动。或者,您可以将标记名称HashMap映射到Activity类/变量。

答案 1 :(得分:0)

这可能是你在找。

让我们开始在Eclipse IDE中创建一个项目。

  1. 转到文件⇒新建Android项目创建一个新项目。填写所有详细信息并将您的活动命名为AndroidListViewActivity。
  2. 创建项目后,打开主活动java文件(本例中为AndroidListViewActivity.java)并从ListActivity扩展该类。
  3. public class AndroidListViewActivity扩展ListActivity { 3.现在我们需要一个字符串资源文件来存储所有列表项标签。因此,在values文件夹下创建一个XML文件,并将其命名为list_data.xml并粘贴以下代码。 (右键单击res /values⇒新的⇒AndroidXML文件)

    list_data.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="adobe_products">
            <item>Adobe After Effects</item>
            <item>Adobe Bridge</item>
            <item>Adobe Dreamweaver</item>
            <item>Adobe Edge</item>
            <item>Adobe Fireworks</item>
            <item>Adobe Flash</item>
            <item>Adobe Photoshop</item>
            <item>Adobe Premiere</item>
            <item>Adobe Reader</item>
            <item>Adobe Illustrator</item>
        </string-array>
    </resources>
    
    1. 在ListView中,每个列表项都是一个xml布局,因此我们可以自定义每个列表项。在res / layout文件夹下创建一个XML文件,并将其命名为list_item.xml并键入以下代码。此xml布局将是单个列表项行。 (右键单击res /layout⇒New⇒AndroidXML File)

    2. 现在打开主活动java文件(AndroidListViewActivity.java)并输入以下代码。在下面的代码中,我将导入所有xml资源数据并将它们存储在Array中。在下一步,我将数组绑定到ListAdapter。

    3. AndroidListViewActivity.java

      package com.androidhive.androidlistview;
      
      import android.app.ListActivity;
      import android.content.Intent;
      import android.os.Bundle;
      import android.view.View;
      import android.widget.AdapterView;
      import android.widget.AdapterView.OnItemClickListener;
      import android.widget.ArrayAdapter;
      import android.widget.ListView;
      import android.widget.TextView;
      
      public class AndroidListViewActivity extends ListActivity {
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              // storing string resources into Array
              String[] adobe_products = getResources().getStringArray(R.array.adobe_products);
      
              // Binding resources Array to ListAdapter
              this.setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, R.id.label, adobe_products));
      
          }
      }
      
      1. 现在运行您的项目,您可以看到包含数组项列表的listview。但是在单击单个列表项时,您可以看到没有操作。因此,我们需要开始选择单个列表项的新活动。
      2. 在选择单个列表项时启动新活动 在我之前的文章中,我已经解释了如何在屏幕之间切换。在这里,我将在新屏幕中显示单个列表项详细信息。

        1. 现在在src文件夹下创建新的活动类。右键单击src / package文件夹⇒New⇒Class并将其命名为SingleListItem。 (SingleListItem.java)
        2. 打开AndroidListViewActivity.java并将代码修改为以下内容。在以下代码中,我将获取所选列表项字符串(产品名称)并将其发送到新活动。
        3. AndroidListViewActivity.java

          package com.androidhive.androidlistview;
          
          import android.app.ListActivity;
          import android.content.Intent;
          import android.os.Bundle;
          import android.view.View;
          import android.widget.AdapterView;
          import android.widget.AdapterView.OnItemClickListener;
          import android.widget.ArrayAdapter;
          import android.widget.ListView;
          import android.widget.TextView;
          
          public class AndroidListViewActivity extends ListActivity {
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
          
                  // storing string resources into Array
                  String[] adobe_products = getResources().getStringArray(R.array.adobe_products);
          
                  // Binding resources Array to ListAdapter
                  this.setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, R.id.label, adobe_products));
          
                  ListView lv = getListView();
          
                  // listening to single list item on click
                  lv.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
          
                        // selected item 
                        String product = ((TextView) view).getText().toString();
          
                        // Launching new Activity on selecting single List Item
                        Intent i = new Intent(getApplicationContext(), SingleListItem.class);
                        // sending data to new activity
                        i.putExtra("product", product);
                        startActivity(i);
          
                    }
                  });
              }
          }
          

          现在,在新活动中,我们需要显示从listview活动收到的内容。

          1. 在res / layout下创建一个新的xml文件,并将其命名为single_list_item_view.xml并键入以下代码。此XML文件将是SingleListItem.java
          2. 的布局

            single_list_item_view.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">
              <TextView android:id="@+id/product_label"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:textSize="25dip"
                        android:textStyle="bold"
                        android:padding="10dip"
                        android:textColor="#ffffff"/>    
            </LinearLayout>
            
            1. 现在打开第二个活动文件,即SingleListItem.java并粘贴以下代码。
            2. SingleListItem.java

              package com.androidhive.androidlistview;
              
              import android.app.Activity;
              import android.content.Intent;
              import android.os.Bundle;
              import android.widget.TextView;
              
              public class SingleListItem extends Activity{
                  @Override
                  public void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      this.setContentView(R.layout.single_list_item_view);
              
                      TextView txtProduct = (TextView) findViewById(R.id.product_label);
              
                      Intent i = getIntent();
                      // getting attached intent data
                      String product = i.getStringExtra("product");
                      // displaying selected product name
                      txtProduct.setText(product);
              
                  }
              }
              
              1. 最后一步是在AndroidManifest.xml文件中添加新活动名称的条目。打开AndroidManifest.xml文件并修改如下代码
              2. 的AndroidManifest.xml

                <?xml version="1.0" encoding="utf-8"?>
                <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                      package="com.androidhive.androidlistview"
                      android:versionCode="1"
                      android:versionName="1.0">
                    <uses-sdk android:minSdkVersion="8" />
                
                    <application android:icon="@drawable/icon" android:label="@string/app_name">
                        <activity android:name=".AndroidListViewActivity"
                                  android:label="Android List View">
                            <intent-filter>
                                <action android:name="android.intent.action.MAIN" />
                                <category android:name="android.intent.category.LAUNCHER" />
                            </intent-filter>
                        </activity>
                
                        <activity android:name=".SingleListItem"
                                    android:label="Single Item Selected"></activity>
                    </application>
                </manifest>
                
                1. 最后通过右键单击项目文件夹⇒运行为⇒1Android应用程序来运行项目。