我已经找到了与该主题相关的一些答案,但是在下面的代码中,我明确地使用了任何String方法,因此,我无法找出错误的真正原因。 MainScreenAdapter.kt文件的代码:
package adapters
import android.content.Context
import android.os.Bundle
import android.support.v4.app.FragmentActivity
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.TextView
import com.example.champion.echo_12.R
import fragments.SongPlayingFragment
import fragments.Songs
**class MainScreenAdapter(_songDetails: ArrayList<Songs>, _context: Context) :RecyclerView.Adapter<MainScreenAdapter.MyViewHolder>()** {
var songDetails: ArrayList<Songs>? = null
var mContext: Context? = null
init {
this.songDetails = _songDetails
this.mContext = _context
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val songObject = songDetails?.get(position)
holder.trackTitle?.text = songObject?.songTitle
holder.trackArtist?.text = songObject?.artist
holder.contentHolder?.setOnClickListener {
//Toast.makeText(mContext,songObject?.songTitle+" is Playing",Toast.LENGTH_SHORT).show()
val songPlayingFragment = SongPlayingFragment()
val args = Bundle()
args.putString("songArtist", songObject?.artist)
args.putString("songTitle", songObject?.songTitle)
args.putString("path", songObject?.songData)
//to int required here
args.putInt("songID",songObject?.songID?.toInt() as Int)
args.putInt("songPosition", position)
args.putParcelableArrayList("songData", songDetails)
songPlayingFragment.arguments = args
(mContext as FragmentActivity).supportFragmentManager
.beginTransaction()
.replace(R.id.details_fragment, songPlayingFragment)
.addToBackStack("SongPlayingFragment")
.commit()
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
**val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.row_custom_mainscreen_adapter, parent, false)**
return MyViewHolder(itemView)
}
override fun getItemCount(): Int {
if (songDetails == null) {
return 0
}
else {
return (songDetails as ArrayList<Songs>).size
}
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
/*Declaring the widgets and the layout used*/
var trackTitle: TextView? = null
var trackArtist: TextView? = null
var contentHolder: RelativeLayout? = null
/*Constructor initialisation for the variables*/
init {
trackTitle = view.findViewById(R.id.trackTitle) as TextView
trackArtist = view.findViewById(R.id.trackArtist) as TextView
contentHolder = view.findViewById(R.id.contentRow) as RelativeLayout
}
}
}
Line 56 and Line 16(Bold marked **) are subjected to the error condition.
调用MainScreenAdapter()类。
package fragments
import adapters.MainScreenAdapter
import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.support.v4.app.Fragment
import android.support.v7.widget.DefaultItemAnimator
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.RelativeLayout
import android.widget.TextView
import com.example.champion.echo_12.R
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
*
*/
class MainScreenFragment : Fragment() {
var getSongsList: ArrayList<Songs>? = null
var nowPlayingBottomBar: RelativeLayout? = null
var playPauseButton: ImageButton? = null
var songTitle: TextView? = null
var visibleLayout: RelativeLayout? = null
var noSongs: RelativeLayout? = null
var recyclerView: RecyclerView? = null
var myActivity: Activity? = null
var _mainScreenAdapter: MainScreenAdapter? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater!!.inflate(R.layout.fragment_main_screen, container, false)
visibleLayout = view?.findViewById(R.id.visibleLayout)
noSongs = view?.findViewById(R.id.noSongs)
nowPlayingBottomBar = view?.findViewById(R.id.hiddenBarMainScreen)
songTitle = view?.findViewById(R.id.songTitleMainScreen)
playPauseButton = view?.findViewById(R.id.playPauseButton)
recyclerView = view?.findViewById(R.id.contentMain)
return view
//return inflater.inflate(R.layout.fragment_main_screen, container, false)
}
override fun onAttach(context: Context?) {
super.onAttach(context)
myActivity=context as Activity
}
override fun onAttach(activity: Activity?) {
super.onAttach(activity)
myActivity=activity
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
getSongsList=getSongsFromPhone()
_mainScreenAdapter= MainScreenAdapter(getSongsList as ArrayList<Songs>,myActivity as Context)
val _mLayoutManager=LinearLayoutManager(myActivity)
recyclerView?.layoutManager=_mLayoutManager
recyclerView?.itemAnimator=DefaultItemAnimator()
recyclerView?.adapter=_mainScreenAdapter
}
fun getSongsFromPhone(): ArrayList<Songs>{
var arrayList = ArrayList<Songs>()
var contentResolver = myActivity?.contentResolver
var songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
var songCursor = contentResolver?.query(songUri, null, null, null, null)
if (songCursor != null && songCursor.moveToFirst()) {
val songId = songCursor.getColumnIndex(MediaStore.Audio.Media._ID)
val songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
val songArtist = songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)
val songData = songCursor.getColumnIndex(MediaStore.Audio.Media.DATA)
val dateIndex = songCursor.getColumnIndex(MediaStore.Audio.Media.DATE_ADDED)
while (songCursor.moveToNext()) {
var currentId = songCursor.getLong(songId)
var currentTitle = songCursor.getString(songTitle)
var currentArtist = songCursor.getString(songArtist)
var currentData = songCursor.getString(songData)
var currentDate = songCursor.getLong(dateIndex)
arrayList.add(Songs(currentId, currentTitle, currentArtist, currentData, currentDate))
}
}
return arrayList
}
}
如果有人可以帮助我指出“空引用”的原因,那么我将非常感谢。