如何将持有者视图发送到 ArrayAdapter 中的 AsyncTask

How to send holder view to AsyncTask in ArrayAdapter

我正在将 holder 视图发送到 ArrayAdapter 中的 volley 方法,例如

final ViewHolder finalHolder = holder;
        holder.rlLike.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


                        userLikes(finalHolder);
                    }
        });

private void userLikes(final ViewHolder finalHolder){

            StringRequest request = new StringRequest(Request.Method.POST, user_likes_url, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    if(response != null){
                        Log.e("LikeResponse", response);

                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            //toastShort(activity, user_likes_obj.getString("data"));
                            if(jsonObject.getString("status").equals("success")){



                                    finalHolder.userLikeImage.setImageResource(R.drawable.icon_pop_like);
                                    finalHolder.tvLike.setText("Unlike");


                            }else {

                            }


                        } catch (JSONException e) {
                            e.getLocalizedMessage();
                            e.printStackTrace();
                        }

                    }else{

                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                        Log.e("error", error.toString());


                }
            }){
                @Override
                protected Map<String,String> getParams(){
                    Map<String,String> params = new HashMap<String, String>();
                    Log.e("action", user_likes);
                    params.put("action",user_likes);
                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("Content-Type","application/x-www-form-urlencoded");
                    return params;
                }
            };

            RequestQueue queue = Volley.newRequestQueue(context);
            queue.add(request);
            queue.getCache().remove(user_likes_url);
        }

从服务器获得成功响应后,我将 ImageView 和 TextView 更改为

finalHolder.userLikeImage.setImageResource(R.drawable.icon_pop_like);
finalHolder.tvLike.setText("Unlike");

但是我想将 holder view 发送到异步任务并基于服务器响应我想像上面那样更改 ImageView 和 TextView

我的AsyncTask任务代码是

private void userLikes(String likeStatus){

        class carRegAsynTask extends AsyncTask<String, Void, String>{

            //ProgressDialog dialog;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected String doInBackground(String... params) {

                String likeStatusParam = params[0];

                BasicNameValuePair likeStatus = new BasicNameValuePair("action", likeStatusParam);


                List<NameValuePair> listValuePairs = new ArrayList<NameValuePair>();
                listValuePairs.add(likeStatus);

                Log.e("listValuePairs", listValuePairs.toString());

                String Url = user_likes_url;
                Log.e("Url", Url);

                String response = POST_METHOD(listValuePairs, Url);

                return response;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                if (result != null) {
                    Log.e("LikeResult2", result);

                    try {
                        JSONObject jsonObject = new JSONObject(result);
                        if(jsonObject.getString("status").equals("success")){


                                userLikeImage.setImageResource(R.drawable.icon_pop_un_like);
                                tvLike.setText("Like");

                        }else {

                        }


                    } catch (JSONException e) {
                        e.getLocalizedMessage();
                        e.printStackTrace();
                    }

                }
            }

        }

        new carRegAsynTask().execute(likeStatus);

    }

所以请像我上面讨论的 volley 方法一样,帮助我将 holder 视图发送到异步任务,并且不要忘记它是一个 ArrayAdapter

尽管对异步任务的视图进行强引用并不是一个好习惯,但您可以将需要的任何内容传递给 carRegAsynTask。只需创建一个构造函数并将所有需要的数据作为参数传递即可。

更新

示例:

class carRegAsynTask extends AsyncTask<String, Void, String>{
    private final ViewHolder viewHolder;

    public carRegAsynTask(ViewHolder viewHolder) {
        this.viewHolder = viewHolder;
    }

    // omitted for brevity...
    // Use your viewHolder in onPreExecute or onPostExecute
}


// Creating async task with your viewHolder:
new carRegAsynTask(viewHolder).execute(likeStatus);

不知道是不是follow able,我是这样实现的

private void userLikes(final ViewHolder finalHolder) {

        class userLikesAsynTask extends AsyncTask<String, Void, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected String doInBackground(String... params) {

                BasicNameValuePair userid = new BasicNameValuePair("action", user_likes);


                List<NameValuePair> listValuePairs = new ArrayList<NameValuePair>();
                listValuePairs.add(userid);

                Log.e("listValuePairs", listValuePairs.toString());

                String userLikesUrl =  user_likes_url;
                Log.e("userLikesUrl", userLikesUrl);

                String response = POST_METHOD(listValuePairs, userLikesUrl);

                return response;
            }

            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);

                if (result != null) {
                    Log.e("userLikesUrlResult", result);

                    try {
                        JSONObject jsonObject = new JSONObject(result);

                        if(jsonObject.has("status")){
                            if(jsonObject.getString("status").equals("success")){

                                    finalHolder.userLikeImage.setImageResource(R.drawable.icon_pop_like);
                                    finalHolder.tvLike.setText("Unlike");


                            }else {

                            }
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                }
            }

        }

        new userLikesAsynTask().execute();

    }