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

資訊專(zhuān)欄INFORMATION COLUMN

Android Material Design系列之RecyclerView和CardView

codeKK / 2905人閱讀

摘要:為用于顯示復(fù)雜視圖的新增。建議大家參考上拉更多具體使用不講了,今天我們順便講一下如何在加上拉更多的效果吧,下拉刷新我們使用的效果就行。因?yàn)槲铱词忻嫔夏壳按蟛糠值亩际沁@樣做的,下拉刷新用的效果,自己在上添加上拉更多。

去年很早之前,我就講解過(guò)RecyclerView的使用,今天我們就在講解CardView的時(shí)候,順便再把RecyclerView同時(shí)講解一下。RecyclerView、CardView為用于顯示復(fù)雜視圖的新增Widget。接下來(lái)看看如何使用吧。

RecyclerView RecyclerView介紹

RecyclerView作為替代ListView使用,它更先進(jìn),更靈活,RecyclerView標(biāo)準(zhǔn)化了ViewHolder,ListView中convertView是復(fù)用的,在RecyclerView中,是把ViewHolder作為緩存的單位了,然后convertView作為ViewHolder的成員變量保持在ViewHolder中,也就是說(shuō),假設(shè)手機(jī)屏幕可顯示10個(gè)條目,則會(huì)創(chuàng)建10個(gè)ViewHolder緩存起來(lái),每次復(fù)用的是ViewHolder,所以他把getView這個(gè)方法變?yōu)榱薿nCreateViewHolder。 ViewHolder更適合多種子布局的列表,尤其IM聊天對(duì)話(huà)框列表。

注意的是:RecyclerView不提供ListView中的setOnItemClickListener方法,我們可以在ViewHolder中添加類(lèi)似的點(diǎn)擊事件。

RecyclerView注意事項(xiàng),如何用

雖然RecyclerView充分考慮了它的擴(kuò)展性,更好用,更靈活,但是用起來(lái)也有些麻煩。所以要使用RecyclerView,要好好考慮以下幾點(diǎn):

RecyclerView.Adapter:RecyclerView.Adapter包含了一種新型適配器,其實(shí)與以前我們使用的適配器基本類(lèi)似,只是稍微有所不同,比如viewholder它幫我們封裝好了,不用像以前使用listview的適配器一樣自己去寫(xiě)viewholder了。所以它的性能比以前應(yīng)該好了不少。

LayoutManager:這個(gè)LayoutManager類(lèi)決定視圖被放在畫(huà)面中哪個(gè)位置,但這只是它的眾多職責(zé)之一。它可以管理滾動(dòng)和循環(huán)利用。LayoutManager是一個(gè)抽象類(lèi),好在系統(tǒng)提供了3個(gè)實(shí)現(xiàn)類(lèi):
1、LinearLayoutManager 現(xiàn)行管理器,支持橫向、縱向。

2、GridLayoutManager 網(wǎng)格布局管理器
3、 StaggeredGridLayoutManager 瀑布就式布局管理器

ItemAnimator:ItemAnimator簡(jiǎn)單來(lái)說(shuō)是會(huì)根據(jù)適配器上收到的相關(guān)通知去動(dòng)畫(huà)的顯示組件的修改,添加和刪除等。它會(huì)自動(dòng)添加和移除item的動(dòng)畫(huà)。自帶的默認(rèn)效果也不錯(cuò),已經(jīng)非常好了。

如何用呢?這里我就不過(guò)多介紹了,因?yàn)殛P(guān)于RecyclerView的使用,去年我很早時(shí)間就寫(xiě)過(guò)一篇文章。建議大家參考:
http://mp.weixin.qq.com/s?__biz=MjM5NDkxMTgyNw==&mid=208467006&idx=1&sn=c29971b395611008319222eaffad4f31#rd

RecyclerView上拉更多

