Invoke ADF Table Selection Listener, Custom selection listener for af:table

Sharing is Caring

In this post, we’ll learn about ADF table selection listener. Sometimes we need to define our own selection listener for the table, or we have to perform some operation on row selection event in af:table.

We can do this by defining custom selection listener for the table in the Managed Bean.
In this tutorial I am showing a popup on table row selection, Here I am using Employees table of HR Schema

  • Prepare model and ViewController for Employees table and drag table in your page. Now select the table and go to property Inspector, you will see its default selection listener

 

Selection Listener of af:table
  • Now define your own (custom) selection listener for this table in your managed bean
ADF Table Selection Listener

 

  • Now write this code snippet on that custom selection listener, this code invokes its default listener and get the selected row. first, you have to invoke its default listener that is
#{bindings.Employees1.collectionModel.makeCurrent}

public void empTableSelectionListener(SelectionEvent selectionEvent) {
ADFUtil.invokeEL(“#{bindings.Employees1.collectionModel.makeCurrent}”, new Class[] {SelectionEvent.class},
new Object[] { selectionEvent });
// get the selected row , by this you can get any attribute of that row
Row selectedRow =
(Row)ADFUtil.evaluateEL(“#{bindings.Employees1Iterator.currentRow}”); // get the current selected row
//to show popup, you can write your logic here , what you wanna do
showPopup(empPopup, true);
}

 

  • You have to import these packages in order to invoke selection listener
import org.apache.myfaces.trinidad.event.SelectionEvent;
import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;
import org.apache.myfaces.trinidad.util.Service;

 

  • In above code snippet ADFUtil is an utility class that contains methods for invoking EL (Expression language), so you have to make a Java class named ADFUtil in same package as bean

import java.util.Map;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.el.ValueExpression;

import javax.faces.context.FacesContext;

import oracle.adf.model.BindingContext;
import oracle.adf.model.DataControlFrame;

/**
* Provides various utility methods that are handy to
* have around when working with ADF.
*/

public class ADFUtil {

/**
* When a bounded task flow manages a transaction (marked as requires-transaction,.
* requires-new-transaction, or requires-existing-transaction), then the
* task flow must issue any commits or rollbacks that are needed. This is
* essentially to keep the state of the transaction that the task flow understands
* in synch with the state of the transaction in the ADFbc layer.
*
* Use this method to issue a commit in the middle of a task flow while staying
* in the task flow.
*/

public static void saveAndContinue() {
Map sessionMap =
FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
BindingContext context =
(BindingContext)sessionMap.get(BindingContext.CONTEXT_ID);
String currentFrameName = context.getCurrentDataControlFrame();
DataControlFrame dcFrame =
context.findDataControlFrame(currentFrameName);

dcFrame.commit();
dcFrame.beginTransaction(null);
}

/**
* Programmatic evaluation of EL.
*
* @param el EL to evaluate
* @return Result of the evaluation
*/

public static Object evaluateEL(String el) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory =
facesContext.getApplication().getExpressionFactory();
ValueExpression exp =
expressionFactory.createValueExpression(elContext, el,
Object.class);

return exp.getValue(elContext);
}

/**
* Programmatic invocation of a method that an EL evaluates to.
* The method must not take any parameters.
*
* @param el EL of the method to invoke
* @return Object that the method returns
*/

public static Object invokeEL(String el) {
return invokeEL(el, new Class[0], new Object[0]);
}

/**
* Programmatic invocation of a method that an EL evaluates to.
*
* @param el EL of the method to invoke
* @param paramTypes Array of Class defining the types of the parameters
* @param params Array of Object defining the values of the parametrs
* @return Object that the method returns
*/

public static Object invokeEL(String el, Class[] paramTypes,
Object[] params) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory =
facesContext.getApplication().getExpressionFactory();
MethodExpression exp =
expressionFactory.createMethodExpression(elContext, el,
Object.class, paramTypes);

return exp.invoke(elContext, params);
}

/**
* Sets a value into an EL object. Provides similar functionality to
* the <af:setActionListener> tag, except the from is
* not an EL. You can get similar behavior by using the following…

* setEL(to, evaluateEL(from))
*
* @param el EL object to assign a value
* @param val Value to assign
*/
public static void setEL(String el, Object val) {
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory =
facesContext.getApplication().getExpressionFactory();
ValueExpression exp =
expressionFactory.createValueExpression(elContext, el,
Object.class);

exp.setValue(elContext, val);
}
}

Cheers 🙂 Happy Learning

Related Posts

An Oracle ACE, Blogger, Reviewer, Technical Lead working on Oracle ADF

0 thoughts on “Invoke ADF Table Selection Listener, Custom selection listener for af:table”

  1. im not agree with this

    you have to import these packages in order to invoke selection listener

    import org.apache.myfaces.trinidad.event.SelectionEvent;
    import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;
    import org.apache.myfaces.trinidad.util.Service;

  2. Hi, In ADF Table, when a user selects a row, how can i get hold of that particular Column of the selected Row.

Leave a Reply

Your email address will not be published. Required fields are marked *