У меня есть приложение, которое перечисляет книги по категориям в Recyclerview.Список категорий является динамическим;каждый пользователь будет видеть разные категории в зависимости от его профиля.Список книг также находится в (горизонтальном) обзоре Recycler, также динамическом и зависит от того, к каким книгам пользователь имеет доступ.
Примерно так:
Category 1
<List of books>
Category 2
<List of books>
Как мне поступитьдобавить SearchView с пользовательским адаптером для ВСЕХ найденных книг?
Это мое основное занятие.
BrowseBooksActivity Имеет две функции:
- fetchBooks - получает список категорий
fetchBooksByCategory - просматривает список категорий, чтобы получить список книг
class BrowseBooksActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.browsebooksmain_layout)
fetchBooks(this)
recyclerview_main.layoutManager = LinearLayoutManager(this)
}
fun fetchBooks (context: Context) {
val sp = PreferenceManager.getDefaultSharedPreferences(context)
val token = sp.getString(PREF_TOKEN, "")
val url = URL + "/tags?type=level"
val client = OkHttpClient.Builder().addInterceptor(object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.addHeader("Authorization", "Bearer " + token)
.build()
println(newRequest)
return chain.proceed(newRequest)
}
}).build()
val request = Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call?, response: Response?) {
val jsonData = response?.body()?.string()
val gson = GsonBuilder().setPrettyPrinting().create()
val tagList: List<Tags> = gson.fromJson(jsonData, object : TypeToken<List<Tags>>() {}.type)
fetchBooksByCategory(context, tagList)
}
}
}
fun fetchBooksByCategory (context: Context, tagList: List<Tags>) {
val sp = PreferenceManager.getDefaultSharedPreferences(this)
val token = sp.getString(PREF_TOKEN, "")
val count = tagList.size
var bookListByGroup: HashMap<String, List<ResourcesList>> = HashMap()
for ((idx, tag: Tags) in tagList.withIndex()) {
var tagName = tag.name
tagName.replace(" ","%20")
var url = URL + "/me/resources?resourceType.name=version2&tags.name=" + tagName
var client = OkHttpClient.Builder().addInterceptor(object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.addHeader("Authorization", "Bearer " + token)
.build()
return chain.proceed(newRequest)
}
}).build()
var request = Request.Builder().url(url).build()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call?, response: Response?) {
val jsonData = response?.body()?.string()
val gson = GsonBuilder().setPrettyPrinting().create()
val bookList: List<ResourcesList> = gson.fromJson(jsonData, object : TypeToken<List<ResourcesList>>() {}.type)
if (bookList.isNotEmpty()) {
bookListByGroup!!.put(tag.name,bookList)
}
if (idx == (count - 1)) {
//last index
runOnUiThread {
recyclerview_main.adapter = BrowseBooksAdapter(context,bookListByGroup)
}
}
}
}
}
BrowseBooksAdapter:
class BrowseBooksAdapter (val context: Context, val bookListByGroup : HashMap<String, List<ResourcesList>>?): RecyclerView.Adapter<CustomViewHolder>() {
override fun getItemCount(): Int {
return bookListByGroup!!.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val cellForRow = layoutInflater.inflate(R.layout.browsebooks_layout, parent, false)
return CustomViewHolder(cellForRow)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val keyList = ArrayList(bookListByGroup!!.keys)
val valueList = ArrayList(bookListByGroup!!.values)
holder?.v?.book_category.text = keyList[position]
var booksByCategory : List<ResourcesList>? = valueList[position]
holder?.v.inner_recyclerview.adapter = BooksByCategoryAdapter(booksByCategory)
holder?.v.inner_recyclerview.layoutManager = CustomLinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
}
}
class CustomViewHolder(val v: View): RecyclerView.ViewHolder(v) {
}
BooksByCategoryAdapter
class BooksByCategoryAdapter (val booksByCategory: List<ResourcesList>?): RecyclerView.Adapter<CustomVH>() {
override fun getItemCount(): Int {
return booksByCategory!!.count()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomVH {
val layoutInflater = LayoutInflater.from(parent.context)
val cellForRow = layoutInflater.inflate(R.layout.bookcontainer_layout, parent, false)
return CustomVH(cellForRow)
}
override fun onBindViewHolder(holder: CustomVH, position: Int) {
holder.booksByCategory = booksByCategory!![position]
Picasso.get().load(booksByCategory!![position].coverURI).into(holder?.v?.inner_bookcover)
}
}
class CustomVH(val v: View, var booksByCategory : ResourcesList? = null): RecyclerView.ViewHolder(v) {
init {
v.setOnClickListener {
val intent = Intent (v.context, ReadBooksActivity::class.java)
intent.putExtra("ID", booksByCategory!!.id)
v.context.startActivity(intent)
}
}
}