android 列表,4萬數據,也能快速顯示java
開發android 應用的時候,數據列表,使用率特別高。android
寫列表的時候,就得寫適配器,挺煩人的。雖然網上有萬能適配器。數組
可是做爲一個效率高的人(懶人),重複的事情是毫無成長價值可言的。bash
因此就有了,快速可使用的列表的想法ide
後來,我接手更改別人作的項目。遇到一個好恐怖的事情。函數
邏輯上,一個頁面,須要顯示一個庫的完整內容。也許是前期沒想到有這麼多數據,佈局
在測試庫裏,只有4000多條。但接入正式庫,4萬多,(如今已是6萬,估計還能漲)測試
那個頁面加載顯示出來,整整花了半個小時,gradle
期間OOM, 我給他開了全局硬件加速便沒有OOM掉了。ui
因此,能夠快速加載顯示列表的想法就來了。
因而SuperRecycler 誕生了
目前測試 是 4萬條數據 80-90ms
10萬條數據,,for循環添加數據都炸了
再多的數據 也就沒有測試了 ,4萬多的測試 應該是夠了。
列表最簡單的就是item只顯示一行數據,沒有啥內點擊什麼的。
private SuperRecyclerview myRecyclerview;
public void recycler(){
myRecyclerview = new SuperRecyclerview(this); //參數是當前Activity //設置Recyclerid 和item 佈局
myRecyclerview.setID_Item(R.id.recycer, R.layout.recycler_item); myRecyclerview.setItemnumber(20); //item數量
//item內的數據,
myRecyclerview.setRecyclerItemData(new SuperRecyclerview.RecyclerItemData() {
@Override
public void RecyclerItemData(final SuperRecyclerview.RecyclerAdapter.ViewHolder
holder, final int position) {
holder.<TextView>getView(R.id.text).setText("數據內容");
}
});
myRecyclerview.StartRecycer(); //啓動器
}
複製代碼
是的 就只有上面那麼一點點代碼,一個列表就實現了,適配器什麼,特殊需求再寫咯。
holder.<TextView>getView(R.id.text)
<>內表示使用View的類型
()內是使用View的ID
紅色那行代碼 和普通的實例化後的View沒什麼區別
在啓動器以前寫
//item
的點擊事件
myRecyclerview.setOnItemClickListener(new SuperRecyclerview.OnItemClickListener()
{
@Override
public void onClick(int position) { //短按 position 是第幾個item,從0開始。
}
@Override
public void onLongClick(int position) { //長按
}
});複製代碼
也是在啓動器以前,不過是在數據接口的裏面寫,
//item內的數據,
myRecyclerview.setRecyclerItemData(new SuperRecyclerview.RecyclerItemData()
{
@Override
public void RecyclerItemData(final SuperRecyclerview.RecyclerAdapter.ViewHolder
holder, final int position) {
holder.<TextView>getView(R.id.text).setText("數據內容");
//item內的點擊事件,和普通寫點擊事件,沒有區別
holder.<TextView>getView(R.id.text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.<TextView>getView(R.id.text).setText("00000");
}
});
}
});複製代碼
重點就是下面這個,
holder.<TextView>getView(R.id.text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.<TextView>getView(R.id.text).setText("00000");
}
});
複製代碼
說明
holder.<TextView>getView(R.id.text)//獲取控件實列,而後就和往常點擊事件同樣寫就能夠複製代碼
1
SuperRecyclerview(Activity activity)複製代碼
參數是 當前activity; 知足大部分需求了
2
SuperRecyclerview(Context context,RecyclerViewrecyclerView,int recyclerItem_layout)複製代碼
參數是
類型 |
說明 |
Content |
上下文 this |
RecyclerView |
RecyclerView已綁定好控件(findViewByID) |
Int |
Item佈局文件 |
說明,
第一個是在activity裏和Fragment內 應該均可以隨便使用的。Fragment內使用getActivity
第二個是,當在小布局的時候,就是不能有效的綁定RecyclerView控件的時候使用
通常狀況下,都是使用第一個。
首先類的實例化,其次就是下面的三個方法
方法(參數類型) |
說明 |
setID_Item(int ,int) |
設置view和item佈局(view的ID,item的佈局) |
setItemnumber(int) |
設置Item數量 |
StarRecycler() |
主要流程,最後寫。 |
若是隻是寫這些的話,就只是顯示item原來圖示。
可用方法(參數類型) |
說明 |
|
setVertical() |
設置Recycler 垂直分佈item |
|
setHorizontal() |
設置Recycler 水平分佈item |
|
setItemSpacing(int,int,int,int) |
設置item上下左右間距,單位 |
|
以上,必須在啓動器以前使用 |
|
|
|
|
|
兩個接口 |
|
|
setOnItemClickListener(OnItemClickListener) |
Item的點擊事件 ,參數,直接new它就ok |
|
setRecyclerItemData(RecyclerItemData) 數據接口 |
Item的數據處理,參數,直接new 被使用在適配器的onBindViewHolder中 有關操做,也能夠在這裏寫 |
|
|
|
|
能夠獲取的內容 |
|
|
getAdapter() |
獲取適配器 |
|
getRecyclerView() |
獲取RecyclerVIew實列(好像沒啥用) |
|
getLinearLayoutManager() |
獲取LinearLayoutManager |
|
|
|
|
有關數據操做(參數類型) |
|
return(返回值) |
DataSortLS(List<String>) |
List<String>的排序 |
排序後的數據 |
DataSortALS(ArrayList<String>) |
ArrayList<String>的排序 |
排序後的數據 |
DataDelRepeatLS(List<String>) |
List<String>的去重複 |
去重後的數據 |
DataDelRepeatALS(ArrayList<String>) |
ArrayList<String>的去重 |
去重後的數據 |
notifyDataSetChanged() |
刷新全部數據(想刷新某個數據,請獲取適配器,在使用適配器中的刷新方法) |
|
downItemNotifyChange(int,int,int) 參數: 開始顯示幾個item 剩下幾個item的時候,刷新後面item 刷新幾個item |
下拉,分段式刷新僅限在數據接口中使用 (沒啥子用) 原本是想分段加載數據,可是如今數據不須要和原來同樣加載,全部也就沒啥用了
|
|
|
|
|
|
|
|
有關item數量的操做(參數類型) |
|
參數說明 |
itemAddNumber(int) |
增長item |
增長item的數量 |
itemDelNumber(int) |
刪除item |
刪除後剩餘item數量 |
itemNumberRevise(int) |
item數量變動刷新 |
變動後item數量 |
setItemNumberNET() |
|
|
說明:由於數據不會到達adapter,因此一切有關數據的操做,請在源數據中進行。 好比, 增長5個item,,,那麼相對應,,數據中也得要增長5條數據。不然會報數組越界錯誤 增長和刪除 不涉及數據刷新。 |
在數據源上操做
//增長item
public void addRecyclerItem(){
for (int i = 0; i < 10; i++){ //在數據源上增長10條數據
arrayList.add("喵喵"+i);
}
myRecyclerview.itemAddNumber(10); //參數:增長item的數量
myRecyclerview.notifyDataSetChanged(); //刷新全部
}複製代碼
在數據源上操做
//刪除item
public
void delRecyclerItem(){
for (int i = 0; i<10; i++){ //刪除前10條數據,數組中刪除數據當心,每次刪除數據,剩餘數據下標會-1
arrayList.remove(0);
}
myRecyclerview.itemDelNumber(arrayList.size()); //參數:剩餘item的數量
myRecyclerview.notifyDataSetChanged(); //刷新
}
複製代碼
這裏寫的代碼,是使用在適配器中的:onBindViewHolder() 方法體中
適配器中的onBindViewHolder() 是顯示一個item,刷新一次
全部有要在適配器onBindViewHolder()中寫的需求均可以在數據接口中寫
同時,弊端也別在數據接口中 寫特別耗時的操做。
第一個 使用SuperRecycler.jar包,在分享連接內有
缺點,沒有註釋,android studio的ctrl+Q 看不到註釋了。
第二個 複製SuperRecycler.java文件到你的代碼目錄下
由於集成只有一個文件,因此這個操做很方便。並且每一個使用的方法都有註釋
若是是,代碼紅字錯誤,在build.gradle中請使用
implementation 'com.android.support:recyclerview-v7:28.0.0'
版本根據你的support版本自定
含有例子和使用文檔
提取碼 ydnd
歡迎大佬的進羣交流更多的android 開發經驗
羣號 663917708
資源失效,進羣找羣主
求關注,求贊