Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 单击RecyclerView后更新主活动中的TextView_Android_Kotlin - Fatal编程技术网

Android 单击RecyclerView后更新主活动中的TextView

Android 单击RecyclerView后更新主活动中的TextView,android,kotlin,Android,Kotlin,作为学习过程的一部分,我目前正在做猜谜游戏。在我的应用程序中,你基本上必须从三个定义中猜出一个正确的定义。TextView提供了一个单词,RecyclerView——三个选项。单词来自文本文件 我已经学会了如何在单击后更改RecyclerView。TextView中的单词也必须更改,但我无法从Adapter类访问它 class MainActivity:AppCompatActivity(){ 重写创建时的乐趣(savedInstanceState:Bundle?){ super.onCrea

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

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

class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var listNames=mutableListOf()
listMain.layoutManager=GridLayoutManager(this,3,1,false)作为RecycleView.layoutManager?
listMain.adapter=ItemAdapter(listNames)
readDictionaryFile(列表名)
wordGuess.text=列表名[0]
}
private fun readDictionaryFile(列表名:MutableList){
val reader=Scanner(resources.openRawResource(R.raw.test))
while(reader.hasNextLine()){
val line=reader.nextLine()
val split=行。split(“;”)
listNames.add(拆分[0])
}
}
类ItemAdapter(私有val listNames:MutableList):RecyclerView.Adapter(){
//项目数
重写getItemCount():Int{
返回listNames.size
}
override fun onCreateViewHolder(p0:ViewGroup,p1:Int):CustomViewHolder{
val layoutInflater=layoutInflater.from(p0.context)
val cellForRow=布局平坦。充气(R.layout.list_布局,p0,false)
返回CustomViewHolder(cellForRow)
}
覆盖BindViewHolder(p0:CustomViewHolder,p1:Int){
val listTitle=listNames.get(p1)
p0.view.listNamesView.text=listTitle
p0.view.setOnClickListener{
//做点什么
notifyDataSetChanged()
}
}

您可以这样做:

在适配器中声明接口:

public interface MyInterface{
public void foo();
}
让活动实现它:

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;
    }
}
在适配器中的某个位置,当您需要调用该活动方法时:

listener.foo();

此答案基于问题。

将回调传递给适配器

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

    }
}

另一方面,我看到适配器中的列表是可变的。我建议将其设置为不可变的,因为修改适配器数据集和不调用
notifyDataSetChanged()
容易出现错误,这不是一个好的做法。

尝试将活动中的侦听器添加到适配器中,并在需要时触发它更改TextView状态。
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
}