【问题标题】:How to update a cardview button based on a volley response如何根据截击响应更新卡片视图按钮
【发布时间】:2020-03-22 21:04:10
【问题描述】:

我有一个显示汽车列表(卡片视图)的回收器视图适配器,并且在卡片视图中我有一个按钮,当用户单击时 向服务器发送一些数据并返回“真”或假的响应;

当用户点击按钮时,我隐藏按钮并显示一个进度条,向用户显示正在发生的事情, 该按钮调用具有 volley 调用和响应的不同函数,然后我有另一个验证响应的函数。

我想要做的是在我收到响应时隐藏该特定卡片视图的进度条并显示带有结果的消息,我正在传递卡片视图的位置 但我无法更改具体的进度条。

我已经尝试通过做找到进度条。

进度条进度 = findviewbyid(R.id.myprogressbar);

但它发现最后一个卡片视图的进度条不是它被点击的那个。

public void onBindViewHolder(@NonNull final CarViewHolder holder, final int position) {
    final CartItem currentItem = _carList.get(position);

    String name = currentItem.getCarName();
    String date = currentItem.getCarDate();



    String instructions = currentItem.getInstructions();
    String description = currentItem.getInstructions2();
    String carKey = currentItem.getKey();


    holder.name.setText(name);
    holder.date.setText("Date: " + date);
    holder.instructions.setText(instructions);
    holder.description.setText(description);
    holder.carKey.setText(carKey);

    holder.car_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.car_button.setVisibility(View.INVISIBLE);
            carProgressBar.setVisibility(View.VISIBLE);
            holder.car_button.setText("Thank you!");
            holder.car_date.setText("");
            holder.car_button.setClickable(false);
            carDate(currentItem.getCarName(), currentItem.getKey(), position);
        }
    });
} 


public void carDate(String name, String key, final int position) {
    _Key = key;
    Toast.makeText(mContext, "Thank you! -  " + name, Toast.LENGTH_LONG).show();


    String url = "url=key"+key;

    JsonObjectRequest request = new JsonObjectRequest (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e(TAG, "KEY RESPONSE: " + response + " : " + position);
            try {
                result = response.getString("result");
                validateResponse(result, position);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    carQueue.add(request);
}

这是我试图隐藏进度条并显示带有响应的消息的地方;

public void validateResponse(String result, int position) {
    CarItem carItem = _carList.get(position);

    if (result.equals("true")) {
        Toast.makeText(mContext, "--> " + result + " <---", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(mContext, "--> " + result + " <---", Toast.LENGTH_LONG).show();
    }
}

【问题讨论】:

    标签: java android android-adapter android-recyclerview


    【解决方案1】:

    RecyclerView 背后的理念是每一行都应该代表底层对象的当前状态。

    我通常对我的对象进行子类化以添加一些与视图状态相关的值。然后每次状态变化时我都会打电话给notifyItemChanged(position: Int)。这里是一个示例代码:

    //The original object
    open class MObject(val name: String)
    //Add the field isCalling to the underlying object
    class MWrapper(name: String, var isCalling: Boolean = false): MObject(name)
    

    MAdapter

    class MAdapter(private val items: List<MWrapper>): RecyclerView.Adapter<MAdapter.ViewHolder>() {
    
        ...
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val item = items[position]
            with(holder){
                tv.text = if (item.isCalling) "I'm calling" else item.name
    
                itemView.setOnClickListener {
                    //Set isCalling to true
                    onCallStateChange(item, position)
                    //Simulate a 5 sec long network call
                    Handler().postDelayed({ onCallStateChange(item, position, false) }, 5000L)
                }
            }
        }
    
        private fun onCallStateChange(
            item: MWrapper, 
            position: Int, 
            isCalling: Boolean = true
        ){
            item.isCalling = isCalling
            notifyItemChanged(position)
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2018-10-05
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多