8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
Paging主要是用来结合RecyclerView进行使用的。它的作用是能够逐渐地、优雅地加载所需要加载的数据。也就是一种分页方案。
Paging每次只会加载总数据的一小部分。因此它有下面的两个优点:数据加载要求更小的带宽以及更少的系统资源。
在资源发生改变的情况下,app依然能够很快的做出响应。
PagedList
这个类是用来存储加载的数据。PagedList中所需要的数据都是从下面要讲的DataSource中进行加载的。
DataSource
DataSource顾名思义就是数据来源。这类提供加载所需的数据。也就是在这个类中进行数据的获取操作。数据源可以是DataBase也可以是服务器。
DataSource的三个子类:PositionalDataSource: 主要用于加载数据可数有限的数据。比如加载本地数据库,这种情况下用户可以通过比如说像通讯录按姓的首字母查询的情况。能够跳转到任意的位置。
ItemKeyedDataSource:主要用于加载逐渐增加的数据。比如说网络请求的数据随着不断的请求得到的数据越来越多。然后它适用的情况就是通过N-1item的数据来获取Nitem数据的情况。比如说Github的api。
PageKeyedDataSource:这个和ItemKeyedDataSource有些相似,都是针对那种不断增加的数据。这里网络请求得到数据是分页的。比如说知乎日报的news的api。
DataSource.Factory
这个接口的实现类主要是用来获取的DataSource的。
PagedListAdapter
这个Adapter继承自RecyclerView.Adapter。如果要使用Paging,就需要让实现的RecyclerView的Adapter继承自PagedListAdapter。这个抽象类实现关于PagedList相关的东西。
LivePagedListBuilder
通过这个类来生成对应的PagedList。
准备
// RxJavaimplementation "io.reactivex.rxjava2:rxjava:2.2.2"
implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
// Retrofitimplementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0"
implementation "com.squareup.retrofit2:converter-gson:2.4.0"
implementation "com.squareup.retrofit2:retrofit:2.4.0"
// ViewModel and LiveDatadef lifecycle_version = "1.1.1"
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"
// Roomdef room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
kapt "android.arch.persistence.room:compiler:$room_version"
implementation "android.arch.persistence.room:rxjava2:$room_version"
// Pagingdef paging_version = "1.0.0"
implementation "android.arch.paging:runtime:$paging_version"
// Glideimplementation "com.github.bumptech.glide:glide:4.8.0"
kapt 'com.github.bumptech.glide:compiler:4.8.0'
应该大家都清楚这些库吧。这里就不一一解释了。这里进行举例说明会用到Room、ViewModel、LiveData,请还不了解的朋友去看我的另外几篇博客。
PositionalDataSource的使用
数据库部分
@Entity
data class Person(@PrimaryKey(autoGenerate = true) val id: Int, val name: String)
@Dao
interface PersonDao {
@Insert
fun insertPerson(person: Person)
@Insert
fun insertPersons(persons: List)
@Delete
fun deletePerson(person: Person)
@Query("SELECT * FROM Person ORDER BY name COLLATE NOCASE ASC")
fun getAllPersons(): DataSource.Factory
}
关于Dao这里需要解释一下。getAllPersons返回一个DataSource.Factory。在之后会通过LivePagedListBuilder来构建PagedList。
@Database(entities = [Person::class], version = 1)
abstract class PersonDatabase : RoomDatabase() {
abstract fun personDao(): PersonDao
companion object {
private var INSTANCE: PersonDatabase? = null
fun get(context: Context): PersonDatabase {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context, PersonDatabase::class.java,
"PersonDatabase")
.addCallback(object :RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
fillDatabase(context)
}
})
.build()
}
return INSTANCE!!
}
private fun fillDatabase(context: Context) {
ioThread {
CHEESE_DATA.map {
get(context).personDao().insertPerson(Person(0, it))
}
}
}
}
}
private val EXECUTOR = Executors.newSingleThreadExecutor()
fun ioThread(f: () -> Unit) {
EXECUTOR.execute(f)
}
private val CHEESE_DATA = arrayListOf(
"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
"Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
"Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
"Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
"Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
"Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
"Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
"Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
"Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
"Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
"Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
"Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
"Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
"Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
"Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
"Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
"Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
"Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
"Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
"Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
"Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
"Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
"Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",