溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android之recyclerview的基本使用

發(fā)布時間:2020-07-07 15:56:42 來源:網(wǎng)絡 閱讀:1296 作者:墨宇hz 欄目:移動開發(fā)

Google在推出Android5.0的時候推出了Material Design ,RecyclerViewMaterial Design 重要組件之一。當然還有CardView/Palette。

RecyclerView是用來替換傳統(tǒng)的ListViewGridView,瀑布流效果的。是的RecyclerView這一個控件,可以實現(xiàn)這三個效果。雖然在開始使用recyclerview的時候會感到有些男,但是用熟練了會發(fā)現(xiàn)recyclerview十分強大。它可以給每一item里面的控件設置點擊時間,而不需要擔心事件沖突的問題,如果是使用listview或者是gridview就必須要解決事件沖突,甚至listviewgridviewitem只能設置一個點擊事件,否則就會造成事件沖突,而這些沖突并不好解決。所以recyclerview來了。

首先在項目中集成RecyclerView,在build.gradle添加RecyclerView的依賴

compile 'com.android.support:recyclerview-v7:23.2.1'

這樣項目中就集成 recyclerview了,Android Studio 會自動聯(lián)網(wǎng)下載 recyclerview包。

activity_main.xml中,使用recyclerview.

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

布局中已經(jīng)有了recyclerview的控件,下面就開始在代碼中編寫。

    在這里解釋一下recyclerview的使用。就像listview那樣,recyclerview也需要一個適配器;在我們優(yōu)化listview的時候,我們經(jīng)常會使用到一個內(nèi)部類ViewHolder來保存item中的控件,以便于item的復用。而現(xiàn)在recyclerview則必須使用ViewHolder。這個ViewHolder必須繼承RecyclerView.ViewHolder,RecyclerView.ViewHolder有一個參數(shù)的構(gòu)造方法,傳入的是一個view,這個view 就是recyclerview的item。

RecyclerViewHolder:

public class RecyclerViewHolder extends RecyclerView.ViewHolder {
    public TextView textView;
    public ImageView p_w_picpathView;
    public RecyclerViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);
        p_w_picpathView = (ImageView) itemView.findViewById(R.id.p_w_picpathView);
    }
}

RecyclerViewHolder寫好之后就開始寫Adapter.同樣RecyclerAdapter需要繼承RecyclerView.Adapter<RecyclerViewHolder>,泛型ViewHolder就是自己自定義的RecyclerViewHolder。Adapter的寫法如下:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
    private List<Map<String, String>> dataList;

    public RecyclerAdapter() {
        dataList = new ArrayList<>();
    }

    public void addAll(List<Map<String, String>> data){
        dataList.addAll(data);
    }

    /**
     *
     * @param viewType 對應的是getItemViewType(int position)方法返回的數(shù)值
     */
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        return new RecyclerViewHolder(view);
    }

    /**
     *
     * @param holder 對應的是onCreateViewHolder方法,返回的RecyclerViewHolder
     * @param position 當前的item的位置
     */
    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        holder.textView.setText(dataList.get(position).get("data"));
    }

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

MainActivity中的代碼。

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    //使用線性布局管理器,設置的方向orientation是默認,即垂直方向
    private LinearLayoutManager manager;
    //適配器
    private RecyclerAdapter adapter;
    //數(shù)據(jù)源
    private List<Map<String, String>> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        manager = new LinearLayoutManager(this);
        adapter = new RecyclerAdapter();
        //設置布局管理器
        recyclerView.setLayoutManager(manager);
        //給recyclerview設置適配器
        recyclerView.setAdapter(adapter);
        list = new ArrayList<>();
        for (int i=0;i<50;i++)
        {
            Map<String,String> map = new HashMap<>();
            map.put("data", "item-->   "+i);
            list.add(map);
        }
        adapter.addAll(list);
        adapter.notifyDataSetChanged();
    }
}

recyclerview實現(xiàn)listview的效果就完成了,運行效果:

android之recyclerview的基本使用

如果是想每個item橫向滑動的話,只需要使用LinearLayoutManager的三個參數(shù)的構(gòu)造方法就行了,new LInearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)就可以實現(xiàn)橫向滑動的效果了。

    recyclerView實現(xiàn)GridView的效果。需要是用是GridLayoutManager。將recyclerView的布局管理器更換成GridLayoutManager manager = new GridLayoutManager(this, 2),效果圖如下:

android之recyclerview的基本使用

給RecyclerView添加滾動監(jiān)聽。與listView和gridView有寫不同,recyclerView判斷滾動到哪一個位置的餓時候,需要使用到使用到布局管理器(前面設置的recyclerview.setLayoutManager())。滾動監(jiān)聽的方法有兩個,setOnScrollListener(已不推薦使用)和addOnScrollListener。兩個方法本質(zhì)上是一致的。代碼如下:

recyclerView_follow.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        //滾動的狀態(tài)改變時,調(diào)用此方法。
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        //屏幕中最下面一個item的所在數(shù)據(jù)源的位置(postion)。
        int lastVisiableItem = manager.findLastVisibleItemPosition();
        //一共有多少個
        int totalItemCount = manager.getItemCount();
        //當滑動到倒數(shù)第二個item時,即聯(lián)網(wǎng)獲取下一頁的數(shù)據(jù)
        if (lastVisiableItem >= totalItemCount - 2 && dy > 0) {
            page++;//第二頁
            reloadData(page);
        }
    }
});

    給RecyclerView添加監(jiān)聽事件:

    首先在Adapter中的onBindViewHolder方法中設置點擊事件,使用holder.xxx.setOnClickListener()設置點擊事件.RecyclerView避免了事件的沖突問題,可以給每個item中的控件設置點擊事件.

        

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI