2013-08-15 2 views
0

Я пытаюсь заполнить listView внутри фрагмента с помощью настраиваемого макета. Но когда я запускаю приложение, содержимое списка не загружается (это получается с помощью адаптера массива). Вот код, где я загрузить ListView:ListView в фрагменте не отображается

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.activity_start, container, false); 
     ProfilesDatabaseHelper dbHelper = ac.getDbManager(); 
     ProfileManagerDAO dbDao = ac.getProfileManagerDAO(); 
     //TODO mettere profilehandler dentroo profileapp. 
     ProfileHandler handler = new ProfileHandler(view.getContext()); 
     Profile profile = handler.getCurrentProfile(); 
     TextView label = (TextView) view.findViewById(R.id.labelvlm); 
     label.setText("TEST"); 
     if(handler!=null){ 
      label.setText("Ring Volume: " + profile.getRingVolume() + "Max: " 
        + handler.getMaxVolume(AudioManager.STREAM_RING)); 
      label.append("\tVoice Call Volume: " + profile.getCallVolume() 
        + " Max: " + handler.getMaxVolume(AudioManager.STREAM_VOICE_CALL)); 
      //manager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 5, 0); 
      label.append("\tWIFI Status: " + handler.isWifiActive());   
     } 
     Ringtone tone = RingtoneManager.getRingtone(view.getContext(), Settings.System.DEFAULT_RINGTONE_URI); 
     if(tone!=null){ 
      label.append("\n" + tone.getTitle(view.getContext())); 
     } 
     SeekBar bar = (SeekBar) view.findViewById(R.id.ringtonevolumeBar); 
     bar.setMax(handler.getMaxVolume(AudioManager.STREAM_RING));  
     bar.setProgress(profile.getRingVolume()); 
     ArrayList<String> profiles = ac.getProfileManagerDAO().getprofileNamesList(); 
     if(profiles!=null){ 
      Log.d(TAG, "List size: " + profiles.size()); 
      ListView profileslist = (ListView) view.findViewById(R.id.profileslist);    
      adapter = new ProfilesArrayAdapter(view.getContext(), R.layout.list_item, profiles); 
      profileslist.setAdapter(adapter); 
//   List<String> testing = new ArrayList<String>(); 
//   testing.add("Hey"); 
//   testing.add("Hey Do"); 
//   testing.add("Hey It"); 
//   testing.add("Hey Please"); 
//   ArrayAdapter moviesAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, testing); 
//   profileslist.setAdapter(moviesAdapter); 
      //profileslist.setA 
     } 
     return view; 
    } 

Вот код моего CustomAdapter:

public class ProfilesArrayAdapter extends 
    ArrayAdapter<HashMap<String, Integer>> { 

ArrayList<HashMap<String, Integer>> entries; 
int resourceId; 
Context context; 

static class ProfileItemHandler { 
    TextView profileId; 
    TextView profileName; 
} 

public ProfilesArrayAdapter(Context context, int layoutResourceId, ArrayList<HashMap<String,Integer>> profiles) { 
    super(context, layoutResourceId); 
    this.context = context; 
    this.resourceId = layoutResourceId; 
    this.entries = profiles; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ProfileItemHandler handler = null; 
    if(convertView==null){ 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(R.layout.list_item, parent, false); 
     handler = new ProfileItemHandler(); 
     handler.profileId = (TextView) row.findViewById(R.id.profileName); 
     handler.profileName = (TextView) row.findViewById(R.id.profileId); 
     row.setTag(handler); 
    } else { 
     handler = (ProfileItemHandler) row.getTag(); 
    } 
    HashMap<String, Integer> entry = this.getItem(position); 
    for(String cur_entry: entry.keySet()){ 
     handler.profileId.setText(cur_entry); 
     handler.profileName.setText(entry.get(cur_entry)); 
    }    
    return row; 
} 

}

И это XML для разметки элемента списка:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView android:layout_height="wrap_content" android:id="@+id/profileId" android:text="TextView" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content"></TextView> 
    <TextView android:text="TextView" android:id="@+id/profileName" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 

</LinearLayout> 

А вот основной макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_start" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".StartActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/labelvlm" 
     android:text="@string/hello_world" /> 

    <SeekBar 
     android:id="@+id/ringtonevolumeBar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/labelvlm"   
     android:layout_marginTop="122dp" /> 

    <ListView 
     android:id="@+id/profileslist" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignLeft="@+id/ringtonevolumeBar" 
     android:layout_below="@+id/ringtonevolumeBar" 
     android:layout_marginTop="68dp" > 
    </ListView> 

</RelativeLayout> 

У меня нет сообщений об ошибке, но когда я запускаю приложение, в ListView нет элементов, и метод getView моего адаптера никогда не вызывается. Есть идеи?

+0

Я рассмотрел многие вопросы по этой проблеме, но никто, кажется, не решает мою проблему. :( – Ivan

ответ

2

Я нашел проблему. Это было внутри конструктора:

public ProfilesArrayAdapter(Context context, int layoutResourceId, ArrayList<HashMap<String,Integer>> profiles) { 
    super(context, layoutResourceId); 
    this.context = context; 
    this.resourceId = layoutResourceId; 
    this.entries = profiles; 
} 

На первой линии, вызов супер конструктор был неправ. На самом деле, правильный вызов должен быть:

super(context, layoutResourceId, profiles); 

При том, что теперь список заполняется правильно.

1

Моя первая догадка будет (так как вы не получаете никаких сообщений об ошибках), что эта строка:

ArrayList<HashMap<String, Integer>> profiles = ac.getProfileManagerDAO().getprofileList(); 

возвращает пустой ArrayList с размером = 0 или нуль в целом. Поэтому ваш ListView не содержит элементов, и getView() никогда не вызывается.

Не могли бы вы также разместить файлы макета вашего фрагмента и вашей деятельности, а также метод onCreateView() вашего фрагмента и метод onCreate() вашей деятельности.

Кроме того, я спрашиваю себя, почему этот код:

ArrayList<HashMap<String, Integer>> profiles = ac.getProfileManagerDAO().getprofileList(); 
    if(profiles!=null){ 
     Log.d(TAG, "List size: " + profiles.size()); 
     ListView profileslist = (ListView) getActivity().findViewById(R.id.profileslist);   
     adapter = new ProfilesArrayAdapter(getActivity(), R.layout.list_item, profiles); 
     profileslist.setAdapter(adapter); 
    } 

не внутри метода Фрагменты onCreateView()? Таким образом, вы не будете называть getActivity(). FindViewById (...), но вы бы назовите inflatedview.findViewById (...) непосредственно на завышенном макете.

Обновление: Продолжает ли ваша деятельность FragmentActivity? Где в коде вашей деятельности находится фрагмент «добавлен» или «заменен» на макет?

+0

Я проверил, но список не пуст, он содержит ровно один элемент. Этот фрагмент кода был изначально внутри onCreateView, но, пытаясь решить эту проблему, я переместился внутри метода onCreateActivity (который вызывается после onCreateView). Я ' отредактируйте ответ, чтобы добавить XML-фрагмент фрагмента. – Ivan

+0

Хорошо, спасибо.Является ли «основной макет» файлом макета Activity или Fragment? Пожалуйста, опубликуйте метод onCreate() вашей активности и метод Fragments onCreateView(). –

+0

Done, я добавил в качестве комментария фрагмент кода, который работает и корректно отображает listView с помощью простого массива. – Ivan

Смежные вопросы