RecyclerView具體使用不講了,今天我們順便講一下如何在RecyclerView加上拉更多的效果吧,下拉刷新我們使用SwipeRefreshLayout的效果就行。因?yàn)槲铱词忻嫔夏壳按蟛糠值腶pp都是這樣做的,下拉刷新用SwipeRefreshLayout的效果,自己在RecyclerView上添加上拉更多。

很可惜的是,RecyclerView并沒(méi)有像ListView那樣提供給我們addFooterView()那樣的方法,那該如何實(shí)現(xiàn)呢?前面我們介紹RecyclerView時(shí),說(shuō)過(guò)RecyclerView適合多種嵌套的布局效果, ViewHolder更適合多種子布局的列表。所以我們看 RecyclerView的Adapter中的一個(gè)方法如下:

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)

看到viewType了吧,就是在這里處理多種布局效果,上拉更多的布局和其他item其實(shí)沒(méi)有什么區(qū)別。所以處理方式大家都知道了吧。

第一步:添加布局狀態(tài)標(biāo)識(shí),并增加一項(xiàng)FooterView
在adapter中聲明布局狀態(tài)標(biāo)識(shí),是普通布局還是foot布局

private static final int TYPE_NORMAL_ITEM = 0;  //普通Item
private static final int TYPE_FOOTER_ITEM = 1;  //底部FooterView

在getItemCount()中加1

@Override
public int getItemCount() {
     //+1是加入底部的加載布局項(xiàng)
    return list.size() + 1;
}

第二步:重寫(xiě)getItemViewType判斷不同布局

public int getItemViewType(int position) {
    // 如果position+1等于整個(gè)布局所有數(shù)總和就是底部布局
    if (position + 1 == getItemCount()) {
         return TYPE_FOOTER_ITEM;
    } else {
         return TYPE_NORMAL_ITEM;
    }
}

第三步:在onCreateViewHolder根據(jù)viewType返回不同的布局

        //創(chuàng)建新View,被LayoutManager所調(diào)用
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        //如果viewType是普通item返回普通的布局,否則是底部布局并返回
        if (viewType == TYPE_NORMAL_ITEM) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout
                    .cardview_recyclerview_item, viewGroup, false);
            final NormalItmeViewHolder vh = new NormalItmeViewHolder(view);
            if (mClickListener != null) {
                vh.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mClickListener.onItemClick(vh.itemView, vh.getLayoutPosition());
                    }
                });
            }
            return vh;
        } else {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout
                    .recyclerview_footer_view, viewGroup, false);
            FooterViewHolder vh = new FooterViewHolder(view);
            return vh;
        }
    }

第四步:根據(jù)holder類(lèi)型判斷數(shù)據(jù)

    //將數(shù)據(jù)與界面進(jìn)行綁定的操作
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (viewHolder instanceof NormalItmeViewHolder) {
            ((NormalItmeViewHolder) viewHolder).titleTv.setText(list.get(position).getTitle());
            ((NormalItmeViewHolder) viewHolder).contentTv.setText(list.get(position).getContent());
        } else if (viewHolder instanceof FooterViewHolder) {
            FooterViewHolder footViewHolder = (FooterViewHolder) viewHolder;
            switch (load_more_status) {
                case PULLUP_LOAD_MORE:
                    footViewHolder.foot_view_item_tv.setVisibility(View.VISIBLE);
                    footViewHolder.foot_view_item_tv.setText("上拉加載更多");
                    footViewHolder.pb.setVisibility(View.GONE);
                    break;
                case LOADING_MORE:
                    footViewHolder.foot_view_item_tv.setVisibility(View.GONE);
                    footViewHolder.pb.setVisibility(View.VISIBLE);
                    break;
            }
        }
    }

到這里,關(guān)于上拉更多基本就配置完了。一會(huì)完整adapter我會(huì)貼出來(lái)的。先看效果圖,如下:

Adapter的全部代碼如下:

public class PullMoreRecyclerAdapter extends RecyclerView.Adapter {
    private static final int TYPE_NORMAL_ITEM = 0;  //普通Item
    private static final int TYPE_FOOTER_ITEM = 1;  //底部FooterView

    //上拉加載更多
    public static final int PULLUP_LOAD_MORE = 1;
    //正在加載中
    public static final int LOADING_MORE = 2;
    //默認(rèn)為0
    private int load_more_status = 0;

    public List list;
    private OnItemClickListener mClickListener;

    public PullMoreRecyclerAdapter(List list) {
        this.list = list;
    }

    //創(chuàng)建新View,被LayoutManager所調(diào)用
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        //如果viewType是普通item返回普通的布局,否則是底部布局并返回
        if (viewType == TYPE_NORMAL_ITEM) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout
                    .cardview_recyclerview_item, viewGroup, false);
            final NormalItmeViewHolder vh = new NormalItmeViewHolder(view);
            if (mClickListener != null) {
                vh.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mClickListener.onItemClick(vh.itemView, vh.getLayoutPosition());
                    }
                });
            }
            return vh;
        } else {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout
                    .recyclerview_footer_view, viewGroup, false);
            FooterViewHolder vh = new FooterViewHolder(view);
            return vh;
        }
    }

    //將數(shù)據(jù)與界面進(jìn)行綁定的操作
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (viewHolder instanceof NormalItmeViewHolder) {
            ((NormalItmeViewHolder) viewHolder).titleTv.setText(list.get(position).getTitle());
            ((NormalItmeViewHolder) viewHolder).contentTv.setText(list.get(position).getContent());
        } else if (viewHolder instanceof FooterViewHolder) {
            FooterViewHolder footViewHolder = (FooterViewHolder) viewHolder;
            switch (load_more_status) {
                case PULLUP_LOAD_MORE:
                    footViewHolder.foot_view_item_tv.setVisibility(View.VISIBLE);
                    footViewHolder.foot_view_item_tv.setText("上拉加載更多");
                    footViewHolder.pb.setVisibility(View.GONE);
                    break;
                case LOADING_MORE:
                    footViewHolder.foot_view_item_tv.setVisibility(View.GONE);
                    footViewHolder.pb.setVisibility(View.VISIBLE);
                    break;
            }
        }
    }

    @Override
    public int getItemCount() {
        //+1是加入底部的加載布局項(xiàng)
        return list.size() + 1;
    }

    public int getItemViewType(int position) {
        // 如果position+1等于整個(gè)布局所有數(shù)總和就是底部布局
        if (position + 1 == getItemCount()) {
            return TYPE_FOOTER_ITEM;
        } else {
            return TYPE_NORMAL_ITEM;
        }
    }

    //自定義的ViewHolder,持有每個(gè)Item的的所有界面元素
    public static class NormalItmeViewHolder extends RecyclerView.ViewHolder {
        public TextView titleTv, contentTv;
        public ImageView iv;

        public NormalItmeViewHolder(View view) {
            super(view);
            titleTv = (TextView) view.findViewById(R.id.item_title_tv);
            contentTv = (TextView) view.findViewById(R.id.item_content_tv);
            iv = (ImageView) view.findViewById(R.id.item_iv);
        }
    }

    /**
     * 底部FooterView布局
     */
    public static class FooterViewHolder extends RecyclerView.ViewHolder {
        public TextView foot_view_item_tv;
        public ProgressBar pb;

        public FooterViewHolder(View view) {
            super(view);
            pb = (ProgressBar) view.findViewById(R.id.progress_view);
            foot_view_item_tv = (TextView) view.findViewById(R.id.tv_content);
        }
    }

    public void setMoreStatus(int status){
        load_more_status=status;
        notifyDataSetChanged();
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mClickListener = listener;
    }

    public interface OnItemClickListener {
        public void onItemClick(View itemView, int pos);
    }
}

Activity中的代碼如下:

