【问题标题】:Update TextView in main activity after clicking on RecyclerView单击 RecyclerView 后更新主要活动中的 TextView
【发布时间】:2019-10-29 02:58:20
【问题描述】:

我目前正在将猜谜游戏作为学习过程的一部分。在我的应用程序中,您基本上必须从三个中猜出一个正确的定义。 TextView 提供了一个词,RecyclerView——三个选项。单词来自文本文件。

点击RecyclerView 后,我学会了如何更改它。 TextView 中的单词也必须更改,但我无法从 Adapter 类访问它。

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

    }

【问题讨论】:

  • 尝试将监听器从您的活动添加到适配器中,并在需要时触发它以更改 TextView 状态。

标签: android kotlin


【解决方案1】:

你可以这样做:

在你的适配器中声明接口:

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();

此答案基于this 问题。

【讨论】:

    【解决方案2】:

    将回调传递给您的适配器。

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

    在您的 MainActivity 中,

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

    另一方面,我发现您的适配器中的列表是可变的。我建议让它不可变,因为修改适配器数据集而不调用 notifyDataSetChanged() 容易出现错误,不是一个好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      相关资源
      最近更新 更多