編輯:關於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數據的幾個高級用法就介紹完了,具體的還要靠自己去實踐摸索,去實踐摸索,也歡迎大家在下方留言。
本文將介紹系統接收到來電之後,如何在電話薄中進行匹配聯系人的流程。分析將從另外一篇文章(基於Android6.0的RIL框架層模塊分析)中提到的與本文內容相關的代碼開始。
在之前的博客中已經為大家介紹了,如何在win環境下配置DNK程序,本篇我將帶大家實現一個簡單的Hello jni程序,讓大家真正感受一下NDK開發的魅力。這裡我們選擇使用
關於動畫的實現,Android提供了Animation,在Android SDK介紹了2種Animation模式: 1. Tween Animation:通過對場景裡的對
LED indicator 簡介所謂的LED indicator就是手機上面充電發短信的燈,有時會亮綠燈,有時會亮紅燈,有時一起亮(橙燈),主要用於提醒用戶電量、短信、電