【问题标题】:how to attach an xml file in recyclerview using kotlin?如何使用 kotlin 在 recyclerview 中附加 xml 文件?
【发布时间】:2020-07-28 14:37:47
【问题描述】:

所以我正在尝试实现一个我从开源项目中获取的 xml 文件并将其附加到一个 recyclerview 并且每当我这样做时,我的应用程序以太崩溃或者它不显示 xml 文件,我不是很清楚为什么!

请帮我解决这个问题

这是我到达的地方

类似于我的 xml 文件的 XML 示例

<quran>
<sura index="1" name="الفاتحة">
    <aya index="1" text="بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ" />
    <aya index="2" text="الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ" />
    <aya index="3" text="الرَّحْمَنِ الرَّحِيمِ" />
    <aya index="4" text="مَالِكِ يَوْمِ الدِّينِ" />
    <aya index="5" text="إِيَّاكَ نَعْبُدُ وَإِيَّاكَ نَسْتَعِينُ" />
    <aya index="6" text="اهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ" />
    <aya index="7" text="صِرَاطَ الَّذِينَ أَنْعَمْتَ عَلَيْهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِمْ وَلَا الضَّالِّينَ" />
</sura>
<sura index="2" name="البقرة">
    <aya index="1" text="الم" bismillah="بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ" />
    <aya index="2" text="ذَلِكَ الْكِتَابُ لَا رَيْبَ فِيهِ هُدًى لِلْمُتَّقِينَ" />
    <aya index="3" text="الَّذِينَ يُؤْمِنُونَ بِالْغَيْبِ وَيُقِيمُونَ الصَّلَاةَ وَمِمَّا رَزَقْنَاهُمْ يُنْفِقُونَ" />
    <aya index="4" text="وَالَّذِينَ يُؤْمِنُونَ بِمَا أُنْزِلَ إِلَيْكَ وَمَا أُنْزِلَ مِنْ قَبْلِكَ وَبِالْآخِرَةِ هُمْ يُوقِنُونَ" />
    <aya index="5" text="أُولَئِكَ عَلَى هُدًى مِنْ رَبِّهِمْ وَأُولَئِكَ هُمُ الْمُفْلِحُونَ" />
    <aya index="6" text="إِنَّ الَّذِينَ كَفَرُوا سَوَاءٌ عَلَيْهِمْ أَأَنْذَرْتَهُمْ أَمْ لَمْ تُنْذِرْهُمْ لَا يُؤْمِنُونَ" />
    <aya index="7" text="خَتَمَ اللَّهُ عَلَى قُلُوبِهِمْ وَعَلَى سَمْعِهِمْ وَعَلَى أَبْصَارِهِمْ غِشَاوَةٌ وَلَهُمْ عَذَابٌ عَظِيمٌ" />
    <aya index="8" text="وَمِنَ النَّاسِ مَنْ يَقُولُ آمَنَّا بِاللَّهِ وَبِالْيَوْمِ الْآخِرِ وَمَا هُمْ بِمُؤْمِنِينَ" />
    <aya index="9" text="يُخَادِعُونَ اللَّهَ وَالَّذِينَ آمَنُوا وَمَا يَخْدَعُونَ إِلَّا أَنْفُسَهُمْ وَمَا يَشْعُرُونَ" />
    <aya index="10" text="فِي قُلُوبِهِمْ مَرَضٌ فَزَادَهُمُ اللَّهُ مَرَضًا وَلَهُمْ عَذَابٌ أَلِيمٌ بِمَا كَانُوا يَكْذِبُونَ" />
    <aya index="11" text="وَإِذَا قِيلَ لَهُمْ لَا تُفْسِدُوا فِي الْأَرْضِ قَالُوا إِنَّمَا نَحْنُ مُصْلِحُونَ" />
    <aya index="12" text="أَلَا إِنَّهُمْ هُمُ الْمُفْسِدُونَ وَلَكِنْ لَا يَشْعُرُونَ" />
</sura>

我的班级

class Sura {

var index: String? = null
var name: String? = null
var text: String? = null
var bismillah : String? = null


override fun toString(): String{
    return "Index = $index\n Name = $name\n Text = $text\n Bismillah = $bismillah"
 }
}

Xml 处理程序

