Мне нужно предоставить некоторый контент 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
компилятор запускает ошибкув строке, обозначенной // ошибкой
:
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.Что я могу сделать, чтобы передать строку, чтобы открыть другое действие?
-Oooooooooo-
РЕДАКТИРОВАТЬ: согласно справке CommonsWare, которую я запускаю из onBindViewHolder
этого фрагмента:
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 попросила у меня три параметра вместо одного импорта этой библиотеки (без нескольких вариантов выбора) import android.support.v4.content.ContextCompat.startActivity
2) Вторая странная вещь Я думал, что раньше мне нужно было объявить контекст, как указало Commonsware, поэтому я получил один из параметров `startActivity (intent) // // следующим образом:
view.context.startActivity (intent)
Тем не менее, я получаю Activity пустым, и я понятия не имею, что такое Activity, я помещаю журнал в Main, и моя цель Activity и онине называются, я также добавил некоторые <TextView
с некоторым жестко закодированным текстом для распознавания действия, но не работает, цель Activity не запущена, и я не знаю, как отлаживать намерение, я также безуспешно пытался исследовать Intent
class
EDIT 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()
}
}