2010-06-08 4 views
6

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

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

Каков наилучший способ для этого?

Благодаря

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

} 

ответ

0

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

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

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

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