hi friends
i wanted to show my solution that works good but maybe there is something to notice so i will appreciate to any creative advice . is it good code or bad ?
i used interface to communicate between fragments
i deleted unnecessary codes and summarized it
CrimeListFragment.Java
private static final int REQUEST_CRIME = 0; ...
private abstract class GenericCrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
...
public void onClick(View view) { Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId(),getLayoutPosition()); startActivityForResult(intent,REQUEST_CRIME); } } ...
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode != Activity.RESULT_OK) { return; } if(requestCode == REQUEST_CRIME) { if(data == null) { return; } int layoutPosition = CrimeActivity.resultDecodeToLayoutIdInt(data); mAdapter.notifyItemChanged(layoutPosition); } }
}
CrimeActivity.java
public class CrimeActivity extends SingleFragmentActivity implements CrimeFragment.ReAction {
private static final String EXTRA_CRIME_ID = âcom.bignerdranch.android.criminalintent.crime_idâ;
private static final String EXTRA_CRIME_LAYOUT_ID = âcom.bignerdranch.android.criminalintent.crime_layout_idâ;
private static final String EXTRA_CRIME_LAYOUT_ID_RESULT = âcom.bignerdranch.android.criminalintent.crime_layout_id_resultâ;
public static Intent newIntent(Context packageContext, UUID crimeID ,int layoutId) { Intent intent = new Intent(packageContext , CrimeActivity.class); intent.putExtra(EXTRA_CRIME_ID,crimeID); intent.putExtra(EXTRA_CRIME_LAYOUT_ID,layoutId); return intent; }
public static int resultDecodeToLayoutIdInt(Intent intent) { int layoutId = intent.getIntExtra(EXTRA_CRIME_LAYOUT_ID_RESULT,0); return layoutId; }
@Override protected Fragment createFragment() { UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID); return CrimeFragment.newInstance(crimeId); }
@Override public void isChanged() { Intent data = new Intent(); int layoutId = getIntent().getIntExtra(EXTRA_CRIME_LAYOUT_ID,0); data.putExtra(EXTRA_CRIME_LAYOUT_ID_RESULT,layoutId); setResult(RESULT_OK,data); }
}
CrimeFragment.java
public class CrimeFragment extends Fragment {
private ReAction mCallback; private static final String ARG_CRIME_ID = "crime_id"; ...
public interface ReAction { public void isChanged(); }
@Override public void onAttach(Context context) { super.onAttach(context);
try { mCallback = (ReAction) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement ReAction interface"); } }
@Nullable @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { //return super.onCreateView(inflater, container, savedInstanceState);
View vd = inflater.inflate(R.layout.fragment_crime,container,false);
mTitleField = (EditText) vd.findViewById(R.id.crime_title); mTitleField.setText(mCrime.getTitle()); mTitleField.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCrime.setTitle(s.toString()); mCallback.isChanged(); }
@Override public void afterTextChanged(Editable s) { } });
mDateButton =(Button) vd.findViewById(R.id.crime_date); mDateButton.setText(mCrime.getDate().toString()); mDateButton.setEnabled(false);
mSolvedCheckBox = (CheckBox) vd.findViewById(R.id.crime_solved); mSolvedCheckBox.setChecked(mCrime.isSolved()); mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mCrime.setSolved(isChecked); mCallback.isChanged(); } }); return vd; }
}