Android 可以通过InteractionListener从适配器调用Intent

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

我被告知最好从主活动启动另一个活动,而不是从适配器启动它,并且我应该使用InteractionListener与适配器通信,并从主活动调用意图

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
bellow
MyViewHolder
内部类中。我在主活动中编辑了我的答案@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.