expandable-recycler-view icon indicating copy to clipboard operation
expandable-recycler-view copied to clipboard

How to implement endless loadmore to Expandable Recycler?

Open hantrungkien opened this issue 7 years ago • 1 comments

Please help me to implement endless loadmore to Expandable Recycler. Thanksss

hantrungkien avatar May 17 '17 07:05 hantrungkien

I done!

MyActivity `

@Override
public void onLoadMore() {
    mShoppingList.add(new ShoppingObj("load_more", "0", new ArrayList<ShoppingContentObj>
()));
    mShoppingListRecyclerAdapter.notifyParentInserted(mShoppingList.size() - 1);

    mReservationRcv.postDelayed(new Runnable() {
        @Override
        public void run() {
            mShoppingList.remove(mShoppingList.size() - 1);
            mShoppingListRecyclerAdapter.notifyParentRemoved(mShoppingList.size());

            List<ShoppingObj> newData = new ArrayList<>();
            newData.add(new ShoppingObj("Load More1", "12.04.2017", shoppingContentObjList));
            newData.add(new ShoppingObj("Load More2", "12.04.2017", shoppingContentObjList));
            newData.add(new ShoppingObj("Load More3", "12.04.2017", shoppingContentObjList));
            mShoppingListRecyclerAdapter.addMoreData(newData);
            mShoppingListRecyclerAdapter.setLoaded();
        }
    }, 2000);
}

`

MyAdapter

