【发布时间】:2017-09-19 16:00:03
【问题描述】:
我有一个由 2 个主要项目组成的活动:一个 RecyclerView 和一个 ListView。 RecyclerView 充当过滤器,选择/取消选择其中的项目将影响 ListView 的内容。一切正常,直到我尝试在 RecyclerView 上实现 onClickListener 并意识到这不是一个选项。
我尝试在 ViewHolder 中设置 OnClickListener,但它需要在主 Activity 中调用一个函数并刷新它的 listView。任何此类交互都会触发以下错误:
java.lang.NullPointerException
at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:117)
at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:202)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
at .newsScreen._$_findCachedViewById(newsScreen.kt)
at .newsScreen.filterNews(newsScreen.kt:71)
at Cells.NewsFeedList$NewsSource$1.onClick(News Lists.kt:84)
假设这是有道理的,因为我试图从它的类之外访问 UI,但我找不到它的替代方案。
RecyclerView 适配器:
class NewsFeedList() : RecyclerView.Adapter<NewsFeedList.NewsSource>() {
private var source: List<NewsFeed> = ArrayList()
constructor(s: ArrayList<NewsFeed>) : this() {
source = s
}
class NewsSource : RecyclerView.ViewHolder {
private var mTextView: TextView? = null
constructor(v: View): super(v) {
mTextView = v.title
}
fun bindInfo(news: NewsFeed, view: View, int: Int) {
mTextView!!.text = news.title
view.tag = int
view.setOnClickListener { newsScreen().filterNews(view.tag.toString().toInt()) }
if (news.selected) view.background = ColorDrawable(Color.parseColor(news.color))
else view.background = ColorDrawable(Color.parseColor(design.backgroundColor))
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): NewsFeedList.NewsSource {
val view = LayoutInflater.from(parent!!.context).inflate(R.layout.newsfeed_list, parent, false)
return NewsSource(view)
}
override fun onBindViewHolder(holder: NewsFeedList.NewsSource, position: Int) {
holder.bindInfo(source[position], holder.itemView, position)
}
override fun getItemCount(): Int {
return source.count()
}
}
然后,在我的 newsScreen 类中,我需要使用新数据访问 RecyclerView 适配器
fun filterNews(i: Int) {
newsFeed[i].selected = !newsFeed[i].selected
filter.adapter = NewsFeedList(newsFeed)
}
如果我删除对过滤器(RecyclerView)的任何引用,一切都很好,但 onClickListener 的目的是刷新活动内容。
有没有办法实现这一点,或者我应该将 RecyclerView 更改为不同的 UI 元素?
编辑: 我尝试将 OnClickListener 添加到 RecyclerView 但它似乎没有被触发。 代码:
filter.adapter = NewsFeedList(newsFeed)
filter.layoutManager = LinearLayoutManager(this@newsScreen, LinearLayoutManager.HORIZONTAL, false)
filter.setOnClickListener { v: View? ->
filterNews(v!!.tag.toString().toInt())
}
【问题讨论】:
-
为什么不使用 OnItemClickListener 而不是 OnClickListener?
-
你能检查我更新的问题吗?我对 Android 不是很熟悉,所以很明显我错过了一些东西。
-
很抱歉,OnItemClickListener 实际上并不能很好地与 RecycleView 配合使用。我已经给你写了一个关于如何解决 NullPointerException 问题的答案。
标签: android listview android-recyclerview kotlin