I have some RecyclerView item with invisible button and I would like to change all button visibility from Activity. Like this:
Please help me.
Why don't you create a method inside your RecyclerAdapter which will activate the button when a certain action happens in the Activity. Let's say an activity named activateButtons like this:
public void activateButtons(boolean activate) {
this.activate = activate;
notifyDataSetChanged(); //need to call it for the child views to be re-created with buttons.
}
Now, inside your onBindViewHolder, do something like this:
if (activate) {
buttons.setVisibility(View.VISIBLE);
} else {
buttons.setVisibility(View.INVISIBLE);
}
and now, the final step, call the activateButtons method from Activity on an action:
editButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
adapter.activateButtons(true);
}
});
Related
I have a RecyclerView and adapter. Now in that adapter, I'm inflating one row. In that row, there are one delete button and one progressbar. So what I'm doing is when user clicks on delete button, I make invisible that delete button, and make visible small progress bar in place of delete button from Adapter class. And also I'm sending position via listener to that attached activity, from that I'm calling AsyncTask.
Now the problem is:
When I got to know via AsyncTask that item is deleted, I again want to make visible delete button and to make invisible progressbar. But this time - from Activity (not from adapter), because I want to do something in activity when I get to know that item is deleted. So I can't implement AsyncTask in adapter.
code:
Adapter
delete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (listener != null) {
delete.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
listener.onClicked(getAdapterPosition(), eventList.get(getAdapterPosition()).getEventId());
}
}
});
Activity (in activity I want to visible/invisible adapter row button and p.bar:
#Override
public void onDeleteDataReceived(Boolean status, int position) {
stopShimmerLayout();
if (status) {
try {
eventsList.remove(position);
mAdapter.notifyItemRemoved(position);
showToast(context, "Deleted", Toast.LENGTH_SHORT);
} catch (Exception e) {
e.printStackTrace();
}
} else {
showToast(context, "Failed", Toast.LENGTH_SHORT);
}
}
See the video for better understanding: https://drive.google.com/open?id=13ZAtnyfGbi2X4JjUTmJsIDy-gt5y51Gr
To fix your problem you can take the below approach.
1) Inside your Eventpojo/model class, declare a boolean isSelectedwhich will be initially false. Now whenever user clicks the row, do `
delete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
eventList.get(position).isSelected=true;
delete.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
}
So by doing this, we are keeping in memory which object is selected and which is not, but once you recycle your views bindViewHolder will be invoked aagain and UI elements setter will be called again so put a check inside onBindViewHolder()
if(eventList.get(position).isSelected){
//show progress bar
}else{
// show delete icon
}
To remove the item, just do the following changes in your adapter-
public void removeItem(int position){
eventList.remove(position)
notifyItemRemoved(position)
}
I have recyclerview inside an activity. I have some View inside each item. Suppose a textview, I am implementing a click listener on that particular view.
However, there is a case where i have to call the clicklistener of a particular position of that textview.
Since there is no function to call the onclick where i can pass the position.
I thought holder.itemview.callonclick() would work. But it is not working.
is there any way to call the itemview's textview of a particular position of a recyclerview.
You can create custom click listener using interface like below.
public interface ClickInterface {
public void recyclerviewOnItemClick(int position);
}
make sure you implement this interface to class where you want your code to be executed and implement it's method.Then you can pass this listerer's refrence to adapter like this.
TestAdapter adapetr = new TestAdapter (this);
listview.setAdapter(adapter);
In adapter :
private ClickInterface clickInterface;
public TestAdapter (ClickInterface clickInterface) {
this.clickInterface = clickInterface;
}
viewHolder.txtview.setOnClickListener(v ->
clickInterface.recyclerviewOnItemClick(position));
-You will get implemented method call when textview is being clicked.
You can try like this in Holder class,
mTextView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (getAdapterPosition()== YOUR_POS)
{
code..
}
}
});
or in onBindViewHolder ,`
if(i==YOUR_POS){ holder.mTextView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
code..
}
});}
I am implementing an app that display list of data on a RecycleView. After swipe a recycleview item it display a specific LinearLayout view. In that view I have implemented an onClickListner. But it's not calling on click.
You must create an OnItemClickListener() interface.
Then, put this in your onBindViewHolder method:
holder.bind(items.get(position), listener);
Next time, put the bind method inside of your Adapter:
itemView.setOnClickListener(new View.OnClickListener() {
#Override public void onClick(View v) {
listener.onItemClick(item);
}
});
And finally, in your MainActivity inside of your adapter declaration open the listener like this:
recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
#Override public void onItemClick(ContentItem item) {
Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));
If you want to read more check out this documentation
Just wondering if what I'm trying to do is possible. So i have a custom adapter for a listview. It contains a textview and two buttons. I would like one of the listview buttons to remain hidden unless a specific button is pressed on the main activity.
So far I have the listview buttons performing their intended function but I have no idea how I would even begin to get what I'm wanting.
Sorry, for clarification, I have one button completely separate from the listview that is just always there. When I press this button I would like to toggle the visibility of a button that is on each listview item all together. The best example of this that I can think of is having a list of items and a button that can toggle off the 1. 2. 3. 4. that comes in front of each item.
Create a method in your adapter for knowing you have clicked the button from your main activity like this
public void buttonIsClicked(){ //in your adapter
buttonhide.setVisibility(visibility?View.VISIBLE:View.GONE);
}
And call this method from your activity on btnclick.
like
yourAdapter.buttonIsClicked();
and call this method for notifying the adapter about the change.
yourAdapter.notifyDatasetChanged().
or
You can use an interface for listening to the clicks in main activity and implement that listener in your adapter
Set visibility gone to the button you want to hide by calling code
buttonhide.setVisibilty(VIEW.GONE);
hide it in oncreate() of your activity and make it shown on the button click event by calling code buttonhide.setVisibilty(VIEW.VISIBLE);
Below is the code
btnView.setVisibility(View.GONE);
yes it is possible to do that.
First have a Model class to back the listview data and keep a flag in that model which indicates whether to show the button in that row's data model. On certain condition change that model's flag and call notifyDataSetChanged() on adapter.
Ex:
class Model{
String label;
boolean showBtn;
}
in adapter's getView()
Model model = list.get(position)
if(model.showBtn){
btn.setVisibility(View.VISIBLE);
}else{
btn.setVisibility(View.GONE);
}
in Activity
disableButton(){
modelList.get(0).setShowBtn(false);
adapter.notifyDataSetChanged();
}
This code will hide button in first row
Add a Boolean value in your dataset which represent the Visibility state of the button.
public class Dataset {
private boolean visible;
public boolean isVisible() {
return this.visible;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
//..more items
}
Then in your getView method of the Adapter check this Boolean value to show/hide the button.
boolean visibility = yourDataset.get(position).isVisible();
yourButton.setVisibility(visibility?View.VISIBLE:View.GONE);
And when the Button outside of your listview is clicked Update your dataset. And call yourAdapter.notifyDatasetChanged().
What you are attempting is: manipulating the visibility of the button declared in the Adapter from the containing activity. Simple, put a controlling variable in the activity and pass it a parameter to adapter.
Boolean mShowButton; //a controlling variable
void onCreate(Bundle savedInstanceState) {
...
mAdapter=new MyAdapter(...,mShowButton);
mButton.setOnClickListener(actionShow );
}
OnClickListener actionShow = new OnClickListener() {
#Override
public void onClick(View button) {
mShowButton=true;
mAdapter.notifyDataSetChanged();
mListView.invalidateViews();
}
};
And do this in your adapter,
Boolean showButton;
public MyAdapter(Context context, List<String> myList, Boolean showButton) {
...
this.showButton=showButton;
}
public View getView(int position, View rowView, ViewGroup parent) {
...
if(showButton){
mButtonTwo.setVisibility(View.GONE);
}else{
mButtonTwo.setVisibility(View.VISIBLE);
}
}
I have a custom TextView which is clickable. It defines its own onClick handler in order to change its appearance based on clicks. However if I then define a second onClick handler in my activity in order to do something based on the button being clicked, only one of the onClick functions is called. onClick is a void function - is there any way to say I didn't process this click, please pass it on to other onClick handlers?
To be more clear here is the code:
Inside MyCheckButton which extends TextView I have:
setOnClickListener( mClickListener );
private OnClickListener mClickListener = new OnClickListener() {
public void onClick(View v) {
toggle();
}
};
However I include MyCheckButton into my Activity, and of course I need to do something when its clicked so I attach another OnClickListener to it:
MyCheckButton button= (MyCheckButtonButton) findViewById(R.id.cb);
button.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View v) {
// do something in the app
}
});
By calling setOnClickListener twice it appears that I am replacing the original listener so toggle() which changes the appearance is never called. How can I do something in my activity when this button is clicked if it is already using the onClick handler to change its appearance? I thought I would simply see both OnClickListeners getting called.
This is a bit dirty, but the way I would do this if you need multiple listeners is to register one that knows about the other. The first one (the one that's actually registered) will then need to know when to delegate to the other listener based on the conditions of the event. Actually, in reality, there's no real need to have two OnClickListener classes. The second class can implement whatever interface you want. Additionally, there's no need to create a special interface for what you need.
public class MyClickListener implements OnClickListener{
private SomeCustomClass mSecondListener = new SomeCustomClass();
public void onClick(View v){
if (needToForward){
mSecondListener.handleClick(v);
}else{
//handle the click
}
}
}
Then, in your code for your activity, you would do this
MyClickListener lstn = new MyClickListener();
mCheckBox.setOnClickListener(lstn);
Is there a reason this wouldn't work for you?
Alternatively, if you wanted, the second class could also implement the OnClickListener interface.
Additionally, if you need true bubbling, you could define your own interface that supports adding multiple click listeners to an intermediate class that happens to implement the OnClickListener interface. From there, in that class's onClick() method, you would iterate through the registered listeners calling the appropriate method.
A cleaner approach would be to use the CompositeListener pattern.
Taken from:
how can I set up multiple listeners for one event?
You'd have to add this class in your project:
/**
* Aux class to collect multiple click listeners.
*/
class CompositeListener implements OnClickListener {
private List<OnClickListener> registeredListeners = new ArrayList<OnClickListener>();
public void registerListener (OnClickListener listener) {
registeredListeners.add(listener);
}
#Override
public void onClick(View v) {
for(OnClickListener listener:registeredListeners) {
listener.onClick(View v);
}
}
}
Then add this on your MyCheckButton
private CompositeListener clickListener = new CompositeListener();
public MyCheckButton()
{
super.setOnClickListener(clickListener); //multi event listener initialization
}
#Override
public void setOnClickListener(OnClickListener l) {
clickListener.registerListener(l);
}
Both your calls to setOnClickListener would go through this override, get added to the list and get called when the event is fired. Hope it helps.
Since it appears I can only have one onClickListener per View. What I think I have to do is define an interface:
public interface MyOnClickListener {
public void onMyClick(View v);
}
Implement it from my activity and override the onMyClick function to do whatever I want and in the MyCheckButton class I'll need to pass a MyOnClickListener in the constructor save it and call listener.onMyClick inside the onClick handler.
Let me know if theres a better way. I considered using the onTouch handler in either the activity or the MyCheckButton class, but later if I add onTouch or onClick to either one I will get a difficult to notice bug.
My idea doesn't work because I don't know how to get a reference to the activity from my constructor:
public class TVCheckButton extends TextView {
private MyOnClickListener mListener;
public TVCheckButton(Context context, AttributeSet attrs) {
super(context, attrs);
mListener = ???;
}
}
Since only one OnclickListener works on Android 2.1 [I don't know about later versions) make the view private and static and create a static function that can change it e.g.
public class ExampleActivity extends Activity{
private SomeOtherclass someOtherClass;
private static Button b_replay;
public void onCreate(Bundle savedInstanceState){
someOtherClass = new SomeOtherclass();
b_replay = (Button) findViewById(R.id.b_replay);
b_replay.setOnClickListener(someOtherClass);
}
public static void changeReplayText(String text){
b_replay.setText(text);
}
}
A nice generic approach is to use a list of listeners, such as ListenerList and WeakListenerList from the Beryl library.
For some reason I could not use the answers above so here is an alternative:
//I had all of this in one method where I had two buttons, and based on external factors one would be visible and other would not aka 'gone'. So, I had that checked out! Hope it helps someone!!
Button b = (Button) findViewById(R.id.b_reset);
Button breakk = (Button) findViewById(R.id.b_break);
if ((findViewById(R.id.b_reset)).getVisibility() == View.VISIBLE) {
b.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//some code and methods...
}
});
} else if ((findViewById(R.id.b_break)).getVisibility() == View.VISIBLE) {
breakk.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//some code and methods...
}
});
}
In the first class, define a virtual button:
private static Button myVirtualButton = new Button(context);
... and a public method to register it:
public static void registerMyVirtualButton(Button b) { myVirtualButton = b;}
In the OnClickListener do whatever action is desired, and in the end, softclick the virtual button:
if (myVirtualButton!=null) { myVirtualButton.callOnClick(); }
In the second class, define a button and its OnClickListener with whatever action is additionally desired.
Transmit the button to the first class via registerMyVirtualButton.
Upon clicking the object of the first class, both actions will be executed.
You can attach an OnClick listener to the button in the following way :
Button button= (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View v) {
// do something
}
});
Similarily, your TextView should have it's on OnClick listener.