2016-04-26 17 views
0

Ich bin Nuebie in Android. Ich nehme an, ich versuche Code aus nicht UI-Thread ausführen. Wie kann ich mein Raster in Fragment aktualisieren? Ich habe Aktivität SimpleImageActivity. In dieser Aktivität warte ich auf die Zurück-Taste und versuche, meine Daten in GridView zu aktualisieren. Methode invalidate() postInvalidate() nichts tun.Grid.Invalidate in Fragment von FragmentActivity

private Handler handler; 
protected OnBackPressedListener onBackPressedListener; 

public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) { 
    this.onBackPressedListener = onBackPressedListener; 
} 

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

    Fragment fr; 
    String tag= GridViewFragment.class.getSimpleName(); 
    fr = getSupportFragmentManager().findFragmentByTag(tag); 
    if (fr == null) { 
     fr = new GridViewFragment(); 
     } 
    getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fr, tag).commit(); 
} 

@Override 
public void onBackPressed() { 
    if (onBackPressedListener != null){ 
     // ...some code... 
     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       System.out.println("[VAN] I am in Runnable"); 
       GridView gV = (GridView)findViewById(R.id.grid); // gV - links to my GridView and not null here 
       gV.invalidate(); //this code nothing doing 
       gV.postInvalidate(); //this code nothing doing too 

      } 
     }, 0); 
     onBackPressedListener.onBackPres(); // event Back key for fragment 
} 

In meinem GridViewFragment Ich versuche gridView.invalidate auch ausführen, aber in Fragmente unter gridview = null

public class GridViewFragment extends AbsListViewBaseFragment implements OnBackPressedListener { 

public GridView gridView; 
private FragmentActivity activity; 
View rootView; 

public GridViewFragment() { 
    this.activity = getActivity(); 
} 

@Override 
public void onBackPres() { 
    new Thread(new Runnable() { 
     public void run() { 
      updateScreen(); 
      // I am try this 
      // gridView.invalidate() there not working, because gridView=null 
      // 
      System.out.println("[VAN] updateScreen"); 
     } 
    }).start(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    activity = getActivity(); 
    ((SimpleImageActivity)activity).setOnBackPressedListener(new GridViewFragment()); 

    rootView = inflater.inflate(R.layout.fragment_image_grid, container, false); 
    gridView = (GridView) rootView.findViewById(R.id.grid); 
    // ... some code ... 
} 

private void updateScreen(){ 
    gridView.postInvalidate(); // error because there gridView=null 
} 

Wie ich meine Gridview aktualisieren kann? Beim Auslösen der Methode public void onBackPres() { in Fragment gridView.invalidate - funktioniert nicht, da gridView = null. Wenn in Aktivität handler.postDelayed(new Runnable() { gV meine GridView zurückgeben, aber gV.invalidate(); gV.postInvalidate(); nichts tun und ohne Fehler ausgeführt werden.

+0

Versuchen Sie, diese http://stackoverflow.com/questions/11123621/running-code-in-main- folgen thread-from-another-thread – Amit

+0

Danke, nach Deinem Rat, versuche ich '' gV.invalidate(); 'zu' gV.invalidateViews(); 'zu ersetzen und es funktioniert – van4ik

Antwort

0

A fand die Antwort auf meine eigene Frage

handler = new Handler(); 
    handler.post(new Runnable() { 
     public void run() { 
      GridView gV = (GridView)findViewById(R.id.grid); 
      gV.invalidateViews(); //this works fine 
     } 
    }); 

Mit invalidateViews() statt invalidate()

Verwandte Themen