Open ionutmarisca opened 8 years ago
Add this in your adapter
SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
Then add this at the end of your onBindViewHolder
mItemManger.bindView(viewHolder.itemView, position);
its work fine on me..
i also getting this issue and i implement this
SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this); mItemManger.bindView(viewHolder.itemView, position);
but getting me issue "java.lang.IllegalArgumentException: adapter should implement the SwipeAdapterInterface"
then i implemeted SwipeAdapterInterface with one override method @Override public int getSwipeLayoutResourceId(int i) { return 0; }
but still getting this issue "java.lang.IllegalArgumentException: adapter should implement the SwipeAdapterInterface". What should i do?
@afiqiqmal Thanks for the answer. However, as @arpitjoshi08 stated, after trying to add those lines of code I get an IllegalArgumentException: adapter should implement the SwipeAdapterInterface.
After implementing the SwipeAdapterInterface same error occurs. However, if I try to implement SwipeItemMangerInterface with all of its functions I will no longer get an exception but the expected behavior won't happen as the function closeAllExcept(SwipeLayout) is overridden and I don't know how to exactly implement it.
Can anyone take a look and provide a solution for this issue? Thanks for your support.
now i implemented that SwipeItemMangerInterface with methods but i am getting this issue "java.lang.IllegalStateException: can not find SwipeLayout in target view" on this line mItemManger.bindView(viewHolder.itemView, position);
`
public class adpater extends RecyclerView.Adapter
ArrayList
public adapter(Context context, ArrayList<Bean> dataList) {
this.context = context;
inflater = LayoutInflater.from(context);
this.dataList = dataList;
mItemMange=new SwipeItemRecyclerMangerImpl(this);
}
public void setNewList(Context context, ArrayList<Bean> dataList) {
this.context = context;
this.dataList = dataList;
notifyDataSetChanged();
mItemMange=new SwipeItemRecyclerMangerImpl(this);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.xyz, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
Bean messageBean = dataList.get(position);
holder.Name.setText(messageBean.get_name());
if (messageBean.getMessage_status().equalsIgnoreCase("0")) {
holder.toggleButton.setText("xu");
holder.blocked.setBackgroundColor(context.getResources().getColor(R.color.transparent));
} else {
holder.toggleButton.setText("ab");
holder.blocked.setBackgroundColor(context.getResources().getColor(R.color.red));
}
/* holder.swipeLayout.setSwipeEnabled(false); */
holder.blockedImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.swipeLayout.open();
}
});
mItemMange.bindView(holder.itemView, position);
}
@Override
public int getItemCount() {
return dataList.size();
}
@Override
public int getSwipeLayoutResourceId(int i) {
return 5;
}
@Override
public void openItem(int i) {
}
@Override
public void closeItem(int i) {
}
@Override
public void closeAllExcept(SwipeLayout swipeLayout) {
}
@Override
public void closeAllItems() {
}
@Override
public List<Integer> getOpenItems() {
return null;
}
@Override
public List<SwipeLayout> getOpenLayouts() {
return null;
}
@Override
public void removeShownLayouts(SwipeLayout swipeLayout) {
}
@Override
public boolean isOpen(int i) {
return false;
}
@Override
public Attributes.Mode getMode() {
return null;
}
@Override
public void setMode(Attributes.Mode mode) {
}
class MyViewHolder extends RecyclerView.ViewHolder {
DosisRegularFont Name;
TextView toggleButton;
RelativeLayout blocked;
ImageView blockedImage;
SwipeLayout swipeLayout;
public MyViewHolder(View itemView) {
super(itemView);
Name = (DosisRegularFont) itemView.findViewById(R.id.x);
toggleButton = (TextView) itemView.findViewById(R.id.y);
blocked = (RelativeLayout) itemView.findViewById(R.id.z);
blockedImage = (ImageView) itemView.findViewById(R.id.a);
swipeLayout = (SwipeLayout) itemView.findViewById(R.id.b);
}
}
} ` this is my adapter code .so what should i do changes for proper implementation?
getSwipeLayoutResourceId
should return the SwipeLayout Id in your ViewHolder. @arpitjoshi08 @ionutmarisca
// inside OnBindViewHolder() method, at the very bottom. put this code ItemManger.bindView(holder.itemView, position);
// and then add swipelistener to current swipelayout holder.swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() { @override public void onStartOpen(SwipeLayout layout) { mItemManger.closeAllExcept(layout); } }
This work for my case. The bold one is the key
@aptgopal what is ItemManager class in your above mentioned solution.
Implementing SwipeAdapterInterface
leads to an IllegalArgumentException
.
Looking at the code for SwipeItemMangerImpl
, the cause of the exception is that it's really checking if the adapter is an instance of SwipeItemMangerInterface
(SwipeAdapterInterface
is not).
So trying to implement SwipeItemMangerInterface
instead leads to a ClassCastExecption
, where SwipeItemManagerImpl
tries to cast the adapter to a SwipeAdapterInterface
.
Not sure how to proceed with AndroidSwipeLayout.
If you are using RecyclerView
and trying to initialize an SwipeItemRecyclerMangerImpl
object, you are doing it incorrectly. Instead of extending your CustomRecyclerView as:
public class CustomRecyclerViewAdapter extends RecyclerView.Adapter<CustomRecyclerViewAdapter.ViewHolder>
you should be extending as follow:
public class CustomRecyclerViewAdapter extends RecyclerSwipeAdapter<CustomRecyclerViewAdapter.ViewHolder>
By extending RecyclerSwipeAdapter
, SwipeItemRecyclerMangerImpl mItemManger
is already be declared in RecyclerSwipeAdapter
, and you will be able to use mItemManger
.
To achieve only one item swipe at a time you will then need to override the following method:
@Override
public int getSwipeLayoutResourceId(int position) {
// Return the SwipeLayout Id in your ViewHolder
return R.id.swipeLayout;
}
and add the below codes:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
...
...
mItemManger.bindView(holder.itemView, position);
holder.swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
@Override
public void onStartOpen(SwipeLayout layout) {
mItemManger.closeAllExcept(layout);
}
@Override
public void onOpen(SwipeLayout layout) {
}
@Override
public void onStartClose(SwipeLayout layout) {
}
@Override
public void onClose(SwipeLayout layout) {
}
@Override
public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
}
@Override
public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
}
});
}
You are all set!
Also if all you need is only one single item open at a time you can do everything what davischung said except that part `holder.swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() { @Override public void onStartOpen(SwipeLayout layout) { mItemManger.closeAllExcept(layout); }
@Override
public void onOpen(SwipeLayout layout) {
}
@Override
public void onStartClose(SwipeLayout layout) {
}
@Override
public void onClose(SwipeLayout layout) {
}
@Override
public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
}
@Override
public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
}
});`
instead just add mItemManger.setMode(Attributes.Mode.Single);
in your constructor
Hello,
I'm using RecyclerView in my project and I added this library to show some options for every item in my list when swiped.
What I want to achieve is the following thing: when I swipe one item, if another one is already swiped, the other one is closed automatically. So I don't want to have two items swiped at a time.
I tried to follow the instructions found in this issue but the information is incomplete (there is no ItemManger, no bindView function for it).
Can someone provide a final working solution for this?
Thank you in advance!