Как обновить кнопку просмотра карты на основе ответа залпа - PullRequest
0 голосов
/ 23 марта 2020

У меня есть адаптер представления переработчика, который отображает список автомобилей (просмотры карт), и в представлении карты у меня есть кнопка, которая, когда пользователь нажимает, отправляет некоторые данные на сервер и возвращает ответ «true» или false;

Когда пользователь нажимает на кнопку, я скрываю кнопку и показываю индикатор выполнения, показывающий пользователю, что что-то происходит, кнопка вызывает другую функцию, у которой есть залповый вызов и ответ, затем у меня есть еще одна функция который проверяет ответ.

Я пытаюсь скрыть индикатор выполнения этого определенного c представления карты, когда получаю ответ и показываю сообщение с результатом, я передаю положение карты, но я не могу изменить указатель c.

Я попытался найти индикатор выполнения, выполнив.

Progressbar progres = 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();
    }
}

1 Ответ

0 голосов
/ 23 марта 2020

Идея 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)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...