Reputation: 581
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
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