如何在另一个列表视图中显示其各自组项的子项

Posted

技术标签:

【中文标题】如何在另一个列表视图中显示其各自组项的子项【英文标题】:How to display child items of its respective group item in another listview 【发布时间】:2015-05-02 10:37:13 【问题描述】:

我想将可扩展列表视图中可用的相应组项的子项显示到单独的列表视图中。

我做了以下,

package com.example.demo_data1;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayout.DrawerListener;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast;

@SuppressLint("NewApi")
public class DrawerLayoutTest extends Activity implements OnChildClickListener 

private DrawerLayout drawer;
private ExpandableListView drawerList;
private ActionBarDrawerToggle actionBarDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawer_layout_test);

    setGroupData();
    setChildGroupData();

    initDrawer();


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


private void initDrawer() 
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    drawerList = (ExpandableListView) findViewById(R.id.left_drawer);

    drawerList.setAdapter(new NewAdapter(this, groupItem, childItem));

    drawerList.setOnChildClickListener(this);

    // actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer,
    // R.drawable.ic_drawer, R.string.open_drawer,
    // R.string.close_drawer) 
    // public void onDrawerClosed(View view) 
    // getActionBar().setSubtitle("open");
    // 
    //
    // /** Called when a drawer has settled in a completely open state. */
    // public void onDrawerOpened(View drawerView) 
    // getActionBar().setSubtitle("close");
    // 
    //
    // ;
    //
    // drawer.setDrawerListener(actionBarDrawerToggle);



public void setGroupData() 
    groupItem.add("TECHNOLOGY");
    groupItem.add("MOBILE");
    groupItem.add("MANUFACTURER");
    groupItem.add("EXTRAS");


ArrayList<String> groupItem = new ArrayList<String>();
ArrayList<Object> childItem = new ArrayList<Object>();

public void setChildGroupData() 
    /**
     * Add Data For TecthNology
     */
    ArrayList<String> child = new ArrayList<String>();
    child.add("Java");
    child.add("Drupal");
    child.add(".Net Framework");
    child.add("php");
    childItem.add(child);

    /**
     * Add Data For Mobile
     */
    child = new ArrayList<String>();
    child.add("Android");
    child.add("Window Mobile");
    child.add("iPHone");
    child.add("Blackberry");
    childItem.add(child);
    /**
     * Add Data For Manufacture
     */
    child = new ArrayList<String>();
    child.add("HTC");
    child.add("Apple");
    child.add("Samsung");
    child.add("Nokia");
    childItem.add(child);
    /**
     * Add Data For Extras
     */
    child = new ArrayList<String>();
    child.add("Contact Us");
    child.add("About Us");
    child.add("Location");
    child.add("Root Cause");
    childItem.add(child);



public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) 
    switch (groupPosition)
    
    case 0:
            switch (childPosition)
            
            case 0:
               MainActivity();
               break;
            case 1:
                //
            

    
    return false;


private void MainActivity()
Intent myIntent = new Intent(this, MainActivity.class);
startActivity(myIntent);


现在在上面的代码中,子项显示在同一列表视图中的组项下方,而不是我想在组项列表视图旁边的不同列表视图中显示子项。

请帮我解决这个问题,卡住了很长时间。

对此的任何帮助将不胜感激。

【问题讨论】:

将子数组列表用于另一个列表视图 你能帮我解释一下逻辑或某些例子吗? 您到底想要什么?当您单击您的组项目然后打开新活动并有一个列表视图? 不,不,当我单击组项目时,它不会打开新活动,子项目应显示在同一活动中,而是在同一列表视图中的组项目下方打开,它应显示在同一活动中的另一个列表视图中. 【参考方案1】:

使用此代码

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:baselineAligned="false"
android:orientation="vertical"
tools:context="com.example.listtest.MainActivity" >




<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_
    android:layout_
    android:layout_weight="1" >

    <!-- Drawer Content -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_
        android:layout_>


    </FrameLayout>

    <!-- The navigation menu -->

    <ListView 
        android:id="@+id/left_drawer_child"
        android:layout_
        android:layout_
        android:choiceMode="singleChoice"
                android:layout_gravity="start"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="@android:color/white" />
</android.support.v4.widget.DrawerLayout>

MainActivity.java

public class MainActivity extends FragmentActivity 
private DrawerLayout mDrawerLayout;
Fragment fragment = null;
ListView mainlist;
ArrayList<String> formain = new ArrayList<String>();


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainlist = (ListView) findViewById(R.id.left_drawer_child);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent));
    mDrawerLayout.setDrawerListener(mDrawerListener);
//  childlist = (ListView) findViewById(R.id.listView2);
    formain.add("TECHNOLOGY");
    formain.add("MOBILE");
    formain.add("MANUFACTURER");
    formain.add("EXTRAS");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,formain);
    mainlist.setAdapter(adapter);
    mDrawerLayout.openDrawer(mainlist);
    mainlist.setOnItemClickListener(new OnItemClickListener() 

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
            // TODO Auto-generated method stub
            String getGroup = formain.get(arg2);
            if (getGroup == "TECHNOLOGY")
                fragment = new TechnologyFragment(); 
                    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();
                mDrawerLayout.closeDrawer(mainlist);
            
            if (getGroup == "MOBILE")
             //fragment for mobile
            
            if (getGroup == "MANUFACTURER")
                //fragment for manufacturer
            
            if (getGroup == "EXTRAS")
            //fragment for extras
            


        
    );


private DrawerListener mDrawerListener = new DrawerListener() 

    @Override
    public void onDrawerStateChanged(int status) 

    

    @Override
    public void onDrawerSlide(View view, float slideArg) 

    

    @Override
    public void onDrawerOpened(View view) 
    

    @Override
    public void onDrawerClosed(View view) 
    
;

technology_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >

<ListView
    android:id="@+id/listView1"
    android:layout_
    android:layout_ >
</ListView>

</LinearLayout>

TechnologyFragment.java

public class TechnologyFragment extends Fragment 

ListView techlist;
ArrayList<String> forchild = new ArrayList<String>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    View rootView = inflater.inflate(R.layout.technology_fragment, null);
    techlist = (ListView) rootView.findViewById(R.id.listView1);
    forchild.add("Java");
    forchild.add("Drupal");
    forchild.add(".Net Framework");
        forchild.add("PHP");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,forchild);
        techlist.setAdapter(adapter);

    return rootView;



【讨论】:

这里的问题是,每次我单击组项时,子项都会重复多次,这不应该发生,而是当我第二次单击组项时它应该隐藏子项。 @Jigarpatel ..您可以根据需要管理代码...为所有组项展开if条件,每次点击清除列表视图.. 列表视图应该像导航抽屉一样被隐藏并且应该出现在屏幕的幻灯片上 然后在导航抽屉中添加listview ...并采用框架布局...为每个组项制作片段并使用其适配器在每个片段中采用listview 请帮助我解决同样的问题,请帮助我解决这个问题【参考方案2】:

使用 Normal ListView 和 Fragments 代替 ExpandableListView。

在 Fragment 1 中显示父列表,然后单击父 1 中的项目将显示在列表中包含子项目的片段 2。

【讨论】:

能否请您发布一些相同的代码,不好意思打扰您,但我对此有点陌生。

以上是关于如何在另一个列表视图中显示其各自组项的子项的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用列表视图中的子项(使其颜色为灰色且不可点击)

如何将带有列表视图的小部件限制为其子项的大小?

当父母在Android中折叠时如何更改可扩展列表视图子项的视图?

Drupal 视图中自定义表记录项的编辑链接

Flex 在列表项的视图之间传递数据

具有可扩展列表视图项的Android列表视图