Android 可以通过InteractionListener从适配器调用Intent
我被告知最好从主活动启动另一个活动,而不是从适配器启动它,并且我应该使用InteractionListener与适配器通信,并从主活动调用意图Android 可以通过InteractionListener从适配器调用Intent,android,sqlite,android-studio,kotlin,Android,Sqlite,Android Studio,Kotlin,我被告知最好从主活动启动另一个活动,而不是从适配器启动它,并且我应该使用InteractionListener与适配器通信,并从主活动调用意图 MyAdapter.AdapterCallback callback = new MyAdapter.AdapterCallback() { @Override public void onAdapterSelected(int pos) { Intent intent = new Intent(g
MyAdapter.AdapterCallback callback = new MyAdapter.AdapterCallback() {
@Override
public void onAdapterSelected(int pos) {
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivityForResult(intent, 100);
}
};
问题是我不明白如何实现InteractionListener
我试过了,但我不知道如何初始化回调
我试着按照别人告诉我的那样做,但我是初学者,不理解本教程,有一些错误我无法解决
interface OnAdapterInteractionListener {
fun itemSelected(/Some Parameters Maybe/)
}
class ItemRecyclerViewAdapter(
private val mListener: OnFragmentInteractionListener?
) : {
// set on click listener from item to OnAdapterInteractionListener.itemSelected(/* Maybe Item Argument/)
class MainActivity: Activity(), OnFragmentInteractionListener {
override fun itemSelected(/ Some Parameters*/ ) {
startAct....
}
}
我只想通过点击我的回收者视图中的一些项目来调用一个活动
非常感谢您提供的任何帮助或建议。您需要处理适配器的项目单击。请参阅此处的详细答案
特别是示例中的TaskItemListener用法 它非常简单和直接。您必须创建一个接口来充当侦听器,并且必须在您的活动中实现它。然后,您应该将该实现/引用传递给适配器,以便从适配器访问接口方法 很抱歉,它是用java编写的。但是你可以遵循同样的方法 创建和创建接口。您可以在适配器内/作为单独的类创建它(我正在适配器内创建它) 在活动中
MyAdapter.AdapterCallback callback = new MyAdapter.AdapterCallback() {
@Override
public void onAdapterSelected(int pos) {
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivityForResult(intent, 100);
}
};
然后在创建适配器时将此实现传递给适配器
MyAdapter adapter = new MyAdapter(dataList, callback); //dataList is list variable name
您还必须在适配器构造函数中进行更改
public MyAdapter(ArrayList<Student> data, AdapterCallback callback) {
this.callback = callback;
this.myList = data;
}
假设您有一个名称列表(
String
s),并且希望将其显示为列表。单击其中一个名称时,应在另一个活动中显示单击的项目(名称)。您可以按如下方式实现它
您的activity\u main.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerView"
tools:context=".MainActivity">
</androidx.recyclerview.widget.RecyclerView>
和MainActivity
class:
class MainActivity : AppCompatActivity() {
private lateinit var mAdapter: ItemRecyclerViewAdapter
private val names: ArrayList<String> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView.layoutManager = LinearLayoutManager(this)
initNames()
mAdapter = ItemRecyclerViewAdapter(names)
mAdapter.setOnAdapterInteractionListener(object : ItemRecyclerViewAdapter.OnAdapterInteractionListener {
override fun itemSelected(name: String, position: Int) {
Intent(this@MainActivity, DetailActivity::class.java).also {
it.putExtra("name", name)
startActivity(it)
}
}
})
recyclerView.adapter = mAdapter
}
private fun initNames() {
names.add("Name1")
names.add("Name2")
names.add("Name3")
}
}
这里的
detailText
是一个TextView
答案都没有帮助。我想他们都有一些java,所以他们不能工作
也就是说,我通过以下方式解决了问题:
在适配器声明中
var ctx: Context? = null
```kotlin
in the listener inside adapter
```kotlin
(ctx as MainActivity).openProject()
```kotlin
in the listener inside adapter
```kotlin
fun openProject() {
val intent = Intent(this, ProjectActivity::class.java)
this.startActivity(intent)
}
```kotlin
Well that solved my problem for now. If you know if doing an InterationListener insted is optimal or something please coment, thx.
嗨,谢谢你的回答!我应该把接口放在哪里?在另一个kotlin文件中?最好放在
ItemRecycleServiceAdapter
bellowMyViewHolder
内部类中。我在主活动中编辑了我的答案@AndreAndrioleIm获得了adapter.setOnAdapterInteractionListener的未解析引用。但是我把它放在适配器里面,我不知道为什么没有解决奇怪的是它在同伴对象上工作,但是在那里我不能“nameClickListener=listener”你解决问题了吗,@andriole?如果有,请单击答案旁边的复选标记,将答案标记为正确,谢谢!
class MainActivity : AppCompatActivity() {
private lateinit var mAdapter: ItemRecyclerViewAdapter
private val names: ArrayList<String> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView.layoutManager = LinearLayoutManager(this)
initNames()
mAdapter = ItemRecyclerViewAdapter(names)
mAdapter.setOnAdapterInteractionListener(object : ItemRecyclerViewAdapter.OnAdapterInteractionListener {
override fun itemSelected(name: String, position: Int) {
Intent(this@MainActivity, DetailActivity::class.java).also {
it.putExtra("name", name)
startActivity(it)
}
}
})
recyclerView.adapter = mAdapter
}
private fun initNames() {
names.add("Name1")
names.add("Name2")
names.add("Name3")
}
}
intent?.getStringExtra("name").also {
detailText.text = it
}
var ctx: Context? = null
```kotlin
in the listener inside adapter
```kotlin
(ctx as MainActivity).openProject()
```kotlin
in the listener inside adapter
```kotlin
fun openProject() {
val intent = Intent(this, ProjectActivity::class.java)
this.startActivity(intent)
}
```kotlin
Well that solved my problem for now. If you know if doing an InterationListener insted is optimal or something please coment, thx.