有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在对arraylist执行某些操作后更新它而不重新启动活动

我有一个适配器。将arraylist附加到RecyclerView的java类

但问题是我想更新列表,而不想再次启动活动

我怎样才能做到这一点

这是我的代码,在接受操作之后,列表中的项目也应该更新

import 安卓.content.Context;
import 安卓.util.Log;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.Button;
import 安卓.widget.ImageView;
import 安卓.widget.TextView;
import 安卓.widget.Toast;

import 安卓x.annotation.NonNull;
import 安卓x.recyclerview.widget.RecyclerView;

import com.安卓.volley.AuthFailureError;
import com.安卓.volley.Request;
import com.安卓.volley.RequestQueue;
import com.安卓.volley.Response;
import com.安卓.volley.VolleyError;
import com.安卓.volley.toolbox.StringRequest;
import com.安卓.volley.toolbox.Volley;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RequestAdapter extends RecyclerView.Adapter<RequestAdapter.ViewHolder> {
    LayoutInflater inflater;
    List<UserRequests> userRequest;
    Context ctx;

    public RequestAdapter(Context ctx, List<UserRequests> userRequest) {
        this.ctx=ctx;
        this.inflater = LayoutInflater.from(ctx);
        this.userRequest = userRequest;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.request_list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final UserRequests ureq=userRequest.get(position);
            holder.usrname.setText(userRequest.get(position).getUsername());
            holder.pickup.setText(userRequest.get(position).getPickupaddress());
            holder.drop.setText(userRequest.get(position).getDropaddress());
        Picasso.get().load(userRequest.get(position).getImage()).into(holder.usrpic);//next here
        holder.accept.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //Toast.makeText(ctx,"This is accept button"+String.valueOf(ureq.getId()),Toast.LENGTH_SHORT).show();
                Log.d("id of transaction", String.valueOf(ureq.getId()));

                accept(ureq.getId());

// I want to add something here which will update the list


            }
        });


    }

    private void accept(int id) {
        RequestQueue queue= Volley.newRequestQueue(ctx);
        StringRequest stringRequest=new StringRequest(Request.Method.POST, "xxxxxx", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if(response.equals("accepted")){
                    Log.d("accepted","1 true");
                    Toast.makeText(ctx,"Accepted",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(ctx,response,Toast.LENGTH_SHORT).show();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(ctx,error.getMessage(),Toast.LENGTH_SHORT).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params=new HashMap<String, String>();
                params.put("rid", String.valueOf(id));

                return params;
            }
        };   RequestQueue requestQueue= Volley.newRequestQueue(ctx);
        requestQueue.add(stringRequest);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
TextView usrname,pickup,drop;
ImageView usrpic;
        Button accept,reject;


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

            usrname=itemView.findViewById(R.id.R_L_tvusername);
            pickup=itemView.findViewById(R.id.R_L_tvpckpadd);
            drop=itemView.findViewById(R.id.R_L_tvdropadd);
            usrpic=itemView.findViewById(R.id.R_L_iv_display_image);
            accept=itemView.findViewById(R.id.imageView4);
            reject=itemView.findViewById(R.id.imageView5);
        }
    }
}

主活动代码如下所示

import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.recyclerview.widget.LinearLayoutManager;
import 安卓x.recyclerview.widget.RecyclerView;

import 安卓.os.Bundle;
import 安卓.util.Log;
import 安卓.widget.Toast;

import com.安卓.volley.AuthFailureError;
import com.安卓.volley.Request;
import com.安卓.volley.RequestQueue;
import com.安卓.volley.Response;
import com.安卓.volley.VolleyError;
import com.安卓.volley.toolbox.JsonArrayRequest;
import com.安卓.volley.toolbox.StringRequest;
import com.安卓.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ViewRequests extends AppCompatActivity {
    RecyclerView recyclerView;
    List<UserRequests> Requests;
    RequestAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_requests);
        recyclerView = findViewById(R.id.requestlist);
        Requests = new ArrayList<>();
        extractRequest();
    }

    private void extractRequest() {
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest jsonArrayRequest = new StringRequest(Request.Method.POST, "xxxxxx", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject requestobject = new JSONObject(response);
                    String success = requestobject.getString("success");
                    Log.d("Json success", success.toString());
                    JSONArray jsonArray = requestobject.getJSONArray("data");
                    Log.d("Json data", jsonArray.toString());
                    if (success.equals("1")) {
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject object = jsonArray.getJSONObject(i);
                            Log.d("Json data" + i + ": ", jsonArray.getJSONObject(i).toString());
                            UserRequests userRequests = new UserRequests();
                            userRequests.setUsername(object.getString("username").toString());
                            userRequests.setPickupaddress("Pickup address:" + object.getString("pickupaddress").toString());
                            userRequests.setDropaddress("Drop address:" + object.getString("dropaddress").toString());
                            userRequests.setImage(object.getString("photo").toString());
                            userRequests.setId(Integer.parseInt(object.getString("r_id").toString()));
                            Requests.add(userRequests);
                        }
                        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                        adapter = new RequestAdapter(getApplicationContext(), Requests);
                        recyclerView.setAdapter(adapter);
                    }

//                        Requests.add(userRequests);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("Volley Error:", error.getMessage());
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("user_id", "1");
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(ViewRequests.this);
        requestQueue.add(jsonArrayRequest);
    }
}

