Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> RecyclerView之更新UI數據的高級用法

RecyclerView之更新UI數據的高級用法

編輯:關於Android編程

以前在使用ListView當中,如果我們的列表數據發生了改變,我們會去調用Adapter.notifyDataSetChanged()去更新UI界面上的列表數據,當然這個方法在RecyclerView也同樣適用,那麼既然說RecyclerView是ListView最好的替代者,那麼RecyclerView有沒有什麼高級的方法呢?答案是有的。RecyclerView的Adapter支持更多種類的更新UI數據的方法,並且RecyclerView為添加刪除移動都做了默認的動畫效果。

看一下RecyclerView的Adapter主要增加了哪些方法:

notifyItemChanged(int position) 更新列表position位置上的數據可以調用 notifyItemInserted(int position) 列表position位置添加一條數據時可以調用,伴有動畫效果 notifyItemRemoved(int position) 列表position位置移除一條數據時調用,伴有動畫效果 notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的數據移到toPosition位置時調用,伴有動畫效果 notifyItemRangeChanged(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項進行數據刷新 notifyItemRangeInserted(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項批量添加數據時調用,伴有動畫效果 notifyItemRangeRemoved(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項批量刪除數據時調用,伴有動畫效果

看下本篇博文要實現的DEMO效果

這裡寫圖片描述

可以看到RecyclerView的增刪移動操作都自動帶有了動畫效果,這點靠Adapter.notifyDataSetChanged更新UI數據是做不到的,需要靠RecyclerView的Adapter新增的方法去實現。

下面詳細的介紹下實現過程

配置Recyclerview,build.gradle<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> compile 'com.android.support:recyclerview-v7:23.1.1'

首先是主界面的布局,很簡單上面一個Toolbar下面是RecyclerView,res/layout/activity_main.xml




    
    

    

RecyclerView列表項布局 ,res/layout/item_layout.xml




    

然後是Toolbar需要用到的菜單XML,分別對應的是demo效果圖toolbar上面4個選項,res/menu/menu_main.xml


然後去建立RecyclerView的Adapter,很常規的一個Adapter如果看不懂,證明你還不會使用RecyclerView建議點擊文章開頭的幾個鏈接去學習一下:)
RecyclerViewAdapter.java

/**
 * Created by LeeJizhou on 2016/4/18.
 * Blog:www.lijizhou.com
 * QQ:3107777777
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter {

    private LayoutInflater mLayoutInflater;
    private Context mContext;
    private ArrayList mTitle=new ArrayList<>();

    public RecyclerViewAdapter(Context context,ArrayListtitle){
        mContext=context;
        mTitle=title;
        mLayoutInflater=LayoutInflater.from(context);
    }

    public  static class MyViewHolder extends RecyclerView.ViewHolder{

        TextView mTextView;

        public MyViewHolder(View itemView) {
            super(itemView);
            mTextView=(TextView)itemView.findViewById(R.id.tv_text);
        }
    }

    public void remove(int position) {
        mTitle.remove(position);
        notifyItemRemoved(position);
    }

    public void add(String text, int position) {
        mTitle.add(position, text);
        notifyItemInserted(position);
    }

    @Override
    public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHolder(mLayoutInflater.inflate(R.layout.item_layout,parent,false));
    }

    @Override
    public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) {
        holder.mTextView.setText(mTitle.get(position));
    }

    @Override
    public int getItemCount() {
        return mTitle==null ? 0 : mTitle.size();
    }
}

最後是重要的MainActivity類,其中涉及到了對Toolbar的使用,不熟悉的朋友也可以順便復習下,Toolbar上面4個菜單分別對應了新增列表,刪除列表,新增批量列表,列表項移動的操作,具體可以參考下面代碼注釋,MainActivity.java

/**
 * Created by LeeJizhou on 2016/4/18.
 * Blog:www.lijizhou.com
 * QQ:3107777777
 */
public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    //item 顯示所需
    private String[] title = {"JAVA","C","C++","C#","PYTHON","PHP"
            ,".NET","JAVASCRIPT","RUBY","PERL","VB","OC","SWIFT"
    };
    private ArrayList mTitle=new ArrayList<>();
    private RecyclerViewAdapter mRecyclerViewAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //去除Toolbar標題
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        //設置菜單點擊監聽
        toolbar.setOnMenuItemClickListener(onMenuItemClick);

        mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
        Collections.addAll(mTitle,title);
        //為RecyclerView添加默認動畫效果,測試不寫也可以
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(mRecyclerViewAdapter=new RecyclerViewAdapter(this, mTitle));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {

            switch (menuItem.getItemId()) {
                case R.id.menu_add:
                    //添加模擬數據到第一項
                    mTitle.add(0, "www.lijizhou.com");
                    //RecyclerView列表進行UI數據更新
                    mRecyclerViewAdapter.notifyItemInserted(0);
                    //如果在第一項添加模擬數據需要調用 scrollToPosition(0)把列表移動到頂端(可選)
                    mRecyclerView.scrollToPosition(0);

                    break;

                case R.id.menu_del:
                    //刪除模擬數據第一項
                    mTitle.remove(0);
                    //RecyclerView 列表進行UI數據更新
                    mRecyclerViewAdapter.notifyItemRemoved(0);
                    break;

                case R.id.menu_move:
                    //列表中第二項移到第三項 進行UI數據更新
                    mRecyclerViewAdapter.notifyItemMoved(1,2);
                    break;

                case R.id.menu_addmore:
                    //模擬數據批量添加4條數據
                    mTitle.add(0,"test");
                    mTitle.add(0,"test1");
                    mTitle.add(0,"test2");
                    mTitle.add(0,"test3");
                    //RecyclerView列表進行批量UI數據更新
                    mRecyclerViewAdapter.notifyItemRangeInserted(0,4);
                   // scrollToPosition(0)作用是把列表移動到頂端
                    mRecyclerView.scrollToPosition(0);
                    break;

            }

            return true;
        }
    };

}

OK,這樣RecyclerView的Adapter更新UI數據的幾個高級用法就介紹完了,具體的還要靠自己去實踐摸索,去實踐摸索,也歡迎大家在下方留言。

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved