RecyclerView with JSON, setOnClickListener with id and create new GET request with that id

54 Views Asked by At

I get a request for all orders, I have to take the id from there and put it on the request that shows the details of the order "?project_id= + id"`

my fragment, the place where i display the list of orders

package com.example.myapplication.freelancer.bottom_Menu.search_worker;

public class SearchWorker_ extends Fragment {

    List<OrdersModelClass> orderList;
    RecyclerView recyclerView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_search_worker_, container, false);

        orderList = new ArrayList<>();
        recyclerView = view.findViewById(R.id.recycler_View);

        GetData getData = new GetData();
        getData.execute();

        return view;
    }

    public class GetData extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String strings) {
            String current = "";

            try {
                URL url;
                HttpURLConnection urlConnection = null;

                try {
                    String get_order = "https://tjfl.blinmen.ru/wp-json/tjfl/v1/projects/";
                    url = new URL(get_order);
                    urlConnection = (HttpURLConnection) url.openConnection();

                    InputStream is = urlConnection.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);

                    int data = isr.read();
                    while (data != -1){
                        current += (char) data;
                        data = isr.read();
                    }
                    return current;
                }catch (IOException e){
                    e.printStackTrace();
                } finally {
                    if (urlConnection != null){
                        urlConnection.disconnect();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return current;
        }

        @Override
        protected void onPostExecute(String s) {

            try {

                JSONArray jsonArray = new JSONArray(s);

                for (int i = 0; i < jsonArray.length(); i++){

                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    OrdersModelClass model = new OrdersModelClass();
                    model.setTitle_order_adapter(jsonObject.getString("title"));
                    model.setBudget_order_adapter(jsonObject.getString("budget"));
                    model.setDeadline_order_adapter(jsonObject.getString("deadline"));

                    orderList.add(model);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            PutDataIntoRecyclerView(orderList);
        }
    }

    private void PutDataIntoRecyclerView(List<OrdersModelClass> orderList){
        AdapterJSON orderAdapter = new AdapterJSON(getContext(), orderList);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(orderAdapter);
    }
}

My adapter, I need to know how to write code on click, here

package com.example.myapplication.adapters;

public class AdapterJSON extends RecyclerView.Adapter<AdapterJSON.MyViewHolder> {

    private RecyclerView recyclerViewItemClickListener;
    private final Context mContext;
    private final List<OrdersModelClass> mData;


    public AdapterJSON(Context mContext, List<OrdersModelClass> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.my_row_orders_, parent, false);
        return new MyViewHolder(view);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        final OrdersModelClass orderModel = mData.get(position);

        holder.title.setText(orderModel.getTitle_order_adapter());
        holder.budget.setText(orderModel.getBudget_order_adapter());
        holder.deadline.setText(orderModel.getDeadline_order_adapter());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = String.valueOf(orderModel.getId());
                

            }
        });
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView title, budget, deadline;
        ConstraintLayout mainLayout;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.title_order);
            budget = itemView.findViewById(R.id.budget_order);
            deadline = itemView.findViewById(R.id.deadline_order);
            mainLayout = itemView.findViewById(R.id.mainLayout_order);
        }
    }
}

GET request which i get

[
    {
        "id": 151,
        "status": "close",
        "title": "New test project",
        "deadline": "31/05/2022",
        "budget": "1000"
    }
]

GET request which I should take by id

{
  "id": 151,
  "title": "New test project",
  "status": "closed",
  "deadline": "31/05/2022",
  "budget": "1000",
  "reserved_budget": "100",
  "customer": "Tajsoft",
  "description": "123456789012345678901234567890",
  "tags": [
    "Full stack",
    "Web"
  ]
}

Ultimately, I need a code that will take the id of the order and, for this id, make a GET request to get the details of the order, please help me how to take the id into a variable

1

There are 1 best solutions below

1
TylerQITX On

Set a listener for in your adapter:

private Listener listener;
public void setListener(Listener listener) {
    this.listener = listener
}

public interface Listener {
    void onGetProjectDetails(String id)
}

In onClick:

@Override
public void onClick(View view) {
    String id = String.valueOf(orderModel.getId());
    if (listener != null) {
        listener.onGetProjectDetails(id);
    }
}

In your fragment:

...
AdapterJSON orderAdapter = new AdapterJSON(getContext(), orderList);
orderAdapter.setListener(id -> {
    // Get request using this id in fragment
});
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(orderAdapter);