SearchView для RecyclerView внутри RecyclerView - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть приложение, которое перечисляет книги по категориям в Recyclerview.Список категорий является динамическим;каждый пользователь будет видеть разные категории в зависимости от его профиля.Список книг также находится в (горизонтальном) обзоре Recycler, также динамическом и зависит от того, к каким книгам пользователь имеет доступ.

Примерно так:

Category 1
<List of books>
Category 2
<List of books>

Как мне поступитьдобавить SearchView с пользовательским адаптером для ВСЕХ найденных книг?

Это мое основное занятие.

BrowseBooksActivity Имеет две функции:

  1. fetchBooks - получает список категорий
  2. 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)
        }

    }

}

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш вопрос неясен, однако, если вы хотите показать все данные и после этого, если вы хотите выполнить поиск по категории с помощью специального адаптера, вы можете использовать этот метод

  1. Добавить search_menu.xml in / res / menu

    <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.learn2crack.recyclerviewsearch.MainActivity"> <item android:id="@+id/search" android:icon="@drawable/ic_search" android:title="Search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu>

  2. прикрепить serach_menu к вашей деятельности в onCreateOptionsMenu

    @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); MenuItem search = menu.findItem(R.id.search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(search); //Calling function to search the text you entered in your custom adapter search(searchView); }

  3. Функция поиска

    : эта функция будет вызываться после ввода текста в меню поиска.

Здесь Old_Adapter - это адаптер, который вы отправили в просмотрщик.для отображения контента.Вы должны создать новый объект адаптера с данными, совпадающими с искомой строкой, и вызвать утилиту восстановления с помощью этого нового адаптера

    private void search(SearchView searchView) {

    searchView.setQueryHint("SOME_CATEGORY"); //Mention what you want to search as hint
    searchView.setInputType(InputType.TYPE_CLASS_TEXT);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }


        //Your searched text will appear as newText
        @Override
        public boolean onQueryTextChange(String newText) {

            //Create new object of your custom adapter
            List<AnyAdapter> searchcategory = new ArrayList<>();

            //Old_Adapter is your adapter with which you sent data to your Recyclerview
            for (int x = 0; x < Old_Adapter.size(); x++) {

                //Fetch data from your Old_Adapter
                final AnyAdapter newSearch = Old_Adapter.get(x);
                String cat = newSearch.getCategory();

                //compare the data with searched text add newSearch adapter to new Adapter created earlier  
                if (cat.contains(newText)) {
                    searchcategory.add(newSearch);
                }
            }
            if (newText.isEmpty()) { //If searched text is empty then pass Old_Adapter to your recyclerview again
                callRecyclerview(Old_Adapter);
            } else{ //Else call recyclerview with new Adapter
                callRecyclerview(searchcategory);
            }
            return true;
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...