成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ViewPager的使用

netScorpion / 772人閱讀

摘要:寫到這里我忽然忘記我們把筆記詳情頁(yè)給忘了,沒(méi)有它我們?cè)撃檬裁慈ワ@示筆記的詳情呢,好吧,趕快去新建一個(gè)命名為上面的方法和之前的所使用的技巧是一樣的。從中啟動(dòng)傳參的方法是,自然的,我們就有了這個(gè)常量。

一 前言

上次我們用RecyclerView做了一個(gè)簡(jiǎn)單的顯示筆記的小程序,今天我們用ViewPager來(lái)擴(kuò)展它的功能:當(dāng)我們點(diǎn)擊筆記列表的其中某條筆記時(shí),它可以跳到另外一個(gè)頁(yè)面完整的顯示這條筆記的內(nèi)容,更人性化的設(shè)計(jì)是,在某條筆記的詳情頁(yè)面,我們可以左右滑動(dòng)以查看上一條或者下一條,而不是返回主列表再去選擇,話不多說(shuō),操作起來(lái)!

二 準(zhǔn)備工作

1.首先我們創(chuàng)建一個(gè)Activity,命名為NotePagerActivity
2.定義NotePagerActivity的私有字段:

public class NotePagerActivity extends AppCompatActivity {
    private static final String EXTRA_NOTE_ID = "com.aristark.note.note.id";
    private ViewPager noteViewPager;
    private ArrayList notes;

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

因?yàn)槲覀兪菑牧斜鞟ctivity那里點(diǎn)擊某一個(gè)筆記項(xiàng)才進(jìn)入到NotePagerActivity,因此需要傳入該筆記項(xiàng)的UUID(很容易想到兩個(gè)Activity之間傳遞數(shù)據(jù)所使用的方法是Intent附加參數(shù),也就是putExtra()方法,因此我們將該常量命名為EXTRA_NOTE_ID,養(yǎng)成這樣良好的命名方法對(duì)以后讀懂這段代碼是很重要的!先不用好奇為什么要把它設(shè)為私有,一會(huì)兒就明白其中的妙處了),noteViewPager和notes自然不用多說(shuō),這是今天的主角。

3.在布局中activity_note_pager設(shè)置ViewPager
直接上代碼


    

4為NotePagerActivity編寫newIntent方法

public static Intent newIntent(Context context,UUID uuid){
    Intent i = new Intent(context,NotePagerActivity.class);
    i.putExtra(EXTRA_NOTE_ID,uuid);
    return i;
}

這樣我們每次想要啟動(dòng)NotePagerActivity時(shí)只需調(diào)用這個(gè)靜態(tài)方法,而不用再balabalabala重復(fù)一堆昨天的故事。

三 設(shè)置ViewPager

其實(shí)我也不知道為什么用設(shè)置這個(gè)詞,應(yīng)該用使用?裝配?其實(shí)不需要太在意,我們的目的現(xiàn)在很簡(jiǎn)單,就是按照ViewPager給的接口傳入相應(yīng)的參數(shù),讓它工作起來(lái)就行(對(duì)新手而言)!
先貼上NoteListsFragment的代碼

package com.aristark.note;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class NotesListFragment extends Fragment {
    private RecyclerView noteRecycler;
    private NoteAdapter noteAdapter;
    public NotesListFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
//        return inflater.inflate(R.layout.fragment_notes_list, container, false);
        View root = inflater.inflate(R.layout.fragment_notes_list,container,false);

        noteRecycler = (RecyclerView) root.findViewById(R.id.note_recycler_view);
        noteRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
//        NoteLab noteLab = NoteLab.getNoteLab(getActivity());
//        ArrayList notes = noteLab.getNotes();
//        noteAdapter = new NoteAdapter(notes);
//        noteRecycler.setAdapter(noteAdapter);
        updateView();
        return root;
    }

    @Override
    public void onResume() {
        super.onResume();
        updateView();
    }

    private class NoteHolder extends RecyclerView.ViewHolder{
        private TextView noteTitle;
        private TextView noteContent;
        private TextView noteDate;

        public NoteHolder(View root) {
            super(root);
            noteTitle = (TextView) root.findViewById(R.id.list_item_note_title);
            noteContent = (TextView) root.findViewById(R.id.list_item_note_content);
            noteDate = (TextView) root.findViewById(R.id.list_item_note_date);
        }

        public void bindView(Note n){
            this.note = n;
            noteTitle.setText(note.getTitle());
            noteContent.setText(note.getContent());
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(note.getDate());
            int year = calendar.get(1);
            int day = calendar.get(5);
            int month = calendar.get(2)+1;
            String date = year+"年"+month+"月"+day+"日";
            noteDate.setText(date);
        }

    }

    private class NoteAdapter extends RecyclerView.Adapter{
        private List notes;

        public NoteAdapter(List notes){
            this.notes = notes;
        }

        public void setNotes(List notes) {
            this.notes = notes;
        }

        @Override
        public NoteHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            View view = layoutInflater.inflate(R.layout.list_item_note,parent,false);
            return new NoteHolder(view);
        }

        @Override
        public void onBindViewHolder(NoteHolder holder, int position) {
            Note note = notes.get(position);
            holder.bindView(note);
        }

        @Override
        public int getItemCount() {
            return notes.size();
        }
    }

    public void updateView(){
        NoteLab noteLab = NoteLab.getNoteLab(getActivity());
        ArrayList notes = noteLab.getNotes();
        if (noteAdapter == null){
            noteAdapter = new NoteAdapter(notes);
            noteRecycler.setAdapter(noteAdapter);
            return;
        }

        noteAdapter.setNotes(notes);
        noteRecycler.setAdapter(noteAdapter);

    }

}

