我需要为新的活动提供一些String
内容,并且需要在单击RecyclerView
上的项目时执行。我的策略是从RecyclerView
创建接口(实例化MainActivity
的实例)开始,从MainActivity
启动显式Intent
。
这是我的适配器(所以请注意不是MainActivity):
var mainActivity: MainActivity = MainActivity()//because i need to call an interface, please see below
override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) {
holder.bindData(label.get(position).attribute.label.toString())
holder.itemView.setOnClickListener(
View.OnClickListener { view ->
//val JSONResponseBody = bezinningModels!![position].attribute.body
val item = label.get(position).attribute.body
//Log.d("IVO", "item: "+item);
//val message = editText.text.toString()
Log.d("IVO", "touched: ");
mainActivity.injectText(item!!)//an interface launch this, see below
})
接口在同一类中
public interface LaunchBezinning {
fun injectText(bezinningText: String)
}
,在MainActivity
中,编译器在// error
:
class MainActivity : AppCompatActivity(),LaunchBezinning {
override fun injectText(bezinningText: String) {
val intent = Intent(this@MainActivity , BezinningContentActivity::class.java)//error
intent.putExtra(EXTRA_MESSAGE, bezinningText)
startActivity(intent)
}
我想将BezinningContentActivity
传递给其他人,但出现错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
at android.content.ComponentName.<init>(ComponentName.java:130)
at android.content.Intent.<init>(Intent.java:5780)
at ivano.android.com.bezinning.ui.bezinningList.MainActivity.injectText(MainActivity.kt:14)
at ivano.android.com.bezinning.ui.bezinningList.BezinningAdapter$onBindViewHolder$1.onClick(BezinningAdapter.kt:70)
我的猜测是没有调用上下文,我不应该从适配器初始化MainClass。我该怎么做才能传递一个字符串,以便打开另一个活动?
-O-o-o-o-o-o-o-o-o-o-
编辑:
根据我从onBindViewHolder
启动的这段代码的CommonsWare帮助:
holder.itemView.setOnClickListener(
View.OnClickListener { view ->
val intent = Intent(view.context, BezinningContentActivity::class.java)
intent.putExtra(EXTRA_MESSAGE, label.get(position).attribute.body ?: "")
startActivity(intent)
})
RecyclerView消失,并且出现一个空白的Activity
,没有错误
但是没有上课
两件奇怪的事情:
1)第一个奇怪的事情 startActivity要求我输入三个参数,而不是一个 导入此库(无选择)导入android.support.v4.content.ContextCompat.startActivity
2)第二个奇怪的事情 我以为之前必须声明该上下文为Commonsware指示 因此我以这种方式检索了`startActivity(intent)//一个参数:
view.context.startActivity(intent)
我仍然没有一个活动,我不知道哪个活动是什么,我将日志放在Main中,并且我的Activity目标没有被调用,我还添加了一些<TextView
以及一些硬编码文本来识别活动,但不起作用,
活动目标尚未启动,并且我不知道如何调试意图,因此我也尝试了Intent
类
编辑2: 用于mTak
这里是我的适配器类:
internal class BezinningAdapter : RecyclerView.Adapter<SimpleViewHolder>() {
// lateinit var context: Context
// var mainActivity: MainActivity = MainActivity()
var label = ArrayList<BezinningModel>()
//it requires minimum these three methods to work
//returns a ViewHolder for positioning in our view
//creates new View holder invoked by the layout manager
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.view_recyclerview_row, parent, false)
//context = view.context
return SimpleViewHolder(view)
}
//giving a position
// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.bindData(label.get(position).attribute.label.toString())
holder.itemView.setOnClickListener(
View.OnClickListener { view ->
val item = label.get(position).attribute.body
val
intent=Intent(view.context,BezinningContentActivity::class.java)
intent.putExtra(EXTRA_MESSAGE,item)
//startActivity(view.context,intent,null)//first one see Edit1
view.context.startActivity(intent)//second one passing Context
Log.d("IVO", "touched: ");
Log.d("IVO", "passed interface in Main: "+intent);
})
}
override fun getItemCount(): Int {
return label.size
}
public fun setTitleData(bezinningModels: List<BezinningModel>) {
if (bezinningModels == null) {
return
}
label.addAll(bezinningModels)
notifyDataSetChanged()
}
}
答案 0 :(得分:2)
您不能通过Context
之类的构造函数自己创建var mainActivity: MainActivity = MainActivity()
。您从其他地方得到了Context
。在您的情况下,您有一个View
,而View
有一个名为getContext()
的Java方法,可以在Kotlin中将其称为context
。
因此,将您现有的OnClickListener
替换为:
holder.itemView.setOnClickListener(
View.OnClickListener { view ->
val intent = Intent(view.context, BezinningContentActivity::class.java)
intent.putExtra(EXTRA_MESSAGE, label.get(position).attribute.body ?: "")
startActivity(intent)
})
(这可能需要稍作修改,因为我不知道label.get(position).attribute.body
返回什么,但是应该相当接近)
答案 1 :(得分:1)
像这样更改适配器的标题:
internal class BezinningAdapter(context: Context) : RecyclerView.Adapter<SimpleViewHolder>()
现在,当您从MainActivity
对其进行初始化时,您需要传递this
作为参数。
接下来,在适配器的标头下声明此内容:
private val parentActivity: MainActivity = context as MainActivity
现在尝试像这样的以前的代码:
parentActivity.injectText(item!!)
我不知道为什么您只使用常规的公共功能来代替injectText()