7

I have created a Recyclerview, with itemobjects, Adapter, viewholder and activity.

The Recyclerview works fine.

My problem is when an item is clicked from Recyclerview, I want to direct the user to TicketDetails activity.

I have the code to get the clicked item and its position in the view holder, but when I try to create a new intent to new activity like this inside view holder

startActivity(new Intent(getActivity(), TicketDetails.class));

I am unable to resolve getActivity()

ViewHolder

public class TicketsRecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

    public ImageView priority;
    public TextView sts_open;
    public TextView sts_overdue;
    public TextView tkt_from;
    public TextView tkt_subject;
    public TextView tkt_assignedto;
    public TextView tkt_created_date;
    public TextView txt_ticket_id;

    private SparseBooleanArray selectedItems = new SparseBooleanArray();

    public TicketsRecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        priority = (ImageView) itemView.findViewById(R.id.priority_status_icon);
        sts_open= (TextView) itemView.findViewById(R.id.tv_Tk_opn_status);
        sts_overdue = (TextView) itemView.findViewById(R.id.tv_Tk_overdue);
        tkt_from = (TextView) itemView.findViewById(R.id.tv_Tk_from);
        tkt_subject = (TextView) itemView.findViewById(R.id.tv_Tk_subject);
        tkt_assignedto = (TextView) itemView.findViewById(R.id.tv_Tk_Assignedto);
        tkt_created_date = (TextView) itemView.findViewById(R.id.tv_Tk_Created_date);
        txt_ticket_id = (TextView) itemView.findViewById(R.id.tv_Tk_TicketID);

    }

    @Override
    public void onClick(View view) {
        int position = getAdapterPosition();
        String ticket_id = txt_ticket_id.getText().toString();
        Log.d("ZD-clicked : ", "Position => "+String.valueOf(position)+", Ticket Id => "+ticket_id);

        startActivity(new Intent(getActivity(), TicketDetails.class));

//        if (selectedItems.get(getAdapterPosition(), false)) {
//            selectedItems.delete(getAdapterPosition());
//            view.setSelected(false);
//        }
//        else {
//            selectedItems.put(getAdapterPosition(), true);
//            view.setSelected(true);
//        }
    }
}

Adapter

public class TicketsRecyclerViewAdapter extends RecyclerView.Adapter<TicketsRecyclerViewHolders>{

    public List<TicketsItemObject> TicketsItemList;
    private Context context;


    public TicketsRecyclerViewAdapter(Context context, List<TicketsItemObject> itemList) {
        this.TicketsItemList = itemList;
        this.context = context;
    }

    @Override
    public TicketsRecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_tickets_row, null);
        TicketsRecyclerViewHolders rcv = new TicketsRecyclerViewHolders(layoutView);
        return rcv;
    }

    @Override
    public void onBindViewHolder(TicketsRecyclerViewHolders holder, int position) {

            holder.priority.setImageResource(TicketsItemList.get(position).getStatus_priority());
            holder.sts_open.setText(TicketsItemList.get(position).getStatus_open());
            holder.sts_overdue.setText(TicketsItemList.get(position).getStatus_overdue());
            holder.tkt_from.setText(TicketsItemList.get(position).getTicket_from());
            holder.tkt_subject.setText(TicketsItemList.get(position).getTicket_subject());
            holder.tkt_assignedto.setText(TicketsItemList.get(position).getTicket_assignedto());
            holder.tkt_created_date.setText(TicketsItemList.get(position).getTicket_created_date());
            holder.txt_ticket_id.setText(TicketsItemList.get(position).getTicket_id());
    }

    @Override
    public int getItemCount() {
        return this.TicketsItemList.size();
    }
}

Item Object

public class TicketsItemObject {
    private int status_priority;
    private String status_open;
    private String status_overdue;
    private String ticket_from;
    private String ticket_subject;
    private String ticket_assignedto;
    private String ticket_created_date;
    private String ticket_id;

    public TicketsItemObject(int status_priority, String status_open, String status_overdue, String ticket_from, String ticket_subject, String ticket_assignedto, String ticket_created_date, String ticket_id) {
        this.status_priority = status_priority;
        this.status_open = status_open;
        this.status_overdue = status_overdue;
        this.ticket_from = ticket_from;
        this.ticket_subject = ticket_subject;
        this.ticket_assignedto = ticket_assignedto;
        this.ticket_created_date = ticket_created_date;
        this.ticket_id =ticket_id;
    }

    public int getStatus_priority() {
        return status_priority;
    }

    public String getStatus_open() {
        return status_open;
    }

    public String getStatus_overdue() {
        return status_overdue;
    }

    public String getTicket_from() {
        return ticket_from;
    }

    public String getTicket_subject() {
        return ticket_subject;
    }

    public String getTicket_assignedto() {
        return ticket_assignedto;
    }

    public String getTicket_created_date(){return ticket_created_date;}

    public String getTicket_id(){return ticket_id;}

}

Activity

public class Dashboard extends AppCompatActivity {

    private Toolbar toolbar;
    public DrawerLayout drawerLayout;
    public ListView drawerList;
    private navigationDrawerFragment drawerFragment;

    private CompanyProfileAdapter mAdapter;
    ApplicationEnvironmentURL applicationEnvironment;
    ProgressDialog pDialog;
    Context context;
    String BASEURL;
    String FilteredData;
    String allAgents;
    List<TicketsItemObject> items = new ArrayList<TicketsItemObject>();

    private RecyclerView recyclerView;
    private LinearLayoutManager layoutManager;
    private TicketsRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("Dashboard");
        setContentView(R.layout.activity_dashboard);

        applicationEnvironment = new ApplicationEnvironmentURL(this.context);
        context = this.getApplicationContext();

        toolbar = (Toolbar) findViewById(R.id.app_bar_dashboard);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        drawerFragment = (navigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setup(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);



        SharedPreferences prefs = getSharedPreferences("zupportdesk", MODE_PRIVATE);
        String islogged = prefs.getString("islogged", "Not defined");
        String userid = prefs.getString("userid", "Not defined");
        String profileToken = prefs.getString("profileToken", "Not defined");
        String companyId = prefs.getString("companyId", "Not defined");
        String companyName = prefs.getString("companyName", "Not defined");
        String ProfileId = prefs.getString("ProfileId", "Not defined");

        Log.d("islogged     : ", islogged);
        Log.d("userid       : ", userid);
        Log.d("profileToken : ", profileToken);
        Log.d("companyId    : ", companyId);
        Log.d("companyName  : ", companyName);
        Log.d("ProfileId    : ", ProfileId);

        recyclerView = (RecyclerView)findViewById(R.id.recycler_view_tickets);
        recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
        layoutManager = new LinearLayoutManager(Dashboard.this);
        recyclerView.setLayoutManager(layoutManager);

        getTickets(ProfileId, companyId, profileToken);

        View newTicket = findViewById(R.id.newtic);
        newTicket.setOnClickListener(onClickListener);




    }

    /* Multiple Button on click event handle */
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            switch(v.getId()){
                case R.id.newtic:
                    // Create a login URl, before starting anything

                    if(isNetworkAvailable()){
                        Intent intentTicket = new Intent(Dashboard.this, NewTicket.class);
                        startActivity(intentTicket);
                    } else {showErrorMessage("Please check your internet connection.", "No Connectivity!"); }
                    break;
            }
        }
    };


    private void getTickets(String profileId, String companyId, String profileToken){
        if(isNetworkAvailable()) {
            try {
                setFilteredDataURL(companyId);
                FilteredData = new getFilteredData().execute(profileToken).get();


                Log.d("Full Filtered Data", FilteredData);
                setTicketsURL(profileId, companyId);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            new getNewTickets().execute(profileToken);
        }else{ showErrorMessage("Please check your internet connection.", "No Connectivity!"); }
    }
................
.............
..More...........
Rohit Singh
  • 11,804
  • 4
  • 65
  • 66
Sathya Baman
  • 2,867
  • 7
  • 35
  • 70

6 Answers6

11

getActivity() only works in fragments. A view will have activity Context. So get Context from the view.

Change

startActivity(new Intent(getActivity(), TicketDetails.class));

to

Context context = view.getContext();
context.startActivity(new Intent(context, TicketDetails.class));
Akshay Bhat 'AB'
  • 2,567
  • 3
  • 16
  • 29
3

You can try

holder.itemView.context as Activity
Wind Cloud
  • 49
  • 3
  • Inside `onBindViewHolder` – Wind Cloud Nov 06 '20 at 02:28
  • You have to clearly mention those information in the answer. Otherwise answer is not a complete one – janith1024 Nov 06 '20 at 05:22
  • Inside `override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)` of Adapter you can get activity by `holder.itemView.context as Activity`. You can turn on dialog or anything need activity inside a holder. – Wind Cloud Nov 06 '20 at 06:52
1

Interface approach

You can also solve this problem using interface

1) Create an interface

public interface ItemclickListerner{

   public void startActivity(int index);

}

2) Implement the interface in the Activity

public class YourActivity extends AppcompatActivity implements ItemclickListerner{

    protected void onCreate(Bundle bundle)
 
    .......

    @override
    public void startActivity(int index)
    {
       Intent i = new Intent(YourActivity.this, SecondActivity.class)
       startActivity(i);
    }
 
}

3) Use the ItemclickListerner in the holder

public class TicketsRecyclerViewHolders extends ....  {

   private ItemclickListerner listener;

   // Typecast the listener 
   public TicketsRecyclerViewHolders(Context context)
   {
      listener = (ItemclickListerner)context;
   }

   // Call the listener method

   @Override
   public void onBindViewHolder(TicketsRecyclerViewHolders holder, int position{
       listener.startActivity(position)
   }


}
Community
  • 1
  • 1
Rohit Singh
  • 11,804
  • 4
  • 65
  • 66
0

You can use an interface to pass the itemclick from Adapter to your activity or fragment. Inside the callback you can call the Intent.

See this thread for more info. See @Jacob Tabaks answer.

EDIT:

See @AkshayBhat's answer for an alternative method.

Community
  • 1
  • 1
K Neeraj Lal
  • 6,560
  • 3
  • 21
  • 32
0

You have context in your constructor.So you can use context to go to an Activity from adapter.

Intent goTicket = new Intent(context, MyDetailActivity.class);
 goTicket.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Htoo Aung Hlaing
  • 1,640
  • 13
  • 25
0
  1. Pass fragment to the Adaptar constructor.
  2. Check if fragment is currently added to its activity and then launch particular activity:

    if (fragment.isAdded())

     fragment.startActivity(intent)
    
Gulzar Bhat
  • 791
  • 7
  • 11