Вызов намерения из адаптера может быть InterationListener - PullRequest
1 голос
/ 04 июля 2019

Мне сказали, что лучше начать другое действие из основного действия, а не запускать его из адаптера, и что я должен использовать InteractionListener для связи с адаптером и вызова намерения из основного действия.

Проблема в том, что я не понял, как реализовать InteractionListener.

Я пробовал это https://developer.android.com/training/basics/fragments/communicating, но я не знаю, как инициализировать обратный вызов.

Я пыталсячтобы сделать это, как мне сказали, но я новичок и не понял этого урока, у меня есть ошибки, которые я не могу решить.

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....
    }
}

Я просто хочу вызвать действие, нажав на некоторые элементы в моем представлении переработчика.

Я очень ценю любую помощь или предложения, которые вы можете предоставить.

Ответы [ 4 ]

1 голос
/ 04 июля 2019

Предположим, у вас есть список имен (String с), и вы хотите показать их в виде списка. При щелчке по одному из этих имен вы должны показать элемент (имя), показанный по нажатию, в другой активности . Вы можете реализовать это следующим образом.

Ваш activity_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>

Адаптер ItemRecyclerViewAdapter, подкласс RecyclerView.Adpater, который требует список строк в качестве аргумента конструктора и который может принимать OnAdapterInteractionListener ( Редактировать: Помещен внутрь adpater), чтобы взаимодействовать с деятельностью или фрагментом:

class ItemRecyclerViewAdapter(private val names: List<String>)
    : RecyclerView.Adapter<ItemRecyclerViewAdapter.MyViewHolder>() {

    private var nameClickListener: OnAdapterInteractionListener? = null

    fun setOnAdapterInteractionListener(listener: OnAdapterInteractionListener) {
        nameClickListener = listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_name, parent, false)

        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {
        return names.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.tvName.text = names[position]
    }


    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val tvName: TextView = itemView.findViewById(R.id.tvName)

        init {
            itemView.setOnClickListener {
                nameClickListener?.itemSelected(names[adapterPosition], adapterPosition)
            }
        }
    }

    interface OnAdapterInteractionListener {

        fun itemSelected(name: String, position: Int)
    }
}

А MainActivity класс:

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")
    }
}

Затем вы должны реализовать DetailActivity, который обрабатывает StringExtra , как показано ниже, и устанавливает для него TextView:

intent?.getStringExtra("name").also {
    detailText.text = it
}

Здесь detailText является TextView.

0 голосов
/ 08 июля 2019

Ни один из ответов не помог.Я думаю, что у них у всех есть 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.
0 голосов
/ 04 июля 2019

Это довольно просто и прямо. Вы должны создать интерфейс, чтобы действовать в качестве слушателя и внедрять его в свою деятельность. Затем вы должны передать эту реализацию / ссылку на адаптер для доступа к методу интерфейса из адаптера.

Извините, что это в Java . Но вы можете следовать тому же методу

Создание и интерфейс. Вы можете создать его внутри адаптера / как отдельный класс (я создаю его внутри моего адаптера)

public interface AdapterCallback{

        void onAdapterSelected(int pos);

    }

И внутри деятельности.

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;
        }

Затем внутри onBindViewHolder замените код активности запуска на callback.onAdapterSelected

viewHolder.mBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callback.onAdapterSelected(i);
                }


   });
0 голосов
/ 04 июля 2019

Вам необходимо обработать щелчок элемента адаптера.Обратитесь к подробному ответу здесь Передача данных из одного действия интерактору другого действия

Особенности использования TaskItemListener в образце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...