2016-06-01 10 views
-2

Ich habe diese Frage zuvor..aber keine Anregung, dass Thats, warum ich es wieder posten habe .. Ich habe Fragment zu zeigen itms in Listview..So habe ich (Teil von meinem Code):Android-Fragment statische Methode nicht angezeigt Listview Artikel

public class TwoFragment extends Fragment { 

    Button btn1; 
    static ListView listview; 
    ProgressDialog mProgressDialog; 
    static Activity activity; 

    public TwoFragment() { 

    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_two2, container, false); 
     activity = getActivity(); 
     listview = (ListView) view.findViewById(R.id.listview); 
     return view; 
    } 

    public static void display(final String serverResponse) { 

     @SuppressWarnings("unused") 
     final class DownloadJSON extends AsyncTask<String, String, Void> { 
      private JSONObject jsonobject; 
      private JSONArray jsonarray; 
       private ListViewAdapter adapter; 
      private ArrayList<HashMap<String, String>> arraylist; 
      @Override 
      protected Void doInBackground(String... params) { 
       try { 

        jsonarray = new JSONArray(serverResponse); 
        Gson gson = new Gson(); 

        User[] user = gson.fromJson(jsonarray.toString(), User[].class); 
        for (int i = 0; i < user.length; i++) { 
         HashMap<String, String> map = new HashMap<String, String>(); 
         map.put("name", user[i].getFullname()); 
         arraylist.add(map); 

        } 

       } catch (JSONException e) { 
        Log.e("Error", e.getMessage()); 
        e.printStackTrace(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void args) { 

       adapter = new ListViewAdapter(activity, arraylist); 
       listview.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
      } 
     } 
    } 
} 

In diesem Code ich keine Anzeige innerhalb Listview bin immer ..

+0

setzen Sie Ihren Adapter-Code und von wo Sie diese Methode aufrufen.? –

+0

wo haben Sie "Display" Methode ?? – Raghavendra

+0

Ich benutze tablayout..so.display Methode wird automatisch von mainActivity aufrufen .. – Preeti

Antwort

1

Sie einen statischen Verweis auf die Aktivität und die Listview halten? Das ist das Paradebeispiel für an memory leak.

Entfernen Sie das statische Schlüsselwort aus der Anzeigemethode und auch aus den Aktivitäts- und Listenansichtsvariablen. Tatsächlich benötigen Sie keinen Verweis auf die Aktivität, da Sie die Instanz mit 'getActivity' in 'onPostExecute' abrufen können. Aber nur wenn das Fragment noch an der Aktivität hängt.

Auch Sie definieren die AsyncTask, aber nicht mit [instance] .execute() aufrufen;

Jetzt, wo ich den Code ansehe, kompiliert es überhaupt? Soweit ich weiß, ist das Definieren von Klassen in einer Methode nicht erlaubt.

+0

Ich kann statische Schlüsselwort von display() -Methode nicht entfernen.Aktiv ruft diese Methode nach der Taste gedrückt..Dieser Code habe ich nicht geschrieben .. – Preeti

+0

Stellt MainActivity das Fragment bereit? Wenn dies der Fall ist, sollte es in der Lage sein, auf die Instanz davon zu verweisen und daher in der Lage zu sein, die Methode aufzurufen, auch wenn sie nicht statisch ist. – GPuschka

+0

Von Logcat habe ich festgestellt, dass das einzige Problem in OnPostExecute() -Methode .. mit Adapter = neue ListViewAdapter (Aktivität, Arraylist); listview.setAdapter (Adapter); diese zwei Zeilen .. – Preeti