MyTetra Share
Делитесь знаниями!
CrimeListFragment.java
22.04.2017
10:16
Раздел: Android - books - AndroidProgramming2e - 13 Панель инструментов
CrimeListFragment.java
package com.bignerdranch.android.criminalintent; 
 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.TextView; 
 
import java.util.List; 
 
public class CrimeListFragment extends Fragment { 
 
    private static final String SAVED_SUBTITLE_VISIBLE = "subtitle"; 
 
    private RecyclerView mCrimeRecyclerView; 
    private CrimeAdapter mAdapter; 
    private boolean mSubtitleVisible; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
//        Вы должны явно указать FragmentManager, что фрагмент должен получить  вызов onCreateOptionsMenu(…). Для этого вызывается следующий метод:  public void setHasOptionsMenu(boolean hasMenu) В методе CrimeListFragment.onCreate(…) сообщите FragmentManager, что экземпляр CrimeListFragment должен получать обратные вызовы командного меню. 
        setHasOptionsMenu(true); 
    } 
 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                             Bundle savedInstanceState) { 
        View view = inflater.inflate(R.layout.fragment_crime_list, container, false); 
 
        mCrimeRecyclerView = (RecyclerView) view 
                .findViewById(R.id.crime_recycler_view); 
        mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
//        Теперь в подзаголовке всегда отображается правильное количество преступлений, и мы можем заняться решением проблемы с поворотом. Для этого следует сохранить переменную экземпляра mSubtitleVisible между поворотами при помощи механизма сохранения состояния экземпляров. 
        if (savedInstanceState != null) { 
            mSubtitleVisible = savedInstanceState.getBoolean(SAVED_SUBTITLE_VISIBLE); 
        } 
 
        updateUI(); 
 
        return view; 
    } 
 
    @Override 
    public void onResume() { 
        super.onResume(); 
        updateUI(); 
    } 
 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
        super.onSaveInstanceState(outState); 
        outState.putBoolean(SAVED_SUBTITLE_VISIBLE, mSubtitleVisible); 
    } 
//    В этом методе мы вызываем метод MenuInflater.inflate(int, Menu) и передаем  идентификатор ресурса своего файла меню. Вызов заполняет экземпляр Menu командами, определенными в файле. 
//В этом методе мы вызываем метод MenuInflater.inflate(int, Menu) и передаем идентификатор ресурса своего файла меню. Вызов заполняет экземпляр Menu командами, определенными в файле. Обратите внимание на вызов реализации onCreateOptionsMenu(…) суперкласса. Он не обязателен, но мы рекомендуем вызывать версию суперкласса просто для соблюдения общепринятой схемы, чтобы работала вся функциональность командных меню, определяемая в суперклассе. Впрочем, в данном случае это лишь формальность — базовая реализация этого метода из Fragment не делает ничего. FragmentManager отвечает за вызов Fragment.onCreateOptionsMenu(Menu, MenuInflater) при получении активностью обратного вызова onCreateOptionsMenu(…) от ОС. Вы должны явно указать FragmentManager, что фрагмент должен получить  вызов onCreateOptionsMenu(…). Для этого вызывается следующий метод:  public void setHasOptionsMenu(boolean hasMenu) В методе CrimeListFragment.onCreate(…) сообщите FragmentManager, что экземпляр CrimeListFragment должен получать обратные вызовы командного меню. 
    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
        super.onCreateOptionsMenu(menu, inflater); 
        inflater.inflate(R.menu.fragment_crime_list, menu); 
//        инициируйте повторное создание элементов действий при нажатии элемента действия Show Subtitle 
        MenuItem subtitleItem = menu.findItem(R.id.menu_item_show_subtitle); 
        if (mSubtitleVisible) { 
            subtitleItem.setTitle(R.string.hide_subtitle); 
        } else { 
            subtitleItem.setTitle(R.string.show_subtitle); 
        } 
    } 
 
    @Override 
//    В файле CrimeListFragment.java реализуйте метод onOptionsItemSelected(MenuItem), реагирующий на выбор команды меню. Реализация создает новый объект 
//    Crime, добавляет его в CrimeLab и запускает экземпляр CrimePagerActivity для редактирования нового объекта Crime. 
    public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) { 
            case R.id.menu_item_new_crime: 
                Crime crime = new Crime(); 
                CrimeLab.get(getActivity()).addCrime(crime); 
                Intent intent = CrimePagerActivity 
                        .newIntent(getActivity(), crime.getId()); 
                startActivity(intent); 
                return true; 
 
            case R.id.menu_item_show_subtitle: 
                mSubtitleVisible = !mSubtitleVisible; 
                getActivity().invalidateOptionsMenu(); 
                updateSubtitle(); 
//                Метод возвращает логическое значение. После того как команда меню будет обработана, верните true; тем самым вы сообщаете, что дальнейшая обработка не нужна. Секция default вызывает реализацию суперкласса, если идентификатор команды не известен в вашей реализации. 
                return true; 
            default: 
                return super.onOptionsItemSelected(item); 
        } 
    } 
//    Метод updateSubtitle генерирует строку подзаголовка при помощи метода 
//    getString(int resId, Object… formatArgs), который получает значения, подставляемые на место заполнителей в строковом ресурсе. 
    private void updateSubtitle() { 
        CrimeLab crimeLab = CrimeLab.get(getActivity()); 
        int crimeCount = crimeLab.getCrimes().size(); 
        String subtitle = getString(R.string.subtitle_format, crimeCount); 
//            Наконец, проверьте переменную mSubtitleVisible при отображении или сокрытии подзаголовка панели инструментов. 
        if (!mSubtitleVisible) { 
            subtitle = null; 
        } 
 
        AppCompatActivity activity = (AppCompatActivity) getActivity(); 
        activity.getSupportActionBar().setSubtitle(subtitle); 
    } 
 
    private void updateUI() { 
        CrimeLab crimeLab = CrimeLab.get(getActivity()); 
        List<Crime> crimes = crimeLab.getCrimes(); 
 
        if (mAdapter == null) { 
            mAdapter = new CrimeAdapter(crimes); 
            mCrimeRecyclerView.setAdapter(mAdapter); 
        } else { 
            mAdapter.notifyDataSetChanged(); 
        } 
 
        updateSubtitle(); 
    } 
 
    private class CrimeHolder extends RecyclerView.ViewHolder  
            implements View.OnClickListener { 
 
        private TextView mTitleTextView; 
        private TextView mDateTextView; 
        private CheckBox mSolvedCheckBox; 
 
        private Crime mCrime; 
 
        public CrimeHolder(View itemView) { 
            super(itemView); 
            itemView.setOnClickListener(this); 
 
            mTitleTextView = (TextView) itemView.findViewById(R.id.list_item_crime_title_text_view); 
            mDateTextView = (TextView) itemView.findViewById(R.id.list_item_crime_date_text_view); 
            mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.list_item_crime_solved_check_box); 
        } 
 
        public void bindCrime(Crime crime) { 
            mCrime = crime; 
            mTitleTextView.setText(mCrime.getTitle()); 
            mDateTextView.setText(mCrime.getDate().toString()); 
            mSolvedCheckBox.setChecked(mCrime.isSolved()); 
        } 
 
        @Override 
        public void onClick(View v) { 
            Intent intent = CrimePagerActivity.newIntent(getActivity(), mCrime.getId()); 
            startActivity(intent); 
        } 
    } 
 
    private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> { 
 
        private List<Crime> mCrimes; 
 
        public CrimeAdapter(List<Crime> crimes) { 
            mCrimes = 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 = mCrimes.get(position); 
            holder.bindCrime(crime); 
        } 
 
        @Override 
        public int getItemCount() { 
            return mCrimes.size(); 
        } 
    } 
} 

 
MyTetra Share v.0.52
Яндекс индекс цитирования