简体   繁体   English

如何从 recyclerview 适配器类更改主要活动中 textview 的文本

[英]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 : 您好,我可以通过以下步骤解决此问题:


1-add a TextView in adapter constructor 1-在适配器构造函数中添加一个TextView

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


2- then in onBindViewHolder method you can set a value for textView 2-然后在onBindViewHolder方法中,您可以为textView设置一个值

TextView activityTv=findViewById(R.id.tv);
RecyclerAdapter adapter = new RecyclerAdapter(context, list, activityTv);
recyclerView.setAdapter(adapter);

} }


3- then you should pass your MainActivity TextView to adapter in other places 3-然后您应该将MainActivity TextView传递给其他地方的适配器

 TextView activityTv=findViewById(R.id.tv); RecyclerAdapter adapter = new RecyclerAdapter(context, list, activityTv); recyclerView.setAdapter(adapter); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当TextView不在recyclerView的行中时,如何在Adapter类中获取活动的TextView? - How to get TextView of an activity in an Adapter class while that TextView is not in row of recyclerView? Android 从 Activity 更改 RecyclerView 适配器上的 TextView textSize - Android change TextView textSize on RecyclerView adapter from Activity 如何从另一个类更改recyclerView适配器内的ImageView? - How to change an ImageView inside recyclerView adapter from another class? 如何从适配器类更改 TextView 文本? - How can I change TextView text from adapter class? 如何从活动类更新recyclerview textview - How to update recyclerview textview from activity class 如何将多个 EditText 值从 RecyclerView 适配器传递到主 Activity? - How to pass multiple EditText values from RecyclerView adapter to main Activity? 如何从扩展 RelativeLayout 的 class 更改 Activity 中的 Textview 文本 - How to change Textview text in Activity from class that extends RelativeLayout 如何从另一个Activity更改LinerLayout扩展类中TextView的文本? - How to change text of a TextView in a LinerLayout extended class from another Activity? 如何在 RecyclerView 适配器 class 中初始化正确的 TextView? - How to initialize right TextView in RecyclerView Adapter class? 如何从recyclerview适配器内部访问Activity上的外部VIEWS - How to access outside VIEWS on Activity from inside recyclerview adapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM