如何从recylerview到新片段从项目导航

发布于 2025-01-29 16:22:33 字数 4956 浏览 0 评论 0原文

有人可以帮助我弄清楚我应该如何从循环系统的项目导航到此重新碎片吗?我想使用github api将这些内容显示在repofragment中。

我想单击“回收器”视图项目中的redoname。使用OnClickListener,我希望打开一个新的片段(repofoffragment),其中包含RecyClerview的单击项目的信息。

我正在进行存储库搜索,并希望在单击存储库时显示信息。下面的代码表示我尝试做的事情。 感谢您的帮助!

这是我的repositoryRecyclerAdapter:

class RepositoryRecyclerAdapter(repos: List<RepositoriesResponse>): RecyclerView.Adapter<SearchPlaceHolder>(){

private var repoList = repos
var navc: NavController?= null


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchPlaceHolder {
    val inflatedView = LayoutInflater.from(parent.getContext()).inflate(R.layout.pravokutnik, parent, false);
    return SearchPlaceHolder(inflatedView)
}

override fun onBindViewHolder(holder: SearchPlaceHolder, position: Int) {
    val repo = repoList[position]
    holder.bindRepo(repo)

   
    holder.itemView.setOnClickListener(object: View.OnClickListener{
        override fun onClick(v: View){
            navc?.navigate(R.id.action_searchFragment_to_repoFragment)
            }
        })
    

}

override fun getItemCount() = repoList.size

}

这是我的搜索范围:

class SearchFragment : BaseFragment<SearchViewModel, FragmentSearchBinding, SearchRepository>() {

private lateinit var mContext: Context
private var reposList = ArrayList<RepositoriesResponse>().toList()
private lateinit var adapterRepo: RepositoryRecyclerAdapter
private lateinit var linearLayoutManagerDistance: LinearLayoutManager




val args: SearchFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    mContext = this.requireContext()

    linearLayoutManagerDistance = LinearLayoutManager(mContext)
    linearLayoutManagerDistance.orientation = LinearLayoutManager.VERTICAL
    binding.repositoriesList.layoutManager = linearLayoutManagerDistance


    

    val query = args.query

    val apiInterface = RepositoryApi.create().getRepositoriesByQuery(query)

    



    apiInterface.enqueue( object : Callback<QueryResponse> {
        override fun onResponse(call: Call<QueryResponse>?, response: Response<QueryResponse>?) {
            if(response?.body() != null){
                reposList = response.body()!!.items
                adapterRepo = RepositoryRecyclerAdapter(reposList)
                binding.repositoriesList.adapter = adapterRepo

            }

        }

        override fun onFailure(call: Call<QueryResponse>?, t: Throwable?) {
            Toast.makeText(mContext, t.toString(), Toast.LENGTH_LONG).show()
        }


    })




}




override fun getViewModel() = SearchViewModel::class.java

override fun getFragmentBinding(
    inflater: LayoutInflater,
    container: ViewGroup?
) = FragmentSearchBinding.inflate(inflater, container, false)

override fun getFragmentRepository()=
    SearchRepository()

}

homefragment:

class HomeFragment : BaseFragment<HomeViewModel, FragmentHomeBinding, SearchRepository>() {


override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_home, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    var mySearchView = view.findViewById<SearchView>(R.id.search_view)
    var navc = Navigation.findNavController(view)

    mySearchView.setIconifiedByDefault(true);
    mySearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            val action = HomeFragmentDirections.actionHomeFragmentToSearchFragment2(query)
            navc?.navigate(action)
            return false
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            return false
        }
    })

}

override fun getViewModel() = HomeViewModel::class.java

override fun getFragmentBinding(
    inflater: LayoutInflater,
    container: ViewGroup?
) = FragmentHomeBinding.inflate(inflater, container, false)

override fun getFragmentRepository()=
    SearchRepository()

}

repoffragment:

class RepoFragment : BaseFragment<RepoViewModel, FragmentRepoBinding, SearchRepository>(){

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_repo, container, false)
}

override fun getViewModel() = RepoViewModel::class.java


override fun getFragmentBinding(
    inflater: LayoutInflater,
                                container: ViewGroup?
) = FragmentRepoBinding.inflate(inflater, container, false)


override fun getFragmentRepository() = SearchRepository()

}

另外,我在尝试运行此代码时会遇到错误; AndroidStudio说,我在夸大折线的布局时犯了一个错误。

Can someone help me figure out how i am supposed to navigate from an item in recyclerview to this repoFragment? I want to display these things in repoFragment using the GitHub API.

I want to click the reponame in the item of the recycler view. With the onClickListener i wish to open a new fragment (RepoFragment) with the info of the clicked item from the recyclerview.

I'm doing a repository search and want to display the info when clicking on the repository.The code below represents what i tried to do.
Thank you for your help!

This is my RepositoryRecyclerAdapter:

class RepositoryRecyclerAdapter(repos: List<RepositoriesResponse>): RecyclerView.Adapter<SearchPlaceHolder>(){

private var repoList = repos
var navc: NavController?= null


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchPlaceHolder {
    val inflatedView = LayoutInflater.from(parent.getContext()).inflate(R.layout.pravokutnik, parent, false);
    return SearchPlaceHolder(inflatedView)
}

override fun onBindViewHolder(holder: SearchPlaceHolder, position: Int) {
    val repo = repoList[position]
    holder.bindRepo(repo)

   
    holder.itemView.setOnClickListener(object: View.OnClickListener{
        override fun onClick(v: View){
            navc?.navigate(R.id.action_searchFragment_to_repoFragment)
            }
        })
    

}

override fun getItemCount() = repoList.size

}

This is my SearchFragment:

class SearchFragment : BaseFragment<SearchViewModel, FragmentSearchBinding, SearchRepository>() {

private lateinit var mContext: Context
private var reposList = ArrayList<RepositoriesResponse>().toList()
private lateinit var adapterRepo: RepositoryRecyclerAdapter
private lateinit var linearLayoutManagerDistance: LinearLayoutManager




val args: SearchFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    mContext = this.requireContext()

    linearLayoutManagerDistance = LinearLayoutManager(mContext)
    linearLayoutManagerDistance.orientation = LinearLayoutManager.VERTICAL
    binding.repositoriesList.layoutManager = linearLayoutManagerDistance


    

    val query = args.query

    val apiInterface = RepositoryApi.create().getRepositoriesByQuery(query)

    



    apiInterface.enqueue( object : Callback<QueryResponse> {
        override fun onResponse(call: Call<QueryResponse>?, response: Response<QueryResponse>?) {
            if(response?.body() != null){
                reposList = response.body()!!.items
                adapterRepo = RepositoryRecyclerAdapter(reposList)
                binding.repositoriesList.adapter = adapterRepo

            }

        }

        override fun onFailure(call: Call<QueryResponse>?, t: Throwable?) {
            Toast.makeText(mContext, t.toString(), Toast.LENGTH_LONG).show()
        }


    })




}




override fun getViewModel() = SearchViewModel::class.java

override fun getFragmentBinding(
    inflater: LayoutInflater,
    container: ViewGroup?
) = FragmentSearchBinding.inflate(inflater, container, false)

override fun getFragmentRepository()=
    SearchRepository()

}

The HomeFragment:

class HomeFragment : BaseFragment<HomeViewModel, FragmentHomeBinding, SearchRepository>() {


override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_home, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    var mySearchView = view.findViewById<SearchView>(R.id.search_view)
    var navc = Navigation.findNavController(view)

    mySearchView.setIconifiedByDefault(true);
    mySearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            val action = HomeFragmentDirections.actionHomeFragmentToSearchFragment2(query)
            navc?.navigate(action)
            return false
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            return false
        }
    })

}

override fun getViewModel() = HomeViewModel::class.java

override fun getFragmentBinding(
    inflater: LayoutInflater,
    container: ViewGroup?
) = FragmentHomeBinding.inflate(inflater, container, false)

override fun getFragmentRepository()=
    SearchRepository()

}

RepoFragment:

class RepoFragment : BaseFragment<RepoViewModel, FragmentRepoBinding, SearchRepository>(){

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_repo, container, false)
}

override fun getViewModel() = RepoViewModel::class.java


override fun getFragmentBinding(
    inflater: LayoutInflater,
                                container: ViewGroup?
) = FragmentRepoBinding.inflate(inflater, container, false)


override fun getFragmentRepository() = SearchRepository()

}

Also, I get an error when trying to run this code; androidstudio says that i made a mistake when inflating the layout of repofragment.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文