【问题标题】:How to make POST request in recycler view adapter如何在回收器视图适配器中发出 POST 请求
【发布时间】:2019-05-15 21:03:38
【问题描述】:

我想在用户单击回收站视图项中的按钮时发送 POST 请求。当用户单击按钮时,我正在使用 OkHttp3 发出网络请求我正在向节点服务器发送 POST 请求。 我的问题是在 OkHttp3 的 OnResponse 调用中我无法定义 runOnUiThread() 方法。

这是我到目前为止所做的:

MyPostedBookAdapter.java

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

List<PostedModel> listItem;
Context context;
String id;
private static final String URI = "https:bookbudiapp.herokuapp.com/deleteRow";

public MyPostedBookAdapter(List<PostedModel> listItem, Context context){

    this.listItem = listItem;
    this.context = context;
}

@NonNull
@Override
public MyPostedBookAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.posted_book,viewGroup,false);


    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull final MyPostedBookAdapter.ViewHolder viewHolder, final int i) {

    final PostedModel model =  listItem.get(i);

    id = model.getPostId();

    viewHolder.userBookName.setText(model.getPurchaseBookName());

    RequestOptions requestOptions = new RequestOptions();
    requestOptions.placeholder(R.drawable.openbook);

    Glide.with(context).load(model.getPurchaseImage()).apply(requestOptions).into(viewHolder.userPostBook);

    viewHolder.delete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(context,id,Toast.LENGTH_SHORT).show();

            deleteRow();

        }
    });
}

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

public class ViewHolder extends RecyclerView.ViewHolder {

    ImageView userPostBook;
    TextView userBookName;
    Button delete;

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

        userPostBook = (itemView).findViewById(R.id.userPostBook);
        userBookName = (itemView).findViewById(R.id.userBookName);
        delete = (itemView).findViewById(R.id.delete);
    }
}

private void deleteRow(){

    OkHttpClient client = new OkHttpClient.Builder()
                              .connectTimeout(20, TimeUnit.SECONDS)
                              .readTimeout(20,TimeUnit.SECONDS)
                              .writeTimeout(20, TimeUnit.SECONDS)
                              .build();

    RequestBody formBody = new FormBody.Builder().add("postId",id).build();

    Request request = new Request.Builder().url(URI).post(formBody).build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onResponse(Call call, Response response) throws IOException {


        }

        @Override
        public void onFailure(Call call, IOException e) {

        }

    });

  }
}

让我知道如何在响应调用中定义 runOnUiThread() 方法。 任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 可以通过接口调用父activity/Fragment中的deleteRow方法
  • 您正在使用 Context context; 而不是使用 Activity context; 并在 MyPostedBookAdapter 类的任何地方调用 context.runOnUiThread()

标签: android


【解决方案1】:

通过您的活动上下文,您可以在适配器类中调用 runOnUiThread()。

【讨论】:

    【解决方案2】:

    通过观察您在此处发布的代码,您希望在删除数据后更新 UI(RecyclerView 上的 Particuler Row)。对吧?

    您在 MyPostedBookAdapter.java 上使用 Okhttp 将日期发送到节点服务器。 现在,更新到 UI,您必须在 Adaper Row onResponse() 方法上通知datasetChanged。编写此代码。希望这会对你有所帮助。

    private void deleteRow(){
    
        OkHttpClient client = new OkHttpClient.Builder()
                                  .connectTimeout(20, TimeUnit.SECONDS)
                                  .readTimeout(20,TimeUnit.SECONDS)
                                  .writeTimeout(20, TimeUnit.SECONDS)
                                  .build();
    
        RequestBody formBody = new FormBody.Builder().add("postId",id).build();
    
        Request request = new Request.Builder().url(URI).post(formBody).build();
    
        client.newCall(request).enqueue(new Callback() {
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            // To remome row from recyclerView Row(item).
            arrayList.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, arrayList.size());
            }
    
            @Override
            public void onFailure(Call call, IOException e) {
    
            }
    
        });
    
      }
    

    position 是特定行(项目)的位置。要获取 Position,您可以使用 getAdapterPosition() 方法。

    position=ViewHolder.getAdapterPosition()
    

    这里有任何查询评论。这对我有帮助。希望这对你也有帮助。谢谢...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 2015-11-15
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多