naja
naja

Reputation: 581

ListView doesn't get updated inside fragment until I re-start my application

My MainActivity implements a PagerSlidingTabStrip. So I have two tabs (CalculatorFragment and HistoryFragment). In the first one (CalculatorFragment), the user inputs information and clicks on a button that adds it to the database. The second tab (HistoryFragment) is supposed to list all of the items from the DB. The problem is that that list doesn't get updated until I re-start my application. I know why - because the list gets populated onCreateView only. My question is to how to fix this.

MainActivity.java

public class MainActivity extends ActionBarActivity {

private TabsAdapter tabsAdapter;
private ViewPager viewPager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tabsAdapter = new TabsAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(tabsAdapter);

    PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);

    tabs.setViewPager(viewPager);

}}

Tab1

public class CalculatorFragment extends Fragment {
@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.calculator_layout, container, false);
        final DBTools dbTools = DBTools.getInstance(this.getActivity());

        //... the OnClickListener that adds all info to the database

        fab.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                //... code

                dbTools.insertRecord(queryValuesMap);
            }
        });

Tab2 with ListView

public class HistoryFragment extends Fragment {

    public static RecordArrayAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.history_layout, container, false);
        DBTools dbTools = DBTools.getInstance(this.getActivity());

        List<RecordObject> recordsList = dbTools.getAllRecords();

        Log.d("History-Fragment", recordsList.toString());

        if (recordsList.size() != 0) {

            ListView listView = (ListView) rootView.findViewById(R.id.records_list);


            adapter = new RecordArrayAdapter(this.getActivity(), recordsList);

            listView.setAdapter(adapter);

        }
        return rootView;
    }
}

RecordsArrayAdapter

public class RecordArrayAdapter extends ArrayAdapter<RecordObject> {

    SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
    SimpleDateFormat newFormat = new SimpleDateFormat("MMM dd, yy", Locale.US);

    private LayoutInflater inflater;
    DBTools dbTools = new DBTools(this.getContext());

    public RecordArrayAdapter(Context context, List<RecordObject> objects) {
        super(context, 0, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.record_entry, parent, false);
        }

        RecordObject recordObject = getItem(position);

        TextView recordsID = (TextView) convertView.findViewById(R.id.key_id);

        TextView weight = (TextView) convertView.findViewById(R.id.weight);
        TextView reps = (TextView) convertView.findViewById(R.id.reps);
        TextView oneRM = (TextView) convertView.findViewById(R.id.onerm);
        TextView date = (TextView) convertView.findViewById(R.id.date);

        newFormat.setLenient(false);
        try {
            date.setText(newFormat.format(oldFormat.parse(recordObject.getDate())));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        weight.setText(""+recordObject.getWeight());
        reps.setText(("'"+recordObject.getReps()));
        oneRM.setText(""+recordObject.getOneRM());

        return convertView;
    }
}

Upvotes: 0

Views: 123

Answers (1)

Rohit5k2
Rohit5k2

Reputation: 18112

When the fragment is in the selected tab, setUserVisibleHint() will be called with true, and when the fragment is not the selected tab, it will be called with false.

Add this method in HistoryFragment

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser){
        DBTools dbTools = DBTools.getInstance(this.getActivity());
        List<RecordObject> recordsList = dbTools.getAllRecords();
        if (recordsList.size() != 0) {
            ListView listView = (ListView) rootView.findViewById(R.id.records_list);
            adapter = new RecordArrayAdapter(this.getActivity(), recordsList);
            listView.setAdapter(adapter);
        }
    }
    else
        Log.d("HistoryFragment", "HistoryFragment is not visible.");
}

NOTE Define View rootView at class level, right now its in onCreateView()

Your fragment should look like this

public class HistoryFragment extends Fragment {

    public static RecordArrayAdapter adapter;
    View rootView = null;
    DBTools dbTools = null;

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

        rootView = inflater.inflate(R.layout.history_layout, container, false);
        loadScreen();
        return rootView;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser)
            loadScreen();
        else
            Log.d("HistoryFragment", "HistoryFragment is not visible.");
     }

    private void loadScreen(){
        dbTools = DBTools.getInstance(this.getActivity());
        List<RecordObject> recordsList = dbTools.getAllRecords();
        if (recordsList.size() != 0) {
            ListView listView = (ListView) rootView.findViewById(R.id.records_list);
            adapter = new RecordArrayAdapter(this.getActivity(), recordsList);
            listView.setAdapter(adapter);
        }
    }

}

Upvotes: 1

Related Questions