如何创建仅包含某些可扩展项目的列表?

时间:2010-06-08 02:34:07

标签: android list android-arrayadapter expandablelistview

我正在尝试撰写一个列表,其中包含一些可扩展的项目和一些单项。我希望这样,当单击一个项目或可扩展列表子项时,我可以根据项目的文本调用intent。

我认为可扩展列表可以工作,但有没有办法在可扩展列表中设置项目,以便它们没有可扩展列表图标?我应该使用字符串数组以外的东西吗?

这样做的最佳方式是什么?

由于

以下是我的不完整代码,我想在“亚特兰大”和“波士顿”之间插入项目“区域1”,“区域2”,“区域3”或作为亚特兰大的子集:

package test.lists.special;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class SpecialList extends ListActivity{
TextView toptext;
String[] items={"Atlanta", "Boston", "Chicago", "Dallas"};

@Override

 public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.main);
  setListAdapter(new ArrayAdapter<String>(this,
  android.R.layout.simple_list_item_1,
  items));
  toptext=(TextView)findViewById(R.id.toptext);
 }

public void onListItemClick(ListView parent, View v, int position,
 long id) {
     Intent intent = new Intent();

     if (parent.getItemAtPosition(position)=="Atlanta")
     {
           //THIS IS WHERE I WISH TO INSERT "ZONE 1", "ZONE 2", "ZONE 3" 
                  //between Atlanta and Boston in the list
     }
     else if (parent.getItemAtPosition(position)=="Boston")
     {
          intent.setClass(this, test.lists.special.Boston.class);
           startActivity(intent); 
     }
     else if (parent.getItemAtPosition(position)=="Chicago")
     {
             intent.setClass(this, test.lists.special.Chicago.class);
              startActivity(intent); 
     }
     else if (parent.getItemAtPosition(position)=="Dallas")
     {
            intent.setClass(this, test.lists.special.Dallas.class);
             startActivity(intent); 
     }
     else if (parent.getItemAtPosition(position)=="Zone 1")
     {
            intent.setClass(this, test.lists.special.Atlanta.Zone1.class);
             startActivity(intent); 
     }
     else if (parent.getItemAtPosition(position)=="Zone 2")
     {
            intent.setClass(this, test.lists.special.Atlanta.Zone2.class);
             startActivity(intent); 
     }
     else if (parent.getItemAtPosition(position)=="Zone 3")
     {
            intent.setClass(this, test.lists.special.Atlanta.Zone3.class);
             startActivity(intent); 
     }
    }

}

2 个答案:

答案 0 :(得分:5)

下面的工作和测试代码:

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View; 
import android.view.ViewGroup;
import android.widget.ArrayAdapter; 
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class SpecialList extends ListActivity{ 

    TextView toptext; 
    String[] items={"Atlanta", "Boston", "Chicago", "Dallas"};
    private CityListAdapter mListOfCities;

    boolean mAtlantaListExpanded;

    @Override 
    public void onCreate(Bundle icicle) { 
        super.onCreate(icicle); 
        setContentView(R.layout.main); 

        mAtlantaListExpanded = false;
        mListOfCities = new CityListAdapter();
        setListAdapter(mListOfCities);

        for (int n=0; n < items.length; n++)
        {
            mListOfCities.add(items[n]);
        }
    } 

    public void onListItemClick(ListView parent, View v, int position, long id) 
    { 
         Intent intent = new Intent(); 

         if (parent.getItemAtPosition(position)=="Atlanta") 
         { 
             mAtlantaListExpanded = !mAtlantaListExpanded;
             mListOfCities.clear();
             for (int n=0; n < items.length; n++)
             {
                mListOfCities.add(items[n]);
             }           
             Log.i("SpecialList", "Atlanta");            
         } 
         else if (parent.getItemAtPosition(position)=="Boston") 
         { 
             Log.i("SpecialList", "Boston");
         } 
         else if (parent.getItemAtPosition(position)=="Chicago") 
         { 
             Log.i("SpecialList", "Chicago");
         } 
         else if (parent.getItemAtPosition(position)=="Dallas") 
         { 
             Log.i("SpecialList", "Dallas");
         } 
    }

    class CityListAdapter extends ArrayAdapter<String> {    

        CityListAdapter() {         
            super(SpecialList.this, R.layout.one_city_row);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            View row = null;
            LayoutInflater inflater = getLayoutInflater();

            if ((position == 0) && (!mAtlantaListExpanded))
            {
                row = inflater.inflate(R.layout.expandable_city_row, parent, false);
                TextView city = (TextView) row.findViewById(R.id.Expandable_TextView01);
                city.setText(items[position]);

                TextView cityZone1 = (TextView) row.findViewById(R.id.Zone_TextView01);
                cityZone1.setText("Zone 1");

                TextView cityZone2 = (TextView) row.findViewById(R.id.Zone_TextView02);
                cityZone2.setText("Zone 2");

                TextView cityZone3 = (TextView) row.findViewById(R.id.Zone_TextView03);
                cityZone3.setText("Zone 3");

                cityZone1.setOnClickListener(
                    new Button.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                             Log.i("SpecialList", "Zone 1");
                        }
                    }
                );

                cityZone2.setOnClickListener(
                    new Button.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                             Log.i("SpecialList", "Zone 2");
                        }
                    }
                );

                cityZone3.setOnClickListener(
                    new Button.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                             Log.i("SpecialList", "Zone 3");
                        }
                    }
                );              
            }
            else
            {
                row = inflater.inflate(R.layout.one_city_row, parent, false);
                TextView city = (TextView) row.findViewById(R.id.City_TextView01);
                city.setText(items[position]);
            }                   

            return(row);
        }
    }
} 

单击“亚特兰大”会导致重绘列表,在仅显示“亚特兰大”或扩展列表之间切换。 R.layout.one_city_row.xml是带有一个TextView的简单布局,R.layout.Expandable_city_row.xml有另外的子选项作为TextView元素,可以从附加的代码片段中得出结论。

使用此方法,您可以根据需要完全自定义列表。在我放置Log.i()的地方,你应该把你的意图。

答案 1 :(得分:-1)

如果我已经理解了你的问题,那么你想要的是一行中包含不同元素的项目列表,具体取决于项目的类型。

我建议您扩展BaseAdapter类并创建自己的行。通过这种方式,您可以根据类型控制当前行的打印方式,显示或隐藏任何内容。

在官方Android文档中,API Demos - ImageSwitcher部分你会找到一个例子。