2015-05-07 1 views
0

У меня есть следующая проблема. У меня есть 3 вида объектов:Вложенный список в Android с ArrayAdapter и разными объектными типами

Устройства, Каталоги, Песни

Сейчас я только показывая свои устройства с ArrayAdapter<DeviceDisplay>

Как я могу отобразить все 3 типа в одном списке?

Также я хотел бы показывать только каталоги данного устройства, когда я нажимаю на него в списке, и только песни каталога при нажатии.

Также я использую все внутри фрагмента.

Это как-то достижимо?

код в моем фрагменте:

public class MusicListFragment extends ListFragment { 

    ArrayAdapter<DeviceDisplay> mediaServerAdapter; 
    ArrayList<Device> mediaServers = new ArrayList<Device>(); 
    ArrayList<Container> containers = new ArrayList<Container>(); 
    ArrayList<Item> items = new ArrayList<Item>(); 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.music_list, container, false); 

     getMediaServers(); 

     mediaServerAdapter = new ArrayAdapter<DeviceDisplay>(this.getActivity(), android.R.layout.simple_list_item_1); 
     setListAdapter(mediaServerAdapter); 
     addDevicesToAdapter(); 


     return rootView; 
    } 



    public void getMediaServers(){ 
     Activity a = getActivity(); 
     ArrayList<Device> devices = ((MainActivity) a).getDevices(); 
     for (int i = 0; i < devices.size(); i++) { 
      Device device = devices.get(i); 
      if(device.getType().getType().equals("MediaServer")){ 
       if (!mediaServers.contains(device)) { 
        mediaServers.add(device); 
       } 
      } 
     } 
    } 

    public void addDevicesToAdapter(){ 
     for (int i = 0; i < mediaServers.size() ; i++) { 
      mediaServerAdapter.add(new DeviceDisplay(mediaServers.get(i))); 
      listContent(mediaServers.get(i)); 
     } 
    } 

    public void listContent(Device device){ 

     System.out.println(device.getDisplayString()); 
     Service service = device.findService(new UDAServiceId("ContentDirectory")); 


     ActionCallback browse = new Browse(service, "0", BrowseFlag.DIRECT_CHILDREN) { 

      @Override 
      public void received(ActionInvocation actionInvocation, DIDLContent didl) { 

       //Containers and songs come here. 

      } 

      @Override 
      public void updateStatus(Status status) { 

      } 

      @Override 
      public void failure(ActionInvocation invocation, 
           UpnpResponse operation, 
           String defaultMsg) { 

      } 
     }; 



     ((MainActivity) getActivity()).upnpService.getControlPoint().execute(browse); 
    } 



} 

ответ

1

Может быть, не самый лучший soultion, но вы можете сделать базовый класс для DeviceDisplay, Directories и так далее, Уик выглядит следующим образом:

public abstract class BaseClass { 
    public abstract int getViewType(); 

} 

Тогда расширьте свои классы от него, переопределите getViewType()

И предоставить список как элементы адаптера

Затем переопределить эти методы в адаптере:

@Override 
    public int getViewTypeCount() { 
     return 3; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return items.get(position).getViewType() 
    } 

и в вашем getView вы можете идти так же, как это:

switch (getItemViewType(position)) { 
//Here you know which type this item has and you can draw it whatever you want 
}