public class CardViewActivity extends BaseActivity {
    private RecyclerView rv;
    private SwipeRefreshLayout swipeRefreshWidget;
    private PullMoreRecyclerAdapter adapter;
    private LinearLayoutManager mLayoutManager;
    List list = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_card_view);
        rv = (RecyclerView) findViewById(R.id.rv);
        swipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget);
        swipeRefreshWidget.setColorSchemeResources(R.color.colorAccent, R.color.add_bg_color, R
                .color.colorPrimary, R.color.colorPrimaryDark, R.color.add_selected_color);
        //創(chuàng)建默認(rèn)的線(xiàn)性L(fǎng)ayoutManager
        mLayoutManager = new LinearLayoutManager(this);
        rv.setLayoutManager(mLayoutManager);
        //創(chuàng)建并設(shè)置Adapter
        adapter = new PullMoreRecyclerAdapter(getDatas());
        rv.setAdapter(adapter);

        swipeRefreshWidget.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeRefreshWidget.setEnabled(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        list.clear();
                        getDatas();
                        adapter.notifyDataSetChanged();
                        swipeRefreshWidget.setEnabled(true);
                        swipeRefreshWidget.setRefreshing(false);
                    }
                }, 2000);
            }
        });

        rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            private int lastVisibleItem;

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter
                        .getItemCount()) {
                    adapter.setMoreStatus(PullMoreRecyclerAdapter.LOADING_MORE);
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getDatas();
                            adapter.setMoreStatus(PullMoreRecyclerAdapter.PULLUP_LOAD_MORE);
                            adapter.notifyDataSetChanged();
                        }
                    }, 2000);
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
            }
        });
    }

    private List getDatas() {
        for (int i = 0; i < 10; i++) {
            CardInfo ci = new CardInfo();
            ci.setContent("美女說(shuō):非著名程序員公眾號(hào)是東半球最好的技術(shù)分享公眾號(hào)");
            ci.setTitle("非著名程序員" + i);
            list.add(ci);
        }
        return list;
    }

}
CardView CardView介紹

CardView是Android5.0之后為新增的控件,CardView是一個(gè)卡片布局,布局可以包含圓角和陰影,本質(zhì)上CardView是一個(gè)FrameLayout,因此它作為一個(gè)布局容器,可以布局其他的View。

CardView屬性

CardView中常用的屬性有:

cardElevation:設(shè)置陰影的大小

cardBackgroundColor:卡片布局的背景顏色

cardCornerRadius:卡片布局的圓角的大小

conentPadding:卡片布局和內(nèi)容之間的距離

效果圖和實(shí)例代碼

效果圖如下:

代碼如下:




    

        

        

            

            
        

    

最后友情提醒一下,使用CardView別忘了添加依賴(lài):

compile "com.android.support:cardview-v7:23.4.0"

demo的github地址:https://github.com/loonggg/MaterialDesignDemo 去star吧,我會(huì)慢慢完善的。

歡迎關(guān)注微信公眾號(hào):非著名程序員(smart_android),每天每周定時(shí)推送原創(chuàng)技術(shù)文章。所有技術(shù)文章, 均會(huì)在微信訂閱號(hào)首發(fā),關(guān)注微信公眾號(hào)可以及時(shí)獲得技術(shù)文章推送。

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

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

相關(guān)文章

  • Android Material Design系列CoordinatorLayout等

    摘要:原圖加載毛玻璃的效果比較快,你的這個(gè)打開(kāi)白屏好幾秒。這就是系列第六篇之系列之,等。這個(gè)系列的講解和實(shí)例都會(huì)整理在一個(gè)里,的地址去吧,我會(huì)慢慢完善的。 這篇文章其實(shí)我一直在想,是寫(xiě)還是不寫(xiě),因?yàn)殛P(guān)于講 CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout,Toolbar,TabLayout 等這些控件的使用,以前寫(xiě)過(guò)一篇,那就是《通...

    Little_XM 評(píng)論0 收藏0

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

0條評(píng)論

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