Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

仅在明确需要的场景下允许item为空, fix #3793 #3805

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class AnimationAdapter :
return QuickViewHolder(R.layout.layout_animation, parent)
}

override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Status?) {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Status) {
when (holder.layoutPosition % 3) {
0 -> holder.setImageResource(R.id.img, R.mipmap.animation_img1)
1 -> holder.setImageResource(R.id.img, R.mipmap.animation_img2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.chad.baserecyclerviewadapterhelper.R;
import com.chad.baserecyclerviewadapterhelper.databinding.ItemMovieBinding;
Expand All @@ -30,9 +29,7 @@ protected DataBindingHolder<ItemMovieBinding> onCreateViewHolder(@NonNull Contex
}

@Override
protected void onBindViewHolder(@NonNull DataBindingHolder<ItemMovieBinding> holder, int position, @Nullable Movie item) {
if (item == null) return;

protected void onBindViewHolder(@NonNull DataBindingHolder<ItemMovieBinding> holder, int position, @NonNull Movie item) {
// 获取 Binding
ItemMovieBinding binding = holder.getBinding();
binding.setMovie(item);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ class DiffDragAndSwipeAdapter :
}

override fun onBindViewHolder(
holder: QuickViewHolder, position: Int, item: DiffEntity?
holder: QuickViewHolder, position: Int, item: DiffEntity
) {
if (item == null) return

holder.setText(R.id.tweetName, item.title)
.setText(R.id.tweetText, item.content)
.setText(R.id.tweetDate, item.date)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ open class HeaderDragAndSwipeAdapter : BaseQuickAdapter<String, QuickViewHolder>
return QuickViewHolder(R.layout.item_draggable_view, parent)
}

override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: String?) {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: String) {
when (holder.layoutPosition % 3) {
0 -> holder.setImageResource(R.id.iv_head, R.mipmap.head_img0)
1 -> holder.setImageResource(R.id.iv_head, R.mipmap.head_img1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class EmptyViewAdapter : BaseQuickAdapter<Status, EmptyViewAdapter.VH>() {
return VH(parent)
}

override fun onBindViewHolder(holder: VH, position: Int, item: Status?) {
override fun onBindViewHolder(holder: VH, position: Int, item: Status) {
when (holder.layoutPosition % 3) {
0 -> holder.binding.img.setImageResource(R.mipmap.animation_img1)
1 -> holder.binding.img.setImageResource(R.mipmap.animation_img2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@ package com.chad.baserecyclerviewadapterhelper.activity.headerfooter.adapter
import android.content.Context
import android.view.ViewGroup
import com.chad.baserecyclerviewadapterhelper.R
import com.chad.library.adapter.base.BaseSingleItemAdapter
import com.chad.library.adapter.base.SimpleSingleItemAdapter
import com.chad.library.adapter.base.viewholder.QuickViewHolder

class FooterAdapter(
private val isDelete: Boolean
) : BaseSingleItemAdapter<Any, QuickViewHolder>() {
) : SimpleSingleItemAdapter<QuickViewHolder>() {

override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder {
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): QuickViewHolder {
return QuickViewHolder(R.layout.footer_view, parent)
}

override fun onBindViewHolder(holder: QuickViewHolder, item: Any?) {
override fun onBindViewHolder(holder: QuickViewHolder) {
if (isDelete) {
holder.setImageResource(R.id.iv, R.mipmap.rm_icon)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,14 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chad.baserecyclerviewadapterhelper.R
import com.chad.library.adapter.base.BaseSingleItemAdapter
import com.chad.library.adapter.base.SimpleSingleItemAdapter

class HeaderAdapter: BaseSingleItemAdapter<Any, HeaderAdapter.VH>() {
class HeaderAdapter : SimpleSingleItemAdapter<HeaderAdapter.VH>() {

class VH(view: View): RecyclerView.ViewHolder(view)
class VH(view: View) : RecyclerView.ViewHolder(view)

override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
val view = LayoutInflater.from(parent.context).inflate(R.layout.head_view, parent, false)
return VH(view)
}

override fun onBindViewHolder(holder: VH, item: Any?) {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ class HomeAdapter(data: List<HomeEntity>) : BaseMultiItemAdapter<HomeEntity>(dat
return ItemVH(viewBinding)
}

override fun onBind(holder: ItemVH, position: Int, item: HomeEntity?) {
if (item == null) return
override fun onBind(holder: ItemVH, position: Int, item: HomeEntity) {
holder.viewBinding.textView.text = item.name
holder.viewBinding.icon.setImageResource(item.imageResource)
}
Expand All @@ -39,9 +38,7 @@ class HomeAdapter(data: List<HomeEntity>) : BaseMultiItemAdapter<HomeEntity>(dat
return HeaderVH(viewBinding)
}

override fun onBind(holder: HeaderVH, position: Int, item: HomeEntity?) {
if (item == null) return

override fun onBind(holder: HeaderVH, position: Int, item: HomeEntity) {
holder.viewBinding.more.visibility = View.GONE
holder.viewBinding.header.text = item.sectionTitle
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chad.baserecyclerviewadapterhelper.R
import com.chad.library.adapter.base.BaseSingleItemAdapter
import com.chad.library.adapter.base.SimpleSingleItemAdapter
import com.chad.library.adapter.base.fullspan.FullSpanAdapterType

class HomeTopHeaderAdapter : BaseSingleItemAdapter<Any, HomeTopHeaderAdapter.VH>(), FullSpanAdapterType {
class HomeTopHeaderAdapter : SimpleSingleItemAdapter<HomeTopHeaderAdapter.VH>(),
FullSpanAdapterType {

companion object {
val HEAD_VIEWTYPE = 0x10000556
Expand All @@ -21,9 +22,6 @@ class HomeTopHeaderAdapter : BaseSingleItemAdapter<Any, HomeTopHeaderAdapter.VH>
return VH(LayoutInflater.from(parent.context).inflate(R.layout.top_view, parent, false))
}

override fun onBindViewHolder(holder: VH, item: Any?) {
}

override fun getItemViewType(position: Int, list: List<Any?>): Int {
return HEAD_VIEWTYPE
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class RecyclerViewAdapter : BaseQuickAdapter<Status, RecyclerViewAdapter.VH>() {
return VH(parent)
}

protected override fun onBindViewHolder(holder: VH, position: Int, item: Status?) {
protected override fun onBindViewHolder(holder: VH, position: Int, item: Status) {
when (holder.layoutPosition % 3) {
0 -> holder.viewBinding.img.setImageResource(R.mipmap.animation_img1)
1 -> holder.viewBinding.img.setImageResource(R.mipmap.animation_img2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ class GroupAdapter : BaseQuickAdapter<GroupDemoEntity.Group, GroupAdapter.VH>(){
return VH(parent)
}

override fun onBindViewHolder(holder: VH, position: Int, item: GroupDemoEntity.Group?) {
if (item == null) return

override fun onBindViewHolder(holder: VH, position: Int, item: GroupDemoEntity.Group) {
holder.binding.tvTitle.text = item.title
holder.binding.tvContent.text = item.content

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ abstract class BaseMultiItemAdapter<T>(items: List<T> = emptyList()) :
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, item: T?) {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, item: T) {
findListener(holder)?.onBind(holder, position, item)
}

override fun onBindViewHolder(
holder: RecyclerView.ViewHolder, position: Int, item: T?, payloads: List<Any>
holder: RecyclerView.ViewHolder, position: Int, item: T, payloads: List<Any>
) {
if (payloads.isEmpty()) {
onBindViewHolder(holder, position, item)
Expand Down Expand Up @@ -115,9 +115,9 @@ abstract class BaseMultiItemAdapter<T>(items: List<T> = emptyList()) :
interface OnMultiItemAdapterListener<T, V : RecyclerView.ViewHolder> {
fun onCreate(context: Context, parent: ViewGroup, viewType: Int): V

fun onBind(holder: V, position: Int, item: T?)
fun onBind(holder: V, position: Int, item: T)

fun onBind(holder: V, position: Int, item: T?, payloads: List<Any>) {
fun onBind(holder: V, position: Int, item: T, payloads: List<Any>) {
onBind(holder, position, item)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ abstract class BaseQuickAdapter<T, VH : RecyclerView.ViewHolder>(
* @param holder A fully initialized helper.
* @param item The item that needs to be displayed.
*/
protected abstract fun onBindViewHolder(holder: VH, position: Int, item: T?)
protected abstract fun onBindViewHolder(holder: VH, position: Int, item: T)

/**
* Optional implementation this method and use the helper to adapt the view to the given item.
Expand All @@ -162,7 +162,7 @@ abstract class BaseQuickAdapter<T, VH : RecyclerView.ViewHolder>(
* @param item The item that needs to be displayed.
* @param payloads payload info.
*/
protected open fun onBindViewHolder(holder: VH, position: Int, item: T?, payloads: List<Any>) {
protected open fun onBindViewHolder(holder: VH, position: Int, item: T, payloads: List<Any>) {
onBindViewHolder(holder, position, item)
}

Expand Down Expand Up @@ -397,13 +397,13 @@ abstract class BaseQuickAdapter<T, VH : RecyclerView.ViewHolder>(

/**
* Get the data item associated with the specified position in the data set.
* 获取与数据集中指定位置的数据项。如果未找到数据,则返回 null
* 获取与数据集中指定位置的数据项。
*
* @param position Position of the item whose data we want within the adapter's
* data set.
* @return The data at the specified position.
*/
fun getItem(@IntRange(from = 0) position: Int): T? = items.getOrNull(position)
open fun getItem(@IntRange(from = 0) position: Int): T = items[position]

/**
* 获取对应首个匹配的 item 数据的索引。如果返回 -1,表示不存在
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@ package com.chad.library.adapter.base

import androidx.recyclerview.widget.RecyclerView

abstract class SimpleSingleItemAdapter<VH : RecyclerView.ViewHolder>() :
BaseSingleItemAdapter<Any?, VH>(null) {

protected open fun onBindViewHolder(holder: VH) {}
final override fun onBindViewHolder(holder: VH, item: Any?) {
onBindViewHolder(holder)
}

open fun onBindViewHolder(holder: VH, payloads: List<Any>) {
onBindViewHolder(holder)
}

final override fun onBindViewHolder(holder: VH, item: Any?, payloads: List<Any>) {
onBindViewHolder(holder, payloads)
}
}

/**
* Adapter for single item
* 只有单个/一个 item 情况下的 Adapter
Expand All @@ -10,77 +27,81 @@ import androidx.recyclerview.widget.RecyclerView
* @param VH viewHolder类型 type of the viewHolder
* @property mItem 数据 data
*/
abstract class BaseSingleItemAdapter<T, VH : RecyclerView.ViewHolder>(private var mItem: T? = null) :
BaseQuickAdapter<Any?, VH>() {
abstract class BaseSingleItemAdapter<T, VH : RecyclerView.ViewHolder>(private var mItem: T) :
BaseQuickAdapter<T, VH>() {

protected abstract fun onBindViewHolder(holder: VH, item: T?)
protected abstract fun onBindViewHolder(holder: VH, item: T)

open fun onBindViewHolder(holder: VH, item: T?, payloads: List<Any>) {
open fun onBindViewHolder(holder: VH, item: T, payloads: List<Any>) {
onBindViewHolder(holder, item)
}

final override fun onBindViewHolder(holder: VH, position: Int, item: Any?) {
final override fun onBindViewHolder(holder: VH, position: Int, item: T) {
onBindViewHolder(holder, mItem)
}

final override fun onBindViewHolder(holder: VH, position: Int, item: Any?, payloads: List<Any>) {
final override fun onBindViewHolder(holder: VH, position: Int, item: T, payloads: List<Any>) {
onBindViewHolder(holder, mItem, payloads)
}

final override fun getItemCount(items: List<Any?>): Int {
final override fun getItemCount(items: List<T>): Int {
return 1
}

override fun getItem(position: Int): T {
return mItem
}

/**
* 设置 item 数据(payload 方式)
*
* @param t
* @param payload
*/
fun setItem(t: T?, payload: Any?) {
fun setItem(t: T, payload: Any?) {
mItem = t
notifyItemChanged(0, payload)
}

/**
* 获取/设置 item 数据
*/
var item: T?
var item: T
get() = mItem
set(value) {
mItem = value
notifyItemChanged(0)
}

override fun submitList(list: List<Any?>?) {
override fun submitList(list: List<T>?) {
throw RuntimeException("Please use setItem()")
}

override fun add(data: Any?) {
override fun add(data: T) {
throw RuntimeException("Please use setItem()")
}

override fun add(position: Int, data: Any?) {
override fun add(position: Int, data: T) {
throw RuntimeException("Please use setItem()")
}

override fun addAll(collection: Collection<Any?>) {
override fun addAll(collection: Collection<T>) {
throw RuntimeException("Please use setItem()")
}

override fun addAll(position: Int, collection: Collection<Any?>) {
override fun addAll(position: Int, collection: Collection<T>) {
throw RuntimeException("Please use setItem()")
}

override fun remove(data: Any?) {
override fun remove(data: T) {
throw RuntimeException("Please use setItem()")
}

override fun removeAt(position: Int) {
throw RuntimeException("Please use setItem()")
}

override fun set(position: Int, data: Any?) {
override fun set(position: Int, data: T) {
throw RuntimeException("Please use setItem()")
}
}