如何获取不在ListView可见部分中的适配器类内部的视图? -Kotlin

时间:2019-05-07 14:17:03

标签: android kotlin android-listview

我有listView个手机铃声

listView

每次音乐开始或停止时,我都需要将play_arrow图像更改为stop图像。 当我单击一个图像上的播放时,它变成stop图像,然后我单击其他音乐项目图像上的播放,因此上一个图像应变为play_arrow,而单击一个图像应变为stop。 问题在于按位置获取视图。在前12个音乐视图中,一切都很好。而且,如果我尝试使用parent.getChildAt(previousListened)获得像这样的视图previousListened > 12,它将返回null。

编辑:添加适配器类

class SoundListAdapter constructor(
    private var context: Context,
    private val layout: Int,
    private var arrayList: ArrayList<Sound>,
    private val activity: FragmentActivity,
    private val mediaPlayer: MediaPlayer
) : BaseAdapter() {

    private var selectedPosition = -1
    private var currentListened = -1
    private var previousListened = -1
    private var isPlaying = false
    private var TAG = "SoundListAdapter"
    private val mSendSoundUri: SendSoundUri = activity as SendSoundUri

    interface SendSoundUri {
        fun sendSoundUri(input: String?)
    }

    override fun getCount(): Int {
        return arrayList.size
    }

    override fun getItem(i: Int): Any {
        return ""
    }

    override fun getItemId(i: Int): Long {
        return i.toLong()
    }

    private inner class ViewHolder {
        internal var radioButton: RadioButton? = null
        internal var txtName: TextView? = null
        internal var ivPlay: ImageView? = null
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var convertView = convertView
        val viewHolder: ViewHolder
        if (convertView == null) {
            viewHolder = ViewHolder()
            val layoutInflater = context.getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater

            convertView = layoutInflater.inflate(layout, null)
            viewHolder.txtName = convertView!!.findViewById(R.id.sound_name)
            viewHolder.radioButton = convertView.findViewById(R.id.sound_radiobutton)
            viewHolder.ivPlay = convertView.findViewById(R.id.ivPlay) as ImageView

            convertView.tag = viewHolder
        } else {
            viewHolder = convertView.tag as ViewHolder
        }

        //check the radio button if both position and selectedPosition matches
        viewHolder.radioButton?.isChecked = (position === selectedPosition)
        // TODO add color to checked circle
        //Set the position tag to both radio button and label
        viewHolder.radioButton?.tag = position
        viewHolder.ivPlay?.tag = position
        viewHolder.txtName?.tag = position

        viewHolder.radioButton?.setOnClickListener { v -> itemCheckChanged(v) }

        viewHolder.txtName?.setOnClickListener { v -> itemCheckChanged(v) }

        val music = arrayList[position]

        viewHolder.txtName!!.text = music.title

        // play music
        viewHolder.ivPlay!!.setOnClickListener {
            previousListened = currentListened
            currentListened = it.tag as Int
            // TODO add black square when playing
            Log.d(TAG, "max items: ${parent.childCount}")
            Log.d(TAG, "previousListened: $previousListened")
            if (previousListened != -1 && previousListened == currentListened && mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            } else {
                mediaPlayer.reset()
                mediaPlayer.setDataSource(context, Uri.parse(music.uri))
                mediaPlayer.prepare()
                mediaPlayer.start()
            }

        }

        return convertView
    }

    private fun getSelectedSound(): Sound? {
        Log.d(TAG, "sending selectedPosition: $selectedPosition")
        if (selectedPosition == -1)
            return null
        return arrayList[selectedPosition]
    }

    private fun itemCheckChanged(v: View) {
        selectedPosition = v.tag as Int
        mSendSoundUri.sendSoundUri(getSelectedSound()?.uri)
        Log.d(TAG, "selectedPosition changed to: $selectedPosition")
        notifyDataSetChanged()
    }
}

是否可以获得Adapter类中可见部分之外的ListView的项目视图?

1 个答案:

答案 0 :(得分:1)

是否可以获得Adapter类中可见部分之外的ListView的项目视图?

不,您不能。 ViewHolder仅适用于可见项目。

但是,在您的情况下,您只需要在ImageView函数中设置getView图像即可。

    if (currentListened == position) {
       // set here your Stop image 
        viewHolder.ivPlay.setImageResource(R.drawable.stop);
    } else {
       // set here your Play image
        viewHolder.ivPlay.setImageResource(R.drawable.play);
    }

然后,致电notifyDataSetChanged

    viewHolder.ivPlay!!.setOnClickListener {
        ...
        ...
        notifyDataSetChanged();
    }

notifyDataSetChange将更新所有可见项目。

另一方面,您无需将position保存在tag变量中。您总是知道单击了哪个项目,因为您的onClick事件是在getView函数中设置的。