Кнопка Checklist all на Recyclerview не работает - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть утилита просмотра с флажком, и я хочу проверить все данные, используя кнопку.Я пробовал этот учебник, но когда я нажимаю кнопку, журнал вызывает функцию isSelectedAll, но не может установить флажок.что не так с моим кодом?

это мой код адаптера

var isSelectedAll = false

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListApproveDeatilViewHolder {
    val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.activity_list_approve_row, parent, false)

    return ListApproveDeatilViewHolder(itemView)
}

private lateinit var mSelectedItemsIds: SparseBooleanArray

fun selectAll() {
    Log.e("onClickSelectAll", "yes")
    isSelectedAll = true
    notifyDataSetChanged()
}

override fun onBindViewHolder(holder: ListApproveDeatilViewHolder, position: Int) {
    val approve = dataSet!![position]

    holder.soal.text = approve.title
    holder.kategori.text = approve.kategori

    if (!isSelectedAll){
        holder.checkBox.setChecked(false)
    } else {
        holder.checkBox.setChecked(true)
    }
}

и это мой код активности

override fun onCreate(savedInstanceState: Bundle?) {
     private var adapter: ListApproveDetailAdapter? = null

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_list_approve)
    ButterKnife.bind(this)

    getData()

    // this is my button onclick code

    select.setOnClickListener(){
        if (select.getText().toString().equals("Select all")){
            Toast.makeText(this, "" + select.getText().toString(), Toast.LENGTH_SHORT).show()
            adapter?.selectAll()
            select.setText("Deselect all")

        } else {
            Toast.makeText(this, "" + select.getText().toString(), Toast.LENGTH_SHORT).show()
            select.setText("Select all")

        }
    }

}
//this is for get my data for the recyclerview
fun getData() {
    val created_by = intent.getStringExtra(ID_SA)
    val tgl_supervisi = intent.getStringExtra(TGL_SURVEY)
    val no_dlr = intent.getStringExtra(NO_DLR)

    API.getListApproveDetail(created_by, tgl_supervisi, no_dlr).enqueue(object : Callback<ArrayList<ListApprove>> {
        override fun onResponse(call: Call<ArrayList<ListApprove>>, response: Response<ArrayList<ListApprove>>) {
            if (response.code() == 200) {
                tempDatas = response.body()
                Log.i("Data Index History", "" + tempDatas)
                recyclerviewApprove?.setHasFixedSize(true)
                recyclerviewApprove?.layoutManager = LinearLayoutManager(this@ListApproveActivity)
                recyclerviewApprove?.adapter = ListApproveDetailAdapter(tempDatas)
                adapter?.notifyDataSetChanged()
            } else {
                Toast.makeText(this@ListApproveActivity, "Error", Toast.LENGTH_LONG).show()
            }

            swipeRefreshLayout.isRefreshing = false

        }

        override fun onFailure(call: Call<ArrayList<ListApprove>>, t: Throwable) {
            Toast.makeText(this@ListApproveActivity, "Error", Toast.LENGTH_SHORT).show()

            swipeRefreshLayout.isRefreshing = false

        }
    })

}

this is the log when i click the button

Спасибо за любую помощь:)

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Добавьте одну переменную в классе модели.

как var isSelect : Boolean

В вашем selectAll() списке обновлений метода обновите список и адаптер уведомлений.

Редактировать: в классе адаптеров.

if (approve.isSelect){
        holder.checkBox.setChecked(true)
    } else {
        holder.checkBox.setChecked(false)
    }

Надеюсь, что это может помочь вам.

ИЛИ

Если вы используете AndroidX затем используйте должны использовать одну recyclerview функцию.

androidx.recyclerview.selection

Библиотека дополнений RecyclerView, обеспечивающая поддержку выбора элементов.Библиотека поддерживает как сенсорный, так и управляемый мышью выбор.Разработчики сохраняют контроль над визуальным представлением и политиками, управляющими поведением выбора (например, какие элементы имеют право на выбор и сколько элементов можно выбрать.)

Ссылка из здесь

0 голосов
/ 26 ноября 2018

Выкладываю ответ с реализацией демо-проекта.Я не изменял ваш код, но по вашему требованию я сделал это.

Класс MainActivity:

class MainActivity : AppCompatActivity() {

var selectAll: Boolean = false;

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)


    val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) as RecyclerView

    val btnSelectAll = findViewById<Button>(R.id.btnSelectAll) as Button


    //adding a layoutmanager
    recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)


    //crating an arraylist to store users using the data class user
    val users = ArrayList<User>()

    //adding some dummy data to the list
    users.add(User("Piyush", "Ranchi"))
    users.add(User("Mehul", "Chennai"))
    users.add(User("Karan", "TamilNadu"))
    users.add(User("Bela", "Kolkata"))

    //creating our adapter
    val adapter = CustomAdapter(users, selectAll)

    //now adding the adapter to recyclerview
    recyclerView.adapter = adapter

    btnSelectAll.setOnClickListener {

        if (!selectAll) {
            selectAll = true
        } else {
            selectAll = false
        }
        adapter?.selectAllCheckBoxes(selectAll)
    }
    }
    }

Класс пользователя:

data class User(val name: String, val address: String)

Класс адаптера:

class CustomAdapter(val userList: ArrayList<User>, val selectAll: Boolean) :
RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

var selectAllA = selectAll;


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
    val v = LayoutInflater.from(parent.context).inflate(R.layout.list_layout, parent, false)
    return ViewHolder(v)
}


override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
    holder.textViewName.text = userList[position].name;

    if (!selectAllA){
        holder.checkBox.setChecked(false)
    } else {
        holder.checkBox.setChecked(true)
    }
}

//this method is giving the size of the list
override fun getItemCount(): Int {
    return userList.size

}

//the class is hodling the list view
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    val textViewName = itemView.findViewById(R.id.textViewUsername) as TextView
    val checkBox = itemView.findViewById(R.id.checkbox) as CheckBox
}

 fun selectAllCheckBoxes(selectAll: Boolean) {
     selectAllA = selectAll
     notifyDataSetChanged()
}

}
0 голосов
/ 26 ноября 2018

Как я уже упоминал в комментариях, вы используете два разных экземпляра адаптера.Теперь я вижу, что вы объявили adapter во всем мире.Просто измените ваш код следующим образом и убедитесь, что response.body() содержит данные внутри него:

 if (response.code() == 200) {
            tempDatas = response.body()
            Log.i("Data Index History", "" + tempDatas)
            recyclerviewApprove?.setHasFixedSize(true)
            recyclerviewApprove?.layoutManager = LinearLayoutManager(this@ListApproveActivity)
            adapter = ListApproveDetailAdapter(tempDatas)
            recyclerviewApprove?.adapter=adapter
        } else {
            Toast.makeText(this@ListApproveActivity, "Error", Toast.LENGTH_LONG).show()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...