A simple {@link Fragment} subclass.
*/
public class CrimeListFragment extends Fragment {
private RecyclerView recyclerView;
private CrimeAdapter crimeAdapter;
private boolean subtitleVisible;
public int CurrentPosition;
public static final String SUBTITLE=“subtitle”;
private TextView emptyView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_crime_list,container,false);
if(savedInstanceState!=null){
subtitleVisible=savedInstanceState.getBoolean(SUBTITLE);
}
recyclerView=(RecyclerView)view.findViewById(R.id.crime_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
emptyView=(TextView)view.findViewById(R.id.emptyTextView);
updateUI();
return view;
}
@Override
public void onResume() {
super.onResume();
//UpDateUi is called in onResume because When CrimeListFragment starts an instance of CrimeActivity , the CrimeActivity is put on top of
// the stack. This pauses and stops the instance of CrimeListActivity that was initially on top.
// When the user presses the Back button to return to the list, the CrimeActivity is popped off the stack
// and destroyed. At that point, the CrimeListActivity is started and resumed
updateUI();
}
private void updateUI(){
CrimeLab crimeLab=CrimeLab.get(getActivity());
List crimes= crimeLab.getCrimeList();
if(crimeAdapter==null){
crimeAdapter=new CrimeAdapter(crimes);
recyclerView.setAdapter(crimeAdapter);
}
//NotifyDataSetChanged has been called beacuse when you click on CrimeList and go to particular Crime and update that crime
//and press back button that updated crime should be displayed in the list
else{
//We are updating only one item at a time so using notifyDataSetChanged would be insufficient as it updates all the items
//so use notifyItemChanged to update only that item which has changed
//crimeAdapter.notifyDataSetChanged();
crimeAdapter.setCrimes(crimes);
crimeAdapter.notifyItemChanged(CurrentPosition);
}
updateSubtitle();
}
public class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView tileTextView,dateTextView;
private CheckBox checkBox;
private Crime mcrime;
public CrimeHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
tileTextView=(TextView)itemView.findViewById(R.id.list_item_crime_textview);
dateTextView=(TextView)itemView.findViewById(R.id.list_item_date_textview);
checkBox=(CheckBox)itemView.findViewById(R.id.list_item_crime_checkbox);
}
public void bindCrime(Crime crime){
mcrime=crime;
tileTextView.setText(crime.getTitle());
dateTextView.setText(crime.getDate().toString());
checkBox.setChecked(crime.isSolved());
}
@Override
public void onClick(View v) {
Toast.makeText(getActivity(),"You clicked on "+mcrime.getTitle(),Toast.LENGTH_LONG).show();
CurrentPosition=getAdapterPosition();
Intent intent = CrimePagerActivity.newIntent(getActivity(), mcrime.getUuid());
startActivity(intent);
}
}
public class CrimeAdapter extends RecyclerView.Adapter{
private List<Crime> crimeList;
public CrimeAdapter(List<Crime> crimes){
crimeList=crimes;
}
@Override
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(getActivity());
View view= layoutInflater.inflate(R.layout.list_item_crime,parent,false);
return new CrimeHolder(view);
}
@Override
public void onBindViewHolder(CrimeHolder holder, int position) {
Crime crime= crimeList.get(position);
holder.bindCrime(crime);
}
@Override
public int getItemCount() {
return crimeList.size();
}
//this is used in case of Sqlite databse so that when you add a crime and change it ,it should be updated
//call this method in updateUI also
public void setCrimes(List<Crime> crimes){
crimeList=crimes;
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_main,menu);
MenuItem menuItem=menu.findItem(R.id.menu_item_show_title);
if(subtitleVisible){
menuItem.setTitle(R.string.hide_subtitle);
}
else{
menuItem.setTitle(R.string.show_subtitle);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_item_new_crime:
emptyView.setVisibility(View.GONE);
Crime crime=new Crime();
CrimeLab.get(getActivity()).addCrime(crime);
Intent intent = CrimePagerActivity
.newIntent(getActivity(), crime.getUuid());
startActivity(intent);
return true;
case R.id.menu_item_show_title:
subtitleVisible=!subtitleVisible;
getActivity().invalidateOptionsMenu();
updateSubtitle();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void updateSubtitle(){
AppCompatActivity appCompatActivity=(AppCompatActivity)getActivity();
CrimeLab crimeLab=CrimeLab.get(getActivity());
int count=crimeLab.getCrimeList().size();
//String subtitle=getString(R.string.subtitle_format,String.valueOf(count));
String subtitle=getResources().getQuantityString(R.plurals.subtitle_plural,count,count);
if(!subtitleVisible){
subtitle="";
}
appCompatActivity.getSupportActionBar().setSubtitle(subtitle);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SUBTITLE,subtitleVisible);
}
}