`

public class ShoppingListRecyclerAdapter extends ExpandableRecyclerAdapter<ShoppingObj,         
ShoppingContentObj , ParentViewHolder, ChildViewHolder> {

public static final String TAG = ShoppingListRecyclerAdapter.class.getSimpleName();
private final int PARENT_VIEW_ITEM = 0;
private final int LOADING = 2;
private Context mContext;
private List<ShoppingObj> mShoppingList = new ArrayList<>();
private OnRecyclerObjectClick listener;

private OnLoadMoreRecyclerListener onLoadMoreListener;

private int lastVisibleItem, totalItemCount;
private boolean isLoading = false;

public interface OnLoadMoreRecyclerListener {
void onLoadMore();}

public ShoppingListRecyclerAdapter(Context context, RecyclerView recyclerView, 
List<ShoppingObj> data, OnRecyclerObjectClick listener, OnLoadMoreRecyclerListener l) {
    super(data);
    this.mShoppingList = data;
    this.mContext = context;
    this.listener = listener;
    this.onLoadMoreListener = l;

    final LinearLayoutManagerWithSmoothScroller linearLayoutManager =
            (LinearLayoutManagerWithSmoothScroller) recyclerView.getLayoutManager();

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            totalItemCount = linearLayoutManager.getItemCount();
            lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition() + 1;

            if (lastVisibleItem == mShoppingList.size() && dy == 0) {
                return;
            }

            if (!isLoading && totalItemCount <= lastVisibleItem) {
                if (onLoadMoreListener != null) {
                    onLoadMoreListener.onLoadMore();
                }
                isLoading = true;
            }
        }
    });
}

@Override
public boolean isParentViewType(int viewType) {
    return viewType == LOADING || viewType == PARENT_VIEW_ITEM;
}

@Override
public int getParentViewType(int parentPosition) {
    return mShoppingList.get(parentPosition).getmName().equals("load_more") ? LOADING : PARENT_VIEW_ITEM;
}

@UiThread
@NonNull
@Override
public ParentViewHolder onCreateParentViewHolder(@NonNull ViewGroup parentViewGroup, int viewType) {
    ParentViewHolder vh;
    if (viewType == PARENT_VIEW_ITEM) {
        View v = LayoutInflater.from(parentViewGroup.getContext()).inflate(
                R.layout.item_shopping_list_parent, parentViewGroup, false);

        vh = new ShoppingListParentViewHolder(v);
    } else {
        View v = LayoutInflater.from(parentViewGroup.getContext()).inflate(
                R.layout.layout_progress_load_more, parentViewGroup, false);

        vh = new ProgressParentViewHolder(v);
    }
    return vh;
}

@UiThread
@NonNull
@Override
public ChildViewHolder onCreateChildViewHolder(@NonNull ViewGroup childViewGroup, int viewType) {
    View view = LayoutInflater.from(childViewGroup.getContext()).inflate(R.layout.item_shopping_list_child, childViewGroup, false);
    return new ShoppingListChildViewHolder(view);
}

@Override
public void onBindParentViewHolder(@NonNull ParentViewHolder parentViewHolder, int parentPosition
        , @NonNull ShoppingObj shoppingObj) {
    if (parentViewHolder instanceof ShoppingListParentViewHolder) {
        ((ShoppingListParentViewHolder) parentViewHolder).bindData(shoppingObj);
        ((ShoppingListParentViewHolder) parentViewHolder).mCheckBoxDelete.setChecked(shoppingObj.isChecked());
    } else {
        ((ProgressParentViewHolder) parentViewHolder).progressBar.setIndeterminate(true);
    }
}

@UiThread
@Override
public void onBindChildViewHolder(@NonNull ChildViewHolder childViewHolder
        , int parentPosition, int childPosition, @NonNull ShoppingContentObj shoppingContentObj) {
    ((ShoppingListChildViewHolder) childViewHolder).bindData(shoppingContentObj, childPosition);

}

class ProgressParentViewHolder extends ParentViewHolder {
    private ProgressBar progressBar;

    private ProgressParentViewHolder(View v) {
        super(v);
        progressBar = (ProgressBar) v.findViewById(R.id.progress_bar);
        progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_ATOP);
        progressBar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setExpanded(false);
                setExpandCollapseListener(null);
            }
        });
    }
}

class ShoppingListParentViewHolder extends ParentViewHolder {
    @BindView(R.id.textview_date)
    TextView mTextViewDate;

    @BindView(R.id.textview_name)
    TextView mTextViewName;

    @BindView(R.id.button_detail_edit)
    Button mButtonDetailEdit;

    @BindView(R.id.checkbox_delete)
    CheckBox mCheckBoxDelete;

    @BindView(R.id.view_line)
    View mViewLine;

    public ShoppingListParentViewHolder(@NonNull View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

    public void bindData(final ShoppingObj shoppingObj) {
        mTextViewDate.setText(shoppingObj.getmDate());
        mTextViewName.setText(shoppingObj.getmName());

        mCheckBoxDelete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                shoppingObj.setChecked(isChecked);
            }
        });
    }

    @OnClick(R.id.button_detail_edit)
    void onClickButton(View v) {
        if (mButtonDetailEdit.getText().equals(mContext.getString(R.string.details))) {
            onClick(v);
        } else {
            listener.onRecyclerObjectClick(mShoppingList.get(getAdapterPosition()));
        }
    }

    @Override
    public void setExpanded(boolean expanded) {
        super.setExpanded(expanded);
        mButtonDetailEdit.setText(expanded ? R.string.edit : R.string.details);
        mViewLine.setVisibility(expanded ? View.VISIBLE : View.INVISIBLE);
    }
}

class ShoppingListChildViewHolder extends ChildViewHolder {
    @BindView(R.id.textview_content)
    TextView mTextViewContent;

    public ShoppingListChildViewHolder(@NonNull View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

    public void bindData(ShoppingContentObj shoppingContentObj, int position) {
        mTextViewContent.setText(String.valueOf(position + 1) + ". " + shoppingContentObj.getmName());
    }
}

public void addMoreData(List<ShoppingObj> dataSwap) {
    mShoppingList.addAll(mShoppingList.size(), dataSwap);
    notifyParentDataSetChanged(false);
}

public void deleteItem() {
    if (mShoppingList.size() == 0) {
        return;
    }
    for (int i = mShoppingList.size() - 1; i >= 0; i--) {
        if (mShoppingList.get(i).isChecked()) {
            mShoppingList.remove(i);
            notifyParentRemoved(i);
        }
    }
}

public void setLoaded() {
    this.isLoading = false;
}
}

`

hantrungkien avatar May 17 '17 17:05 hantrungkien