和上回的代碼略有不同,我做了一些小小的封裝。我們把注意力集中到類NoteHolder的構(gòu)造方法這里來(lái),它傳入的參數(shù)root的類型是View,也就是筆記列表項(xiàng)的每一個(gè)筆記記錄,我們?cè)谶@里設(shè)置一個(gè)監(jiān)聽(tīng)器,當(dāng)用戶點(diǎn)擊的時(shí)候,我們就讓頁(yè)面跳轉(zhuǎn)到筆記詳情頁(yè)面,也就是CrimePagerActivity,來(lái),寫代碼:

    public NoteHolder(View root) {
        super(root);
        root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = NotePagerActivity.newIntent(getActivity(),note.getUuid());
                startActivity(i);
            }
        });
        noteTitle = (TextView) root.findViewById(R.id.list_item_note_title);
        noteContent = (TextView) root.findViewById(R.id.list_item_note_content);
        noteDate = (TextView) root.findViewById(R.id.list_item_note_date);
    }

下面把注意力轉(zhuǎn)移到CrimePagerActivity:
1.獲取ViewPager:

 noteViewPager = (ViewPager) findViewById(R.id.note_view_pager);

2.從傳來(lái)的Intent里獲取uuid,并以此uuid從全局靜態(tài)對(duì)象NoteLab中獲取notes:

 UUID uuid = (UUID)getIntent().getSerializableExtra(EXTRA_NOTE_ID);
 notes = NoteLab.getNoteLab(this).getNotes();

這里再一次體會(huì)到了EXTRA_NOTE_ID的方便之處吧。
3.為ViewPager設(shè)置Adapter(ViewPager和RecyclerView一樣,每個(gè)頁(yè)面的布局都是一樣的,只是填充的數(shù)據(jù)不一樣,因?yàn)樾枰狝dapter去適配,這里感嘆一句想到這種機(jī)制的大神真的應(yīng)該膜拜!簡(jiǎn)直解放了生產(chǎn)力有沒(méi)有?。㎡K,show you the code:

 FragmentManager fragmentManager = getSupportFragmentManager();
        noteViewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
            @Override
            public Fragment getItem(int position) {
                return null;
            }

            @Override
            public int getCount() {
                return notes.size();
            }
        });

是不是似曾相識(shí)?之所以要用FragmentPagerAdapter,是因?yàn)樗梢詾槲覀兪∪腁ctivity中啟動(dòng)Fragment的一系列事務(wù)代碼,十分方便。寫到這里我忽然忘記我們把筆記詳情頁(yè)給忘了,沒(méi)有它我們?cè)撃檬裁慈ワ@示筆記的詳情呢,好吧,趕快去新建一個(gè)fragment命名為NoteDetailFragment:

public class NoteDetailFragment extends Fragment {
    private static String ARG_NOTE_ID;
    private Note note;
    TextView noteDate;
    TextView noteTitle;
    TextView noteContent;

    public NoteDetailFragment() {
        // Required empty public constructor
    }

     public static Fragment newFragment(UUID uuid){
         Bundle args = new Bundle();
         args.putSerializable(ARG_NOTE_ID,uuid);
         Fragment fragment = new NoteDetailFragment();
         fragment.setArguments(args);
         return fragment;

     }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        UUID uuid = (UUID) getArguments().getSerializable(ARG_NOTE_ID);
        note = NoteLab.getNoteLab(getActivity()).getNote(uuid);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_note_detail,container,false);
        noteDate = (TextView) root.findViewById(R.id.note_date);
        noteTitle = (TextView) root.findViewById(R.id.note_title);
        noteContent = (TextView) root.findViewById(R.id.note_content);
        noteDate.setText(note.getDate().toString());
        noteTitle.setText(note.getTitle());
        noteContent.setText(note.getContent());
    }
    return root;
}

上面的newFragment方法和之前的newIntent所使用的技巧是一樣的。從Activity中啟動(dòng)Fragment傳參的方法是setArguments,自然的,我們就有了ARG_NOTE_ID這個(gè)常量。
對(duì)應(yīng)的布局文件代碼如下:




    

    
    

        

        

            

        

    


回到NotePagerActivity中:

  @Override
        public Fragment getItem(int position) {
            Note note = notes.get(position);
            return NoteDetailFragment.newFragment(note.getUuid());
        }

好,編譯,運(yùn)行,添加幾組測(cè)試數(shù)據(jù)后我們會(huì)發(fā)現(xiàn)不管從哪條筆記記錄點(diǎn)擊進(jìn)去,都是從第一條開始顯示,不用急,此時(shí)我們可以在getItem下面添加如下代碼:

for (int i=0;i

用setCurrentItem來(lái)設(shè)置正確的筆記項(xiàng)就行了。因?yàn)榻Y(jié)果需要?jiǎng)討B(tài)演示,我就不貼圖啦,如果有人需要代碼的話我就聯(lián)系我吧!我的qq:891871898求批評(píng)指正!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65562.html

相關(guān)文章

  • ViewPager2重大更新,支持offscreenPageLimit

    摘要:前言最近發(fā)布了版本,新增功能,該功能在上并不友好,現(xiàn)在官方將此功能延續(xù)下來(lái),這回是騾子是馬呢趕緊拉出來(lái)溜溜閱讀指南內(nèi)容基于版本講解,由于正式版還未發(fā)布,如有功能變動(dòng)有勞看官指出內(nèi)容重點(diǎn)介紹的特性和預(yù)加載機(jī)制,另外包括的狀態(tài)和的生命周前言 最近ViewPager2發(fā)布了1.0.0-alpha04版本,新增offscreenPageLimit功能,該功能在ViewPager上并不友好,現(xiàn)在官方將...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<