[英]How change text of textview inside main activity from recyclerview adapter class
I'm using a recycler view in fragment which is loaded into main activity.When my recycler view item is clicked i want to set text to textview which is inside main activity.我在片段中使用了一个回收器视图,它被加载到主要活动中。当我的回收者视图项被点击时,我想将文本设置为主要活动中的 textview。 I tried doing this:
我尝试这样做:
displayText(MainActivity(),R.id.name,"Text you want to display");
MainActivity().textView!!.setText(name)
fun displayText(activity: Activity, id:Int, text:String) {
val tv = activity.findViewById(id) as TextView
tv.setText(text)
}
But it doesn't work my application crashes Please help me debug this as i'm still a newbie any help will be appreciated.但它不起作用我的应用程序崩溃请帮助我调试它,因为我仍然是新手,任何帮助将不胜感激。
This is my main activity class:这是我的主要活动课程:
class MainActivity : AppCompatActivity() {
private var adapter: Tabadapter? = null
private var tabLayout: TabLayout? = null
private var viewPager: ViewPager? = null
var PlayPauseView : PlayPauseView? = null
var textView : TextView?=null
var context : Context?=null
var slidingUpPanelLayout : SlidingUpPanelLayout?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Dexter.withActivity(this)
.withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
).withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(report: MultiplePermissionsReport) {/* ... */
}
override fun onPermissionRationaleShouldBeShown(permissions: List<PermissionRequest>, token: PermissionToken) {/* ... */
}
}).check()
viewPager = findViewById<View>(R.id.viewPager) as ViewPager
tabLayout = findViewById<View>(R.id.tabLayout) as TabLayout
adapter = Tabadapter(supportFragmentManager)
adapter!!.addFragment(Songs(), "Songs")
adapter!!.addFragment(Playlist(), "Playlist")
adapter!!.addFragment(Folders(), "Folders")
adapter!!.addFragment(Albums(), "Albums")
adapter!!.addFragment(Artists(), "Artists")
adapter!!.addFragment(Genres(), "Genres")
viewPager!!.adapter = adapter
tabLayout!!.setupWithViewPager(viewPager)
slidingUpPanelLayout = findViewById(R.id.sliding_layout)
PlayPauseView=findViewById(R.id.play_pause_view)
PlayPauseView!!.setOnClickListener{v->
PlayPauseView!!.toggle()
}
textView = findViewById(R.id.name)
textView!!.startAnimation(AnimationUtils.loadAnimation(this, R.anim.translate) as Animation)
slidingUpPanelLayout!!.addPanelSlideListener(object : SlidingUpPanelLayout.PanelSlideListener {
override fun onPanelSlide(panel: View, slideOffset: Float) {
}
override fun onPanelStateChanged(panel: View, previousState: PanelState, newState: PanelState) {
Log.i("State", "onPanelStateChanged $newState")
}
})
}
fun update_counter(value:String) {
try
{
runOnUiThread() {
textView = findViewById(R.id.name)
textView !!.setText(value)
}
// val mHandler = Handler()
//textView!!.text=value
}
catch (ex:Exception) {
Log.d("Exception", "Exception of type" + ex.message)
}
}
}
This is my adapter class:这是我的适配器类:
class Songsadapter(private val sname: List<String>, private val sartist: List<String>, private val surl : List<String>, internal var mContext: Context) : RecyclerView.Adapter<Songsadapter.ProjectViewHolder>() {
var mPlayer : MediaPlayer?=null
var ps : Int?=null
override fun onCreateViewHolder(parent: ViewGroup, i: Int): ProjectViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.custom_songs, parent, false)
return ProjectViewHolder(view)
}
override fun onBindViewHolder(holder: ProjectViewHolder, position: Int) {
val pos = holder.adapterPosition
var name = sname.get(pos)
var artist = sartist.get(pos)
var songurl = surl.get(pos)
try {
var metaRetriver: MediaMetadataRetriever
metaRetriver = MediaMetadataRetriever()
metaRetriver.setDataSource(songurl)
var art: ByteArray
art = metaRetriver.embeddedPicture
var songImage = BitmapFactory.decodeByteArray(art, 0, art.size)
var ob: BitmapDrawable = BitmapDrawable(mContext.getResources(), songImage)
holder.covimg!!.setBackgroundDrawable(ob)
}catch (e: Exception){
e.printStackTrace()
}
holder.tvsname.text = name
holder.tvsartist.text = artist
holder.itemView.setOnClickListener(View.OnClickListener {
MainActivity().update_counter(name)
stoplaying()
var i:Int = pos
mPlayer = MediaPlayer()
mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
mPlayer!!.setDataSource(mContext.getApplicationContext(), Uri.parse(songurl))
mPlayer!!.prepare()
mPlayer!!.start()
mPlayer!!.setOnCompletionListener {
i = i+1
mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer!!.setDataSource(mContext.getApplicationContext(), Uri.parse(surl.get(i)))
mPlayer!!.prepare()
mPlayer!!.start()
}
})
}
override fun getItemCount(): Int {
return sname.size
}
inner class ProjectViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tvsname: TextView
var tvsartist: TextView
var covimg: ImageView
init {
tvsname = itemView.findViewById(R.id.sname)
tvsartist = itemView.findViewById(R.id.sartist)
covimg = itemView.findViewById(R.id.imgscov)
}
}
fun stoplaying(){
if (mPlayer != null) {
mPlayer!!.stop()
mPlayer!!.release()
mPlayer = null
}
}
}
Use interfacing to get recylcerView item click callback inside activity class. 使用接口来获取活动类中的recylcerView项目单击回调。 If you aren't comfortable to use interfacing, google for interface communication or ask me to put code example.
如果您不习惯使用接口,请使用google进行界面通讯或要求我提供代码示例。
1. Interface: 1.界面:
interface OnAdapterItemClickListener {
fun onItemClicked(id: Int, text: String)
}
2. Your adapter class 2.您的适配器类
class Songsadapter(private val clickListener: OnAdapterItemClickListener, private val sname: List<String>, private val sartist: List<String>, private val surl : List<String>, internal var mContext: Context) : RecyclerView.Adapter<Songsadapter.ProjectViewHolder>() {
//adapter code
}
3. Implement interface in your fragment 3.在片段中实现接口
class SearchFragment : Fragment(), OnAdapterItemClickListener{
private var mListener: OnAdapterItemClickListener? = null
fun onAttach(context: Context) {
super.onAttach(context)
if (context is OnAdapterItemClickListener) {
mListener = context as OnAdapterItemClickListener
} else {
throw RuntimeException("$context must implement OnFragmentInteractionListener")
}
}
fun onViewCreated(@NonNull view: View, @Nullable savedInstanceState: Bundle) {
super.onViewCreated(view, savedInstanceState)
//add fist parameter as 'this'
Songsadapter mAdapter = Songsadapter(this, others....., )
}
fun onItemClicked(id: Int, text: String) {
//You're getting click callback here in fragment
mListener.onItemClicked(id, text)
}
}
4. Implement interface in your activity too 4.在您的活动中也实现界面
class MainActivity : AppCompatActivity(), OnAdapterItemClickListener {
override fun onItemClicked(id: Int, text: String) {
//here you go
Log.i("clicked: ", text)
val tv = findViewById(id) as TextView
tv.setText(text)
}
}
hi i solve this problem with below steps : 您好,我可以通过以下步骤解决此问题:
private Context mContext; private List<RecyclerRowItem> mList; private TextView activityTv; public CartRecyclerAdapter(Context mContext, List<RecyclerRowItem> mList, TextView activityTv) { this.mContext = mContext; this.mList = mList; this.activityTv = activityTv; }
TextView activityTv=findViewById(R.id.tv);
RecyclerAdapter adapter = new RecyclerAdapter(context, list, activityTv);
recyclerView.setAdapter(adapter);
} }
TextView activityTv=findViewById(R.id.tv); RecyclerAdapter adapter = new RecyclerAdapter(context, list, activityTv); recyclerView.setAdapter(adapter);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.