Я не могу использовать searchView с несколькими фрагментами - PullRequest
0 голосов
/ 25 сентября 2018

В моем приложении у меня есть два фрагмента карты фрагмента, примечание фрагмента.Я использую ViewPager и TabLayout для скольжения между двумя фрагментами.Я хочу реализовать функцию поиска в моем приложении.

Это мой класс MainActivity в Kotlin

class MainActivity : AppCompatActivity() {

private lateinit var  viewPager:ViewPager
private lateinit var tabLayout:TabLayout


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

    //toolbar.title = "Cards"

    initComponent()

}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    val sv: SearchView = menu!!.findItem(R.id.action_bar_search).actionView as SearchView
    val sm = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    sv.setSearchableInfo(sm.getSearchableInfo(componentName))
    sv.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(p0: String?): Boolean {
            //loadQuery("%"+p0+"%")
            return false
        }

        override fun onQueryTextChange(p0: String?): Boolean {
            //loadQuery("%"+p0+"%")
            return false
        }
    })
    return super.onCreateOptionsMenu(menu)
}


override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    if (item != null) {
        when (item.itemId) {
            R.id.sort -> {
                Toast.makeText(context, "sort note", Toast.LENGTH_SHORT).show()
            }
            R.id.settings -> {
                Toast.makeText(context, "settings note", Toast.LENGTH_SHORT).show()
            }
        }
    }

    return super.onOptionsItemSelected(item)
}

private fun initComponent() {

    viewPager = findViewById(R.id.view_pager)
    setupViewPager(viewPager)
    tabLayout = findViewById(R.id.tab_layout)
    tabLayout.setupWithViewPager(viewPager)

    viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
        override fun onPageSelected(position: Int) {
            changeFabIcon(position)
            toolbar.title = tabLayout.getTabAt(position)!!.text.toString()
            super.onPageSelected(position)
        }
    })

    fabT.setOnClickListener {
        //var text = ""
        when (viewPager.currentItem) {
            0 -> {
                // open add new card page
                startActivity(Intent(this, AddCardActivity::class.java))
                //text = "Add Card"
            }
            1 -> {
                // open add new note page
                startActivity(Intent(this, AddNoteActivity::class.java))
                //text = "Add note"
            }
        }
        //Toast.makeText(applicationContext, text, Toast.LENGTH_SHORT).show()
    }
}

private fun changeFabIcon(index: Int) {
    fabT.hide()
    Handler().postDelayed({
        when(index) {
            0 -> {
                fabT.setImageResource(R.drawable.ic_card)
            }
            1 -> {
                fabT.setImageResource(R.drawable.ic_note)
            }
        }
        fabT.show()
    }, 400)
}

private fun setupViewPager(view_pager: ViewPager) {
    val mAdapter = ViewPagerAdapter(supportFragmentManager)
    mAdapter.addFragment(FragmentCard(), "Cards")
    mAdapter.addFragment(FragmentNote(), "Notes")
    view_pager.adapter = mAdapter
}

internal inner class ViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) {
    private val mFragmentList = ArrayList<Fragment>()
    private val mFragmentTitleList = ArrayList<String>()

    override fun getItem(position: Int): Fragment {
        return mFragmentList[position]
    }

    override fun getCount(): Int {
        return mFragmentList.size
    }

    fun addFragment(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
        //fragment.arguments = args
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mFragmentTitleList[position]
    }
}

}

Это мой класс FragmentNote в Kotlin

class FragmentNote: Fragment() {

private var listNotes = ArrayList<Note> ()
private lateinit var mRecyclerViewNote: RecyclerView
private lateinit var mAdapterNote: RecyclerViewAdapterNote

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val v = inflater.inflate(R.layout.note_fragment, container, false)
    mAdapterNote = RecyclerViewAdapterNote(context!!, listNotes, this)
    mRecyclerViewNote = v.findViewById(R.id.noteRecView) as RecyclerView
    mRecyclerViewNote.layoutManager = LinearLayoutManager(context)
    mRecyclerViewNote.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
    mRecyclerViewNote.adapter = mAdapterNote
    setHasOptionsMenu(true)
    NoteLoadQuery("%")
    return v
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_main, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

private fun NoteLoadQuery(title: String) {
    var dbManager = DbManagerNote(context!!)
    val projections = arrayOf("ID", "Title", "Description")
    val selectionArgs = arrayOf(title)
    // sort by title
    val cursor = dbManager.Query(projections, "ID like ?", selectionArgs, "ID")
    listNotes.clear()
    // ascending
    if (cursor.moveToLast()) {
        do {
            val ID = cursor.getInt(cursor.getColumnIndex("ID"))
            val Title = cursor.getString(cursor.getColumnIndex("Title"))
            val Description = cursor.getString(cursor.getColumnIndex("Description"))
            listNotes.add(Note(ID, Title, Description))
        } while (cursor.moveToPrevious())
    }
    mAdapterNote.notifyDataSetChanged()
}

}

и, наконец, это мой класс FragmentCard

class FragmentCard: Fragment() {

private var listCards = ArrayList<Card>()
private lateinit var myRecyclerViewCard: RecyclerView
private lateinit var mAdapter: RecyclerViewAdapterCard


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    val v = inflater.inflate(R.layout.card_fragment, container, false)
    mAdapter = RecyclerViewAdapterCard(context!!,listCards, this)
    myRecyclerViewCard = v.findViewById(R.id.cardRecView) as RecyclerView
    myRecyclerViewCard.layoutManager = LinearLayoutManager(context)
    myRecyclerViewCard.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
    myRecyclerViewCard.adapter = mAdapter
    setHasOptionsMenu(true)
    CardLoadQueryAscending("%")

    return v
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_main, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

private fun CardLoadQueryAscending(title: String) {
    var dbManager = DbManagerCard(context!!)
    val projections = arrayOf("ID", "CardName", "CardNum")
    val selectionArgs = arrayOf(title)
    // sort by title
    val cursor = dbManager.Query(projections, "CardName like ?", selectionArgs, "CardName")
    listCards.clear()
    // ascending
    if (cursor.moveToFirst()) {
        do {
            val ID = cursor.getInt(cursor.getColumnIndex("ID"))
            val CardName = cursor.getString(cursor.getColumnIndex("CardName"))
            val CardNum = cursor.getString(cursor.getColumnIndex("CardNum"))
            listCards.add(Card(ID, CardName, CardNum))
        } while (cursor.moveToNext())
    }
    mAdapter.notifyDataSetChanged()

}

}

Я пытаюсь реализовать представление поиска в MainActivity, но яне в состоянии сделать.Может кто-нибудь, пожалуйста, дайте мне ваши ценные предложения, чтобы решить мою проблему.заранее спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Я сделал это, это довольно просто.Просто сделайте свой MainActivity владельцем SearchView.Как вы уже сделали.

Затем создайте простой интерфейс

ISearchChangedListener

onTextChanged (newString: String?)

onSearchSubmitted ()

Настройте BaseFragment для реализации этого интерфейса.

Переопределите реализацию в ваших дочерних фрагментах BaseFragment

Затем следите за mSelectedFragment на PageChanged.

Затем вы просто вызываете

mSelectedFragment?.onTextChanged(newString)

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

...