class xmlPullHandler {
private val quran = ArrayList<Sura>()
private var quran1 : Sura? = null
private var text1 : String? = null

fun parse(inputStream: InputStream): List<Sura>{
    try {
        val factory = XmlPullParserFactory.newInstance()
        factory.isNamespaceAware = true
        val parser = factory.newPullParser()
        parser.setInput(inputStream, null)
        var eventType = parser.eventType
        while (eventType != XmlPullParser.START_DOCUMENT){
            var tagName = parser.name
            when (eventType){
                XmlPullParser.START_TAG -> if (tagName.equals("quran1", ignoreCase = true)){
                    quran1 = Sura()
                }
                XmlPullParser.TEXT -> text1 = parser.text
                XmlPullParser.END_TAG -> if (tagName.equals("quran1", ignoreCase = true)){
                    quran1?.let { quran.add(it) }
                }else if (tagName.equals("index", ignoreCase = true)){
                    quran1!!.index = text1
                }else if (tagName.equals("name", ignoreCase = true)){
                    quran1!!.name = text1
                }else if (tagName.equals("text", ignoreCase = true)){
                    quran1!!.text = text1
                }else if (tagName.equals("bismillah", ignoreCase = true)){
                    quran1!!.bismillah = text1
                }
                else ->{

                }
            }
            eventType = parser.next()
        }
    }catch (e: XmlPullParserException){
        e.printStackTrace()
    }catch (e: IOException){
        e.printStackTrace()
    }
    return quran
}
}

我的 Recycler 视图适配器

class SuraAdabters (private var quran: MutableList<Sura> ):RecyclerView.Adapter<SuraAdabters.SuraHolder>() {

private var quran1 : Sura? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuraHolder {
    val view = LayoutInflater.from(parent.context)
        .inflate(R.layout.quranlayouts, parent , false)
    return SuraHolder(view)
}


override fun getItemCount(): Int = quran.size


override fun onBindViewHolder(holder: SuraHolder, position: Int) {
  quran[position]
    var  text = holder.itemView.findViewById<TextView>(R.id.QuranText)


}
class SuraHolder(itemview: View):RecyclerView.ViewHolder(itemview){

 }
}

我的碎片,包含 rcycler

class guranFragments : Fragment() {
var quran = arrayListOf<Sura>()
private lateinit var myAdapter: SuraAdabters

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_guran_fragments, container, false)


}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    myAdapter = SuraAdabters(quran)

    SuraRecycler.layoutManager = LinearLayoutManager(this.context)
    SuraRecycler.addItemDecoration(DividerItemDecoration(this.context, OrientationHelper.VERTICAL))
    SuraRecycler.adapter = myAdapter

        try {
            val parser = xmlPullHandler()
            val assets = context!!.assets.open("quran.xml")
               parser.parse(assets)

             myAdapter = SuraAdabters(quran)

        }catch (io: IOException){
            io.printStackTrace()
        }
}

这是我希望数据以这种格式显示的回收器视图的 xml 样式

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <TextView
        android:id="@+id/QuranText"
        android:textAlignment="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello"
        android:textSize="40sp" />

    <TextView
        android:id="@+id/textaya"
        android:text="Hello"
        android:textSize="40sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


<LinearLayout
    android:id="@+id/linearLayout2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="bottom"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent">

    <TextView
        android:id="@+id/pageNumber"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Hello"
        android:textSize="40sp" />
</LinearLayout>

个人电脑请帮助我使用 kotlin,因为我不懂 Java 或除 kotlin 之外的任何其他语言

我几乎尝试了所有方法,但 xml 数据没有出现在我的应用程序中 请帮助并提前感谢...

【问题讨论】:

  • 添加堆栈跟踪
  • 堆栈跟踪是什么意思?
  • ctrl+6 记录错误
  • 你的错误是什么?
  • 我要复制logcat中的所有错误吗?

标签: android xml android-studio kotlin android-recyclerview


【解决方案1】:

您需要将解析函数返回的元素放入与您的adapter关联的ArrayList,然后通知adapter您的数据集已更改

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    myAdapter = SuraAdabters(quran)

    SuraRecycler.layoutManager = LinearLayoutManager(this.context)
    SuraRecycler.addItemDecoration(DividerItemDecoration(this.context, OrientationHelper.VERTICAL))
    SuraRecycler.adapter = myAdapter

        try {
            val parser = xmlPullHandler()
            val assets = context!!.assets.open("quran.xml")
            val parsedAssets = parser.parse(assets)
            quran.addAll(parsedAssets)
            myAdapter.notifyDatasetChanged()
        } catch (io: IOException){
            io.printStackTrace()
        }
}

【讨论】:

  • 我是否需要将代码放在回收站视图中,以便以与我在回收站 xml 中创建的相同样式显示数据?
  • 我不明白你,澄清这一点
  • 如你所知,recyclerview 需要一个 xml 文件来设置它的样式,我在上面的问题中有这个 xml,它有 textviews 和 ids .. 我需要把你的代码放在 recycler 类中吗?它会按照我需要的方式工作吗?
  • recyclerview 的样式与您提供的xml 没有任何共同之处。您提供的 xml 是一个可能的适配器布局,您应该在适配器中设置它
  • 我不起作用,但我认为问题出在 recyclerview 和 xml 布局上,所以请您快速查看一下我的回收器类和 xml 布局,以检查我是否犯了错误那里?
猜你喜欢
  • 2021-10-23
  • 2019-04-22
  • 1970-01-01
  • 2014-08-17
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多