在android(kotlin)的ListView上向下滚动时发生错误

时间:2018-07-29 18:19:45

标签: android listview kotlin listadapter

向下滚动列表视图时出现错误。当滚动到达活动底部时,发生错误。这里有一件奇怪的事。在kotlin代码上,有“ DataController.getDataList()”函数。此函数以ArrayList的形式获取10个数据列表,但是我的模拟器中只有9个数据。我的代码有什么问题?

activity_spiral_test_list.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".spiralTestListActivity"
    android:background="@color/Background">

    <ListView
        android:id="@+id/patientList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ViewStub
        android:id="@+id/empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout="@layout/empty"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/add"
        android:layout_margin="40dp"
        android:scaleType="center"
        android:tint="@android:color/white"
        android:backgroundTint="@color/Primary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:borderWidth="0dp"/>

</android.support.constraint.ConstraintLayout>

patient_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="30dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/patientName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Test Patient"
                android:textSize="40sp"
                android:textColor="@android:color/black"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/patientDescription"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Test Explanation"
                android:textSize="25sp"/>
        </LinearLayout>

        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_marginEnd="40dp"
            android:orientation="vertical">

            <ImageView
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:src="@drawable/assignment"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Test"
                android:textSize="20sp"/>

        </LinearLayout>
    </LinearLayout>
</LinearLayout>

spiralTestListActivity.kt

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import myPackage.DataController
import myPackage.PatientData
import kotlinx.android.synthetic.main.activity_spiral_test_list.*

class spiralTestListActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_spiral_test_list)

        patientList.adapter = patientAdapter(this, DataController.getDataList())
        patientList.emptyView = empty
    }

    private inner class ViewHolder {
        lateinit var name: TextView
        lateinit var description: TextView
    }

    inner class patientAdapter(context: Context, val listItem: ArrayList<PatientData>) : BaseAdapter() {
        private val mInflator: LayoutInflater = LayoutInflater.from(context)

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

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

        override fun getItem(position: Int): Any {
            return this.listItem[position]
        }

        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            val view: View
            val holder: ViewHolder

            if (convertView == null) {
                view = mInflator.inflate(R.layout.patient_list_item, parent, false)

                holder = ViewHolder()
                holder.name = view.findViewById(R.id.patientName) as TextView
                holder.description = view.findViewById(R.id.patientDescription) as TextView
            }
            else {
                view = convertView
                holder = convertView.tag as ViewHolder
            }

            val patient = getItem(position) as PatientData
            val name = holder.name
            val description = holder.description

            name.text = patient.name
            description.text = patient.description

            return view
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我解决了这个问题。发生此问题是由于线程。当然,数据的控制者是适配器。但是,我在对话框类中添加了数据。(上面的代码有一些不同的部分。我更改了..)因此,当线程要求从适配器获取数据时,该数据与ListView的数据不同。发生错误。

我修复了适配器类和对话框类中的代码。在适配器类中,我添加了一个名为add的函数。

fun add(data: PatientData) {
    DataController.addData(data)
}

还有一件事。在SpiralTestListActivity.ky中,我不添加

convertView.tag = holder

在Adapter类的else部分之上.. !!

这些部分使我的应用正常工作。!!

答案 1 :(得分:0)

当我使用列表视图时,我也发现了此问题。 您的问题是,当您向下滚动时,它会产生错误或刷新列表本身。 您需要做的是使用列表中每个项目的排名,要获得更多帮助,我认为您应该访问此链接。 Link