Обновить TextView в основной деятельности после нажатия на RecyclerView - PullRequest
2 голосов

В настоящее время я работаю над игрой в угадайку как часть процесса обучения. В моем приложении вы должны угадать одно правильное определение из трех. TextView предоставляет слово, RecyclerView - три варианта. Слова приходят из текстового файла.

Я научился менять RecyclerView после того, как щелкнул по нему. Слово в TextView также должно измениться, но я не могу получить к нему доступ из Adapter класса.

enter image description here

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var listNames = mutableListOf<String>()

        listMain.layoutManager = GridLayoutManager (this,3,1,false) as RecyclerView.LayoutManager?
        listMain.adapter = ItemAdapter(listNames)

        readDictionaryFile(listNames)
        wordGuess.text = listNames[0]
    }



    private fun readDictionaryFile(listNames: MutableList<String>) {
        val reader = Scanner(resources.openRawResource(R.raw.test))
        while (reader.hasNextLine()) {
            val line = reader.nextLine()
            val split = line.split(";")
            listNames.add(split[0])
        }
    }



class ItemAdapter(private val listNames: MutableList<String>): RecyclerView.Adapter<CustomViewHolder>() {

    //number of items
    override fun getItemCount(): Int {
        return listNames.size
    }

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
        val layoutInflater = LayoutInflater.from(p0.context)
        val cellForRow = layoutInflater.inflate(R.layout.list_layout, p0, false )
        return CustomViewHolder(cellForRow)
    }

    override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {
        val listTitle = listNames.get(p1)
        p0.view.listNamesView.text = listTitle
        p0.view.setOnClickListener {
            //do something
            notifyDataSetChanged()
        }

    }

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вы можете сделать это следующим образом:

Объявить интерфейс в вашем адаптере:

public interface MyInterface{
public void foo();
}

Пусть Activity реализует его:

public class MyActivity extends Activity implements MyInterface{
public void foo(){
    //do stuff
   }
}

Затем передайте свою деятельностьRecyclerAdapter:

public MyAdapter extends BaseAdater{
private MyInterface listener;

public MyAdapter(MyInterface listener){
    this.listener = listener;
    }
}

И где-то в адаптере, когда вам нужно вызвать этот метод Activity:

listener.foo();

Этот ответ основан на этом вопросе.

0 голосов
/ 14 июня 2019

Передайте обратный вызов вашему адаптеру.

class ItemAdapter(private val listNames: MutableList<String>, private val onNameClicked: (String) -> Unit): RecyclerView.Adapter<CustomViewHolder>() {

    //number of items
    override fun getItemCount(): Int {
        return listNames.size
    }

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
        val layoutInflater = LayoutInflater.from(p0.context)
        val cellForRow = layoutInflater.inflate(R.layout.list_layout, p0, false )
        return CustomViewHolder(cellForRow)
    }

    override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {
        val listTitle = listNames.get(p1)
        p0.view.listNamesView.text = listTitle
        p0.view.setOnClickListener {
            //do something
            onNameClicked(listTitle)
            notifyDataSetChanged()
        }

    }
}

В вашей основной деятельности,

listMain.adapter = ItemAdapter(listNames) { name ->
    // Update your TextView or something
}

С другой стороны, я вижу, что список в вашем адаптере изменчив. Я бы предложил сделать его неизменным, так как изменение набора данных адаптера и отсутствие вызова notifyDataSetChanged() подвержено ошибкам и не является хорошей практикой.

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