用户请求。爪哇

public class UserRequests {

    private String username;
    private String pickupaddress;
    private String dropaddress;
    private String image;
    private int id;

    public UserRequests() {
    }

    public UserRequests(String username, String pickupaddress, String dropaddress, String image, int id) {
        this.username = username;
        this.pickupaddress = pickupaddress;
        this.dropaddress = dropaddress;
        this.image = image;
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPickupaddress() {
        return pickupaddress;
    }

    public void setPickupaddress(String pickupaddress) {
        this.pickupaddress = pickupaddress;
    }

    public String getDropaddress() {
        return dropaddress;
    }

    public void setDropaddress(String dropaddress) {
        this.dropaddress = dropaddress;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

共 (3) 个答案

  1. # 1 楼答案

    加上 适配器。notifyDataSetChanged()

  2. # 2 楼答案

    当服务器成功响应时,您必须在本地更新/维护

    只需在UserRequests中创建一个变量,并在成功响应来自API且在UI中设置时更新该变量

    示例代码:

    用户请求

    public class UserRequests {
    
        private String username;
        private String pickupaddress;
        private String dropaddress;
        private String image;
        private int id;
        private boolean accepted; //new addded for store status.
    
        public UserRequests() {
        }
    
        public UserRequests(String username, String pickupaddress, String dropaddress, String image, int id) {
            this.username = username;
            this.pickupaddress = pickupaddress;
            this.dropaddress = dropaddress;
            this.image = image;
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPickupaddress() {
            return pickupaddress;
        }
    
        public void setPickupaddress(String pickupaddress) {
            this.pickupaddress = pickupaddress;
        }
    
        public String getDropaddress() {
            return dropaddress;
        }
    
        public void setDropaddress(String dropaddress) {
            this.dropaddress = dropaddress;
        }
    
        public String getImage() {
            return image;
        }
    
        public void setImage(String image) {
            this.image = image;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public boolean isAccepted() {
            return accepted;
        }
    
        public void setAccepted(boolean accepted) {
            this.accepted = accepted;
        }
    }
    

    请求适配器:

    @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            final UserRequests ureq=userRequest.get(position);
                holder.usrname.setText(userRequest.get(position).getUsername());
                holder.pickup.setText(userRequest.get(position).getPickupaddress());
                holder.drop.setText(userRequest.get(position).getDropaddress());
            Picasso.get().load(userRequest.get(position).getImage()).into(holder.usrpic);//next here
            holder.accept.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   //Toast.makeText(ctx,"This is accept button"+String.valueOf(ureq.getId()),Toast.LENGTH_SHORT).show();
                    Log.d("id of transaction", String.valueOf(ureq.getId()));
    
                    accept(ureq.getId(),position,holder.accept);
    
    // I want to add something here which will update the list
    
                 //check here if accepted set view to accepted
                  if(userRequest.get(position).getAccepted())
                     holder.accpeted.setText("Accepted");
                  else
                     holder.accpeted.setText("Accept");
    
    
                }
            });
    
    
        }
    
        private void accept(int id,int position, View view) {
            RequestQueue queue= Volley.newRequestQueue(ctx);
            StringRequest stringRequest=new StringRequest(Request.Method.POST, "xxxxxx", new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if(response.equals("accepted")){
                        Log.d("accepted","1 true");
                        Toast.makeText(ctx,"Accepted",Toast.LENGTH_SHORT).show();
                        //update here
                         userRequest.get(position).setAccepted(true);
                         view.setText("Accepted");
    
    
                    }else{
                        Toast.makeText(ctx,response,Toast.LENGTH_SHORT).show();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(ctx,error.getMessage(),Toast.LENGTH_SHORT).show();
                }
            }){
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String,String> params=new HashMap<String, String>();
                    params.put("rid", String.valueOf(id));
    
                    return params;
                }
            };   RequestQueue requestQueue= Volley.newRequestQueue(ctx);
            requestQueue.add(stringRequest);
        }
    
        @Override
        public int getItemCount() {
            return userRequest.size();
        }
    

    注意:可能有一些语法错误,请更正

  3. # 3 楼答案

    更改arraylist后。告诉适配器数据已更改

    adapter.notifyDataSetChanged();
    

    要从活动中访问列表,请在请求适配器中使其公开

    public List<UserRequests> userRequest;
    

    然后,在“活动”中,访问您的列表。和对其进行一些更改通知适配器

    adapter.userRequest.add() // add remove or access any index and change
    

    或者如果要从适配器类调用提取数据方法

    在请求适配器中声明活动变量

    public ViewRequests activity;
    

    在活动中。分配

    adapter.activity = ViewRequests.this
    

    将extractRequest()公开

    public void extractRequest()
    

    输入适配器

     activity.extractRequest();