Shayea
Shayea

Reputation: 51

How to return data from adapter to activity

I have an activity that contains a RecyclerView and I show some data that comes from server to it. The problem is that I I have set the onCLick of RecyclerView in MYAdapter class but now I need to handle the OnClick of RecyclerView in based on some data which is my Activity which contains RecyclerView.

public class ActivityAllUsers extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<ListItem> listitems;

private static final String URL_DATA = "http://shayea.tk/sof/get_allusers.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    int id = getIntent().getIntExtra("IDUSERTYPE", 0);// -1 is default value

    recyclerView = (RecyclerView) findViewById(R.id.recyvlerview);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    listitems = new ArrayList<>();

    loadRecyclerviewData();
}

private void loadRecyclerviewData()
{
    final ProgressDialog dialog = new ProgressDialog(this);
    dialog.setMessage("Loading...");
    dialog.show();

    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_DATA, new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
                dialog.dismiss();
            try {
                JSONObject jsonObject = new JSONObject(s);
                JSONArray array = jsonObject.getJSONArray("result");

                for (int i =0;i<array.length();i++)
                {
                    JSONObject o = array.getJSONObject(i);
                    ListItem item = new ListItem(
                            o.getString("usr_id"),
                            o.getString("usr_name"),
                            o.getString("usr_phone"),
                            o.getString("usr_email"),
                            o.getString("usr_status"),
                            o.getString("prv_name"),
                            o.getString("org_name")
                    );

                    listitems.add(item);
                }

                adapter = new MyAdapter(listitems , getApplicationContext());
                recyclerView.setAdapter(adapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            dialog.dismiss();
            Toast.makeText(getApplicationContext(),error.getMessage(), Toast.LENGTH_LONG).show();
        }
    });

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
}

I want to the OnClick of RecyclerView to be available when ever this int id = getIntent().getIntExtra("IDUSERTYPE", 0); id contains 1 and if id contains anything else the OnClick shouldn't be active. Here is MyAdapter class which contains the OnClick of RecyclerView :

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<ListItem> listItems;
private Context context;

public MyAdapter(List<ListItem> listItems, Context context) {
    this.listItems = listItems;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
    return new ViewHolder(view);
}

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

    final ListItem listItem = listItems.get(position);

    holder.txtusername.setText(listItem.getusername());
    holder.txtuseremail.setText(listItem.getEmail());

    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(context, UserInformation.class);
            intent.putExtra("Details", (Serializable) listItem);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);

        }
    });
}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    public TextView txtusername;
    public TextView txtuseremail;
    public LinearLayout linearLayout;
    public ViewHolder(View itemView) {
        super(itemView);

        txtusername = (TextView) itemView.findViewById(R.id.textviewusername);
        txtuseremail = (TextView) itemView.findViewById(R.id.textviewuseremail);
        linearLayout = (LinearLayout) itemView.findViewById(R.id.linearlayout);
    }
}
}

I need the id which is in ActivityAllUsers ih here :

 holder.linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(context, UserInformation.class);
            intent.putExtra("Details", (Serializable) listItem);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);

        }
    });

Upvotes: 2

Views: 10087

Answers (4)

Komal12
Komal12

Reputation: 3348

Try this,

        int id = getIntent().getIntExtra("IDUSERTYPE", 0);
        adapter = new MyAdapter(listitems , getApplicationContext(),id);
        recyclerView.setAdapter(adapter);


        public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

            private List<ListItem> listItems;
            private Context context;
            private int id;
            public MyAdapter(List<ListItem> listItems, Context context,int id) {
                this.listItems = listItems;
                this.context = context;
                this.id=id;
            }
            .
            .
            .

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

            final ListItem listItem = listItems.get(position);

            holder.txtusername.setText(listItem.getusername());
            holder.txtuseremail.setText(listItem.getEmail());

            holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(context, UserInformation.class);
                intent.putExtra("Details", (Serializable) listItem);
                intent.putExtra("ID", id);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);

            }
        });

        }
});
        }

Upvotes: 0

RoShan Shan
RoShan Shan

Reputation: 2954

The problem is that I I have set the onCLick of RecyclerView in MYAdapter class but now I need to handle the OnClick of RecyclerView in based on some data which is my Activity which contains RecyclerView.

I think with your requirement, you need to change title: How to return data from adapter to activity

In your adapter, you create callback like this

public interface AdapterCallback{
   void onItemClicked(int position);
}
AdapterCallback callback;
public MyAdapter(List<ListItem> listItems, Context context, AdapterCallback callback) {
    this.listItems = listItems;
    this.context = context;
    this.callback = callback;
}

...
holder.linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // You can move this block codes to Activity
            Intent intent = new Intent(context, UserInformation.class);
            intent.putExtra("Details", (Serializable) listItem);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
            //
            // callback here
            if(callback != null) {
              callback.onItemClicked(position)
            }

        }
    });

And in ActivityAllUsers

    public class ActivityAllUsers extends AppCompatActivity implements AdapterCallback {

   ...
   adapter = new MyAdapter(listitems , getApplicationContext(), ActivityAllUsers.this);

    ...

    @Override
    public void onItemClicked(int position){
        // call back here
    }

    }

Upvotes: 11

Karun Shrestha
Karun Shrestha

Reputation: 733

You can pass the data to the adapter when defining the adapter. Here is an example:

adapter = new MyAdapter(listitems , getApplicationContext(), data you want to send);

To receive, you have to edit the constructor and make it like this:

public MyAdapter(List<ListItem> listItems, Context context, String DataYou WantToReceive) 
{
    this.listItems = listItems;
    this.context = context;

this.data = DataYouWantToReceive }

Upvotes: 0

Junaid Hafeez
Junaid Hafeez

Reputation: 1616

you may pass the value through adapter constructor something like this

adapter = new MyAdapter(listitems , getApplicationContext(), value);

and in your adapter class

int value = -1; //global variable with default value
public MyAdapter(List<ListItem> listItems, Context context, int value) {
    this.listItems = listItems;
    this.context = context;
    this.value = value;
}

and later in onBindViewHolder

if(value == 1) {
holder.linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(context, UserInformation.class);
            intent.putExtra("Details", (Serializable) listItem);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);

        }
    });
}

Upvotes: 1

Related Questions