0

I am nuebie in Android. I suppose i am try run code from non UI thread. How i can update my grid in Fragment. I have activity SimpleImageActivity. In this Activity i am waiting Back key and I am trying update my data in GridView. Method invalidate() postInvalidate() nothing doing.

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 my GridViewFragment I am trying execute gridView.invalidate too, but in fragment below 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
}

How i can update my GridView? When triggering method public void onBackPres() { in fragment gridView.invalidate - don't working because gridView = null. When in activity use handler.postDelayed(new Runnable() { gV return my GridView, but gV.invalidate(); gV.postInvalidate(); nothing doing and execute without any errors.

van4ik
  • 1
  • 1
  • Try to follow this http://stackoverflow.com/questions/11123621/running-code-in-main-thread-from-another-thread – Amit Apr 26 '16 at 15:42
  • thanks, after your advice, i am try replace `'gV.invalidate();` to `gV.invalidateViews();` and it works – van4ik Apr 26 '16 at 17:22

1 Answers1

0

A found the answer on my own question

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

Using invalidateViews() instead invalidate()

van4ik
  • 1
  • 1