2013-05-01 1 views
0

Je ne peux pas étendre ma classe à ListFragment .Il me donne l'erreur ClassCastException. Le code fonctionnait pendant l'extension ListActivity .Et il fonctionne également tout en développant Fagment (lorsque les listes ne sont pas utilisées). Mais ListFragment donne des erreurs, et je ne pouvais pas trouver de solution. Y a-t-il un moyen de le résoudre? Peut-être qu'une classe interne qui étend ListFragment/ListActivity peut résoudre le problème mais je ne pourrais pas le réaliser.ListFragment et ListView

Je veux définir les adaptateurs:

setListAdapter(Adapter<String>(this, R.layout.row)); 
m_List = (ArrayAdapter<String>)getListAdapter(); 

xml

<ListView 
     android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <TextView 
     android:id="@+id/android:empty" 
     android:text="" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal"/> 

activité

public class MyActivity extends Fragment { 

    public class MyListFragment extends ListActivity {   
       @Override 
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);  
       setContentView(R.layout.stopwatch); 
    setListAdapter(new ArrayAdapter<String>(this, R.layout.row));    
      m_List = (ArrayAdapter<String>)getListAdapter(); 

      } 

    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      v = inflater.inflate(R.layout.stopwatch, container, false); 
    MyListFragment ma = new MyListFragment(); // ??? 
    } 

    } 
+1

Est-ce que «public class MyActivity extends ListFragment { public class MyListFragment extends ListActivity {" votre implémentation actuelle? – Blackbelt

+0

Modifié. 'MyActivity étend Fragment'. Et je pensais que la classe interne 'MyListFragment étend ListActivity/ListFragment' si je peux l'utiliser dans onCreateView de la classe externe? – metemet06

+0

Pourquoi avez-vous une InnerClass qui étend ListActivity dans une classe qui étend Fragment? – Blackbelt

Répondre

4

si vous utilisez ListActivity alors:

public class MyListActivity extends ListActivity { 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
     "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
     "Linux", "OS/2" }; 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, values); 
    setListAdapter(adapter); 
    } 
} 

si fragmenter fragmenter mais ListFragment alors

public class CountryList extends ListFragment { 

    String[] countries = new String[] { 
     "India", 
     "Pakistan", 
     "Sri Lanka", 
     "China", 
     "Bangladesh", 
     "Nepal", 
     "Afghanistan", 
     "North Korea", 
     "South Korea", 
     "Japan" 
    }; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     /** Creating an array adapter to store the list of countries **/ 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(inflater.getContext(), android.R.layout.simple_list_item_1,countries); 

     /** Setting the list adapter for the ListFragment */ 
     setListAdapter(adapter); 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 
} 
+0

Merci, mais je reçois toujours une erreur ClassCastException, y at-il un problème avec mon xml? Son fonctionnement avec fragment, listactivity mais pas avec listfragment! Ou est-il possible d'étendre fragment/listactivity puis utiliser setListAdapter? – metemet06

0

Je voudrais écrire une nouvelle classe appelée ListFragment et migrer le code sur:

Voici un guide étape par étape pour un scénario de base:

1) Créer un nouveau fichier fragment.java, avec une implémentation super simple d'un fragment.

package com.a; 

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

public class MenuFragment extends ListFragment 
{ 

public static final String TAG = "MenuFragment"; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.list, null); 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // 
    // insert code here to setup and call setListAdapter() 
    // 
} 

@Override 
public void onListItemClick(ListView lv, View v, int position, long id) 
{ 

} 
} 

2) Recherchez votre setContentView dans votre code ListActivity, utilisez cette mise en page en tant que paramètre à la inflate() appeler sous onCreateView()

setContentView(R.layout.main); 

à

View v = inflater.inflate(R.layout.main, null); 

3 Déplacez le reste de votre code sous votre listactivity onCreate() vers listfragmentt OnCreateView(). Vous avez probablement un code mise en place des contrôles tels que le ci-dessous:

text = (EditText) this.findViewById(R.id.text); 

Il deviendra ceci:

text = (EditText) v.findViewById(R.id.text); 

Notez que v est la vue, de retour de l'appel décompressé.

4) Si votre code contient des références à "this", vous obtiendrez une erreur. Remplacez cela par "getActivity()".

5) Vérifiez le code qui vous reste et trouvez le bon endroit pour les placer dans le nouveau fichier. Espérons que ce qui précède couvre les bases.

Questions connexes