0

I have 2 fragments in one Activity. First fragment: The user choose date and time and then press "CHOOSE" button. The selection of the user sent to SQL DB. the user can select as much as he want date and time. second fragment: set in ListView all the selection of the user(date and time) by reading from the SQL DB.

My Problem: I'm not succeed to refresh the listView every time the user press "CHOOSE" button in fragment 1.

First Fragment

 public class ChooseTimeFragment extends Fragment {

    String date,time,amPm;
    Spinner spinnerDate,spinnerTime,spinnerAmPm;
    private DbHelper db;
    public ChooseTimeFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view=inflater.inflate(R.layout.fragment_choose_time, container, false);

        db = DbHelper.getInstance(view.getContext());
         spinnerDate = (Spinner) view.findViewById(R.id.spinnerDate);
        ArrayAdapter<CharSequence> adapterDate = ArrayAdapter.createFromResource(getActivity(),
                R.array.date_array, android.R.layout.simple_spinner_item);
        adapterDate.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerDate.setAdapter(adapterDate);
        date=spinnerDate.getSelectedItem().toString();
         spinnerTime = (Spinner) view.findViewById(R.id.spinnerTime);
        ArrayAdapter<CharSequence> adapterTime = ArrayAdapter.createFromResource(getActivity(),
                R.array.time_array, android.R.layout.simple_spinner_item);
        adapterTime.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerTime.setAdapter(adapterTime);
        time=spinnerTime.getSelectedItem().toString();
         spinnerAmPm = (Spinner) view.findViewById(R.id.spinnerAmPm);
        ArrayAdapter<CharSequence> adapterAmpm = ArrayAdapter.createFromResource(getActivity(),
                R.array.amPm_array, android.R.layout.simple_spinner_item);
        adapterAmpm.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerAmPm.setAdapter(adapterAmpm);
        amPm=spinnerAmPm.getSelectedItem().toString();


        Button bChoose=(Button) view.findViewById(R.id.btnChooseDT);
        bChoose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initialize();
                if(validate()){
                    db.addUserChooseDateAndTime(date,time+amPm,view.getContext());

                }
            }
        });

        return view;
    }

    private void initialize(){
        date=spinnerDate.getSelectedItem().toString();
        time=spinnerTime.getSelectedItem().toString();
        amPm=spinnerAmPm.getSelectedItem().toString();
    }
    private boolean validate(){
        boolean valid=true;

        if (date.equals("DATE")||time.equals("TIME")){
            Toast.makeText(getContext(),date + "  Please Enter Date and Time", Toast.LENGTH_SHORT).show();
           valid=false;
       }
        return valid;
    }

}

Second Fragment

public class ChosenListFragment extends Fragment {

    private DbHelper db;
    public static Activity myActivity;

    public ChosenListFragment() {
    }
    MyChosenListViewAdapter adapter;
    ListView listView;
    ArrayList<TimeAndDate> timeAndDateArrayLis;

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_chosen_list, container, false);
        db = DbHelper.getInstance(view.getContext());

      refreshList(view);


        return view;
    }

    public void refreshList(View view){
        ArrayList<TimeAndDate> timeAndDateArrayList =db.getListDateAndTime(getContext());
        adapter = new MyChosenListViewAdapter(getContext(), timeAndDateArrayList);
        listView = (ListView) view.findViewById(R.id.listDateAndTime);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    }


}

After long search, any help? thanks!

OriD
  • 225
  • 1
  • 2
  • 5

2 Answers2

0

Problem is you are not refreshing the listView everytime when you clicked to button. You should refreshlist after each click. If you can share the your mainactivity class too I can take a closer look.

Ibrahim R Serpici
  • 1,048
  • 7
  • 8
0

Simple way:

if you have two fragment in one activity(ex: ParentActivity) you can access from one fragment to another by parent activity.

add something like this to Parent Activity:

public void refreshListFragment(){    
    ListFragment list = 
    getSupportFragmentManager().findFragmentById(R.id.fragment_list);//init on onCreate or ... is better.
    list.refreshList();     
}

add below code after db.addUserChooseDateAndTime(date,time+amPm,view.getContext());

 ((ParentActivity)getActivity()).refreshListFragment();

Better Ways:

use new android architecture components, link

or

use interface to communicate Android official site

or

using observer pattern to notify changed.

LocalBroadcastManager:

 public class ListFragment extends Fragment {


public static final String ACTION_UPDATE = "action_update";

private BroadcastReceiver  updateBroadcastListener = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Updated", Toast.LENGTH_SHORT).show();
    }
};

@Override
public void onResume() {
    super.onResume();
    LocalBroadcastManager.getInstance(getContext())
            .registerReceiver(updateBroadcastListener, new IntentFilter(ListFragment.ACTION_UPDATE));

}

@Override
public void onPause() {
    LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(updateBroadcastListener);
    super.onPause();
}
....
}

and after any change to list items:

  LocalBroadcastManager.getInstance(SecondActivity.this).sendBroadcast(new Intent(ListFragment.ACTION_UPDATE));

you can write own observer pattern or use something like EventBus http://greenrobot.org/eventbus/documentation/how-to-get-started/

you can also register to database cursor so notified of any update. Listen to any changes in a cursor in android

Ahmad Dehnavi
  • 1,483
  • 1
  • 17
  • 20