簡體   English   中英

從RecyclerView遷移到PagedListAdapter,數據不與SubmitList一起顯示(Android Studio JAVA)

[英]Migration from RecyclerView to PagedListAdapter, data is not shown with submitList (Android Studio JAVA)

我剛剛實現了Android組件的新體系結構,即Room,ViewModel,LiveData,Retrofit和RecyclerView,所以好吧,問題是我在recyclerview中顯示的列表成倍增長,因為它是聊天的原型,並且是應用程序可能會凍結一點。

在網上搜索時,我發現了有關PagedList Adapter的文檔,這可能是一個可能的解決方案,問題是在mainActivity中,當我調用觀察者時,應將adapter.submitList(message)放在(在onchange函數內),我沒有顯示數據

MainActivity.class

public class MainActivity extends AppCompatActivity {

    public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;

    private MenViewModel mWordViewModel;
     MensajesAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        adapter = new MensajesAdapter( getApplicationContext());


        mWordViewModel = 
        ViewModelProviders.of(this).get(MenViewModel.class);


        recyclerView.setHasFixedSize(true);
        mWordViewModel.usersList.observe(this, mensajes -> {
          adapter.submitList(mensajes);
        });

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

奇怪的是,如果我通過adapter.setwords(parameter)修改了submitList代碼(如果顯示了該列表),但是當然,它將使用notifydatasetchange()並且效率不高

PagedListAdapter-> MensajesAdapter.class

import android.arch.paging.PagedListAdapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

public class MensajesAdapter extends PagedListAdapter<Mensajes,MensajesAdapter.MensajesViewHolder> {

    private Context mCtx;
    private List<Mensajes> heroList;

    MensajesAdapter( Context context) {
        super(DIFF_CALLBACK);
        this.mCtx=context;
    }


    **void setWords(List<Mensajes> words){
        heroList = words;
        notifyDataSetChanged();
    }**


    @NonNull
    @Override
    public MensajesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mCtx).inflate(R.layout.recyclerview_layout, parent, false);
        return new MensajesViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MensajesViewHolder mensajesViewHolder, int i) {
        Mensajes men =getItem(i);
        if(men!=null) {

            mensajesViewHolder.textView.setText(men.getMensaje());
        }else{
            mensajesViewHolder.clear();
        }
    }

    @Override
    public int getItemCount() {
        if (heroList != null)
            return heroList.size();
        else return 0;
    }
    public static DiffUtil.ItemCallback<Mensajes> DIFF_CALLBACK = new DiffUtil.ItemCallback<Mensajes>() {
        @Override
        public boolean areItemsTheSame(@NonNull Mensajes oldItem, @NonNull Mensajes newItem) {
            Log.e("areITems",""+(oldItem.getId() == newItem.getId()));
            return oldItem.getId() == newItem.getId();
        }
        @Override
        public boolean areContentsTheSame(@NonNull Mensajes oldItem, @NonNull Mensajes newItem) {
            Log.e("areITems",""+(oldItem.getMensaje().equals(newItem.getMensaje())));
            return oldItem.getMensaje().equals(newItem.getMensaje());
        }
    };
    class MensajesViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public MensajesViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.mensaje);
        }
        void clear()
        {
            textView.invalidate();
        }


    }

}

視圖模型 - > MenViewModel.class

public class MenViewModel extends AndroidViewModel {

    public MensajesDao countryDao;
    private MenRepository mRepository;
    // Using LiveData and caching what getAlphabetizedWords returns has several benefits:
    // - We can put an observer on the data (instead of polling for changes) and only update the
    //   the UI when the data actually changes.
    // - Repository is completely separated from the UI through the ViewModel.
    public LiveData<PagedList<Mensajes>> mAllWords;
    public LivePagedListBuilder livePlyerList;
    public final LiveData<PagedList<Mensajes>> usersList;
    public MenViewModel(Application application) {
        super(application);
        mRepository = new MenRepository(application);
        mAllWords = mRepository.getAllWords();
        MenRoomDatabase countryDatabase = MenRoomDatabase.getDatabase(getApplication());

        countryDao = countryDatabase.mensajeDao();
        //mRepository.recargar();
        usersList =new LivePagedListBuilder<>(
                countryDao.getAllMensajes(), /* page size */ 20).build();
        livePlyerList=new LivePagedListBuilder<>(countryDatabase.mensajeDao().getAllMensajes(),new PagedList.Config.Builder()
                .setPageSize(20)
                .setPrefetchDistance(10)
                .setPageSize(20)
                .build());
    }

    LiveData<PagedList<Mensajes>> getAllWords() { return mAllWords; }

    public void insert(Mensajes mensaje) { mRepository.insert(mensaje); }

有人會告訴我這是怎么回事嗎? 我缺少或擁有什么?

確保countryDao.getAllMensajes()DataSource.Factory<Int, Mensajes>包裝,並且在Adapter中,由於使用PagedListAdapter DataSource.Factory<Int, Mensajes>您不應該手動管理列表。

在您的@Override public int getItemCount() {}執行以下操作:

    @Override
    public int getItemCount() {
        return super.getItemCount()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM