概要:私はチャットアプリケーションを持っています。今までは、リスト内のチャットアイテムをロードするために、ListViewと共にCursorAdapterを使用していました。しかし今、私はRecyclerViewをRecyclerView.Adapterで使用するコードとwhatsappのような "Load More"機能を使用するコードをリファクタリングする予定です。RecyclerView.Adapterのアイテムが多数あります - メモリの問題
問題:メモリ消費。 CursorAdapterでは、可視領域にないアイテムがガベージコレクションされましたが、今度はCustomModalのArrayListを使用しているので、リスト内のすべてのアイテムをロードすると([Load More]ボタンをクリックして)表示していますメモリログで高いメモリ消費量(ガベージコレクションなし)。
私の推測は今、私はArrayList内のすべての項目を読み込んでいて、それが問題の原因です。それですか?
問題を回避したり、問題を最適化する方法はありますか?
EDIT: は、ここに完全なコードをポストが、ここで私が実装しましたアダプタの種類の抜粋であることはできません。
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MyViewHolder> {
private ArrayList<MyModal> mMyModals;
public MessageAdapter(ArrayList<MyModal> mMyModals) {
this.mMyModals = mMyModals;
//... Some fields initialization here
}
public void changeList(ArrayList<MyModal> myModals, boolean isLoadMoreEnabled){
this.mMyModals = myModals;
//... Some fields initialization here
notifyDataSetChanged();
}
public void toggleLoadMore(boolean isLoadMoreEnabled){
if(isLoadMoreEnabled){
//..Checks if load more is already enabled or not
//..If not then enables it by adding an item at 0th poition of MyModal list
//..Then notifyDataSetChanged()
}else{
//..Checks if load more is already disabled or not
//..If not then disables it by removing an item at 0th poition of MyModal list
//..Then notifyDataSetChanged()
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder messageViewHolder = null;
View itemLayoutView = null;
MyModal.MessageType messageType = MyModal.MessageType.getMessageTypeFromValue(viewType);
switch (messageType){
case MESSAGE_TYPE1:
itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout1, null);
messageViewHolder = new Type1ViewHolder(itemLayoutView);
break;
case MESSAGE_TYPE2:
itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout2, null);
messageViewHolder = new Type2ViewHolder(itemLayoutView);
break;
}
return messageViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final MyModal myModal = mMyModals.get(position);
MyModal.MessageType messageType = myModal.getMessageType();
holder.initialize(myModal);
}
@Override
public int getItemCount() {
return (mMyModals != null)?mMyModals.size():0;
}
@Override
public int getItemViewType(int position) {
return mMyModals.get(position).getMessageType().getValue();
}
public abstract class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemLayoutView) {
super(itemLayoutView);
}
public abstract void initialize(MyModal myModal);
}
class Type1ViewHolder extends MyViewHolder {
//...Variables
public Type1ViewHolder(View itemLayoutView) {
super(itemLayoutView);
//...variables initialization here
}
@Override
public void initialize(MyModal myModal) {
//...Setting values in view using myModal
}
}
class Type2ViewHolder extends MyViewHolder {
//...Variables
public TextViewHolder(View itemLayoutView) {
super(itemLayoutView);
//...variables initialization here
}
@Override
public void initialize(MyModal myModal) {
//...Setting values in view using myModal
}
}
}
アダプタクラスを表示できますか?必要以上に多くの時間を過ごしているかもしれません。あなたがコードを投稿したら、一度チェックしてください –
ちょっとRagesh、私はコードで私の質問を更新しました。ここで問題を理解するのを助けてくれますか? – Wanted