Как прикрепить файл xml в утилите просмотра с помощью kotlin? - PullRequest
1 голос
/ 15 апреля 2020

, поэтому я пытаюсь реализовать файл xml, который я взял из проекта с открытым исходным кодом, и прикрепить его к представлению переработчика, и когда я делаю это, у меня происходит сбой эфира приложения или он не показывает файл 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>

P. c. Пожалуйста, помогите мне с kotlin только потому, что я не понимаю Java или любой другой язык, кроме kotlin

Я почти все испробовал, но данные xml не появляются в моем приложении, пожалуйста помогите и заранее спасибо ...

1 Ответ

1 голос
/ 15 апреля 2020

Вам необходимо поместить элементы, возвращаемые вашей функцией синтаксического анализа, в ArrayList, связанный с вашим adapter, а затем уведомить 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()
        }
}
...