Как я могу создать список с возможностью расширения только определенных элементов?

Я пытаюсь составить список с некоторыми расширяемыми элементами и некоторыми отдельными элементами. Я хочу, чтобы при щелчке по одному элементу или расширяемому дочернему списку я мог вызвать намерение на основе текста элемента.

Я предполагаю, что расширяемые списки будут работать, но есть ли способ установить элементы в расширяемом списке, чтобы у них не было значка расширяемого списка? Должен ли я использовать что-то другое, кроме массива строк?

Как лучше всего это сделать?

Спасибо

Ниже мой неполный код, я хотел бы вставить элементы «Зона 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); 
     }
    }

}

person user360964    schedule 08.06.2010    source источник


Ответы (2)


Рабочий и протестированный код ниже:

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(), вы должны поставить свои намерения.

person Zelimir    schedule 20.09.2010

Если я понял вашу проблему, что вам нужно, так это список элементов, который имеет разные элементы в строке, в зависимости от типа элемента.

Я бы порекомендовал вам расширить класс BaseAdapter и создать свою собственную строку. Таким образом, вы контролируете, как текущая строка будет напечатана в зависимости от типа, показывая или скрывая что-либо.

В официальной документации Android, в разделе Демонстрации API — ImageSwitcher, вы найдете пример.

person zegnus    schedule 17.09.2010