如何使用ListView选项来确定Android中另一个ListView中的列表?

时间:2013-11-03 00:12:54

标签: android listview android-listview spinner android-arrayadapter

我试图在一个ListView中使用选择来确定另一个ListView中显示的列表到四个维度。例如,第一个列表是:

  

A,B,C

然后通过选择列表A,你会得到

  

1,2,3

和B将返回。

  

4,5,6

如果选择1则

  

I,II,III。

选择5将返回另一个列表,依此类推。这将继续到最后的最终列表,最终将是用户的选择。

最后的ListView,将会有大约380个不同的列表。如果选择A然后是2然后XII则显示正确的列表。据推测,我可以根据选择将列表命名为A2XII,然后按名称调用列表。

目前,我的理论是设置第一个ListView,然后在Listener中使其成为INVISIBLE并使其成为下一个VISIBLE。然后使用先前的选择来确定适配器使用的列表。

所以我的问题是:如何从一个列表中选择并按名称确定下一个列表?

        package org.wmu.LMWTA;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

        import org.wmu.LMWTA.R;

        public class Frag_Form extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View V = (LinearLayout)inflater.inflate(R.layout.form_layout, container, false);
        if (container == null) {
            return null;
        }

        final ListView cityList = (ListView) V.findViewById(R.id.list_city);
        final ListView cat = (ListView) V.findViewById(R.id.cat);
        ArrayAdapter<CharSequence> cityAdapt = ArrayAdapter.createFromResource(getActivity(),
                R.array.cities, android.R.layout.simple_spinner_dropdown_item);
        ArrayAdapter<CharSequence> catAdapt = ArrayAdapter.createFromResource(getActivity(),
                R.array.cat, android.R.layout.simple_spinner_dropdown_item);
        //ArrayAdapter<CharSequence> catAdapt = ArrayAdapter.createFromResource(getActivity(),
        //        R.array.subCat, android.R.layout.simple_spinner_dropdown_item);

        cat.setAdapter(catAdapt);
        cat.setVisibility(View.GONE);
        cityList.setAdapter(cityAdapt);
        cityList.setOnItemClickListener( new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show toast
                Toast.makeText(parent.getContext(),
                (CharSequence) cityList.getItemAtPosition(position).toString().replaceAll("\\s+", ""), Toast.LENGTH_SHORT).show();
                cityList.setVisibility(View.GONE);
                cat.setVisibility(View.VISIBLE);
            }
        });
        return V;
    }
}

如果有更好的方法,我会非常感谢知道答案。我的第一个想法是使用Spinners但是我遇到了同样的问题而没有在更多Switch中嵌套380个开关。

2 个答案:

答案 0 :(得分:1)

不是使用大量的ListView,而是根据前一个ListView中的选择为每个维度使用一个大型数据结构和一个ListView。

例如,您可能拥有一个位置按大陆,国家,地区和城市划分的数据结构。每个大陆都有一份国家名单;每个国家都有一份地区清单;每个地区都有一个城市列表。根据数据集的比例,这可以作为一系列嵌套列表实现,或者您可以从数据库,Web服务或其他外部机制动态检索下一级别。

最初你会有一个显示大陆的ListView。用户选择一个后,所选索引将为您提供填充下一个ListView的国家/地区列表,以及区域和城市等等。

答案 1 :(得分:0)

设置数组,使它们包含它们所属的上一个列表项的索引。

<string-array name="level_1">
        <item>A</item>
        <item>B</item>
        <item>C</item>
</string-array>

接下来的三个数组是依赖于level_1的数组

<string-array name="level_2_sub00">
        <item>1</item>
        <item>2</item>
        <item>3</item>
</string-array>

<string-array name="level_2_sub01">
        <item>4</item>
        <item>5</item>
        <item>6</item>
</string-array>

第一个level3数组:

<string-array name="level_3_sub00">
        <item>I</item>
        <item>II</item>
        <item>III</item>
</string-array>

现在您只需要使用所选项目的位置来计算下一个数组的名称:

String level2_arrayname = "level_2_sub" + String.valueof(position);
int resourceIdNext = getActivity().getResources.getIdentifier(level2_arrayname, "array", mypackagename);