相关疑难解决方法(0)

ListAdapter不会更新reyclerview中的项目

我正在使用新的支持库ListAdapter.这是我的适配器代码

class ArtistsAdapter : ListAdapter<Artist, ArtistsAdapter.ViewHolder>(ArtistsDiff()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(parent.inflate(R.layout.item_artist))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        fun bind(artist: Artist) {
            itemView.artistDetails.text = artist.artistAlbums
                    .plus(" Albums")
                    .plus(" \u2022 ")
                    .plus(artist.artistTracks)
                    .plus(" Tracks")
            itemView.artistName.text = artist.artistCover
            itemView.artistCoverImage.loadURL(artist.artistCover)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在更新适配器

musicViewModel.getAllArtists().observe(this, Observer {
            it?.let {
                artistAdapter.submitList(it)
            }
        })
Run Code Online (Sandbox Code Playgroud)

我的差异类

class ArtistsDiff : DiffUtil.ItemCallback<Artist>() {
    override fun areItemsTheSame(oldItem: Artist?, newItem: Artist?): Boolean { …
Run Code Online (Sandbox Code Playgroud)

android listadapter kotlin

46
推荐指数
10
解决办法
9914
查看次数

如何使用体系结构组件分页库停止在回收器视图上闪烁

我有一个类似聊天的活动,我使用带有PagedListAdaper的RecyclerView来加载一堆消息.我正在使用PositionalDataSource来加载数据.加载它的自我工作正常但是当我发送消息时,我使我的数据源无效并且列表被重新制作.我的问题是,当它这样做时它会闪烁:

这就是它的样子

我尝试添加setHasStableIds(true)并重写getItemId,它可以在一个简单的适配器上工作,但它似乎在这里不起作用.我似乎也无法将项添加到getCurrentList(),因为它不受支持.此外,我没有使用数据库,只是向服务器发出请求.

所以我的问题是,除了使数据源失效之外,还有更好的方法吗?有没有办法阻止列表在发送消息时闪烁?或者这个图书馆不适合我的聊天活动?

编辑:

我的差异回调

private val DIFF_CALLBACK: DiffCallback<MessageModel> = object : DiffCallback<MessageModel>() {
        override fun areItemsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.id == newMessage.id


        override fun areContentsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.equals(newMessage)
    }
Run Code Online (Sandbox Code Playgroud)

Edit2我修复了它:

所以我设法通过使用PagedListAdapterHelper并在加载项目后设置它的列表来修复它:

private var mHelper: PagedListAdapterHelper<MessageModel>? = null

init {
    mHelper = PagedListAdapterHelper(this, DIFF_CALLBACK)
    setHasStableIds(true)
}
fun setList(pagedList: PagedList<MessageModel>) {
    pagedList.addWeakCallback(pagedList.snapshot(), object:PagedList.Callback() {
        override fun onChanged(position: Int, count: Int) {

        }

        override fun onInserted(position: Int, count: Int) {
            mHelper?.setList(pagedList) …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-paging

10
推荐指数
1
解决办法
1734
查看次数

实时数据列表 - 适配器不会使用 DiffUtil 方法更新

我是 Android 新手,我正在尝试使用新架构组件实现条码阅读器场景。

每次读取条码时,我想更新 ViewModel 中的列表,如果列表中不存在条码或增加数量,则添加一个新元素。

以下解决方案有效,但在适配器上调用“notifyDataSetChanged”以更新 UI 并不能让我满意。这是因为 ViewModel 列表和适配器内部列表包含对相同对象的引用,因此 DiffUtil 不会捕获任何更改。

有没有更好的方法来更新 UI?除了适配器之外,我还应该考虑处理架构组件的任何改进吗?

视图模型

public class ScannerViewModel extends ViewModel {

    private MutableLiveData<List<ProductScan>> scanListLD;

    public ScannerViewModel() {   
        scanListLD = new MutableLiveData<>();
        scanListLD.setValue(new ArrayList<ProductScan>());
    }

    public LiveData<List<ProductScan>> getScanList() {
        return scanListLD;
    }

    public void addBarcode(String barcode) {
        List<ProductScan> list = scanListLD.getValue();
        ProductScan scan = null;
        for (ProductScan item : list) {
            if (item.barcode.equals(barcode)) {
                scan = item;
                break;
            }
        }
        if (scan == null) {
            scan = new ProductScan();
            scan.barcode …
Run Code Online (Sandbox Code Playgroud)

android adapter android-architecture-components

5
推荐指数
1
解决办法
4602
查看次数