انشاء listview بشكل افقي وعمودي وكيفية اضافة Scrolling الى column في Kotlin Compose

كيفية إدارة التمرير في Jetpack Compose: تطبيق عملي مع ListView

كيفية إدارة التمرير في Jetpack Compose: تطبيق عملي مع ListView

في عالم تطوير تطبيقات الاندرويد ، تعتبر Jetpack Compose واحدة من أحدث وأقوى الأدوات لبناء وإنشاء تطبيقات Android بشكل سريع واداء عالي و في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء ListView أفقيًا وعموديًا وكيفية إضافة التمرير إلى الأعمدة في Jetpack Compose باستخدام Kotlin بشكل مبسط وتفصيلي .


ما هوJetpack Compose ؟

Jetpack Compose هي مكتبة حديثة من Google لبناء واجهات المستخدم في تطبيقات Android باستخدام لغة البرمجة Kotlin. يعتمد الإنشاء على مفهوم البرمجة التعريفية، حيث تصف الشكل الذي يجب أن تبدو عليه الواجهة، بدلاً من كيفية إنشائها خطوة بخطوة. وهذا يجعل التعليمات البرمجية أكثر قابلية للقراءة والصيانة.


شرح الكود لإنشاء ListView العمودي

val data = listOf("A", "B", "C", "D")

LazyColumn(
    modifier = Modifier.constrainAs(lazyColumn) {
        top.linkTo(text.bottom, margin = 16.dp)
        start.linkTo(parent.start)
        end.linkTo(parent.end)
        bottom.linkTo(parent.bottom)
    }
) {
    items(data) { item ->
        Text(text = item)
    }
}

شرح كود LazyColumn.

LazyColumn: أداة لعرض العناصر عموديًا.
العناصر(البيانات): يكرر قائمة من البيانات ويعرض كل عنصر باستخدام عنصر نصي.
Modifier.constrainAs: لتحديد قيود العمود، باستخدام ConstraintLayout لتحديد الموضع والحدود.

مزايا LazyColumn:

يحسن الأداء عن طريق تحميل العناصر عند التحويم فقط.
مناسب لعرض القوائم الطويلة.

LazyColumn: تُستخدم لعرض قائمة من العناصر بشكل عمودي. تعتبر LazyColumn أكثر كفاءة من Column عند التعامل مع قوائم كبيرة لأنها تقوم بتحميل العناصر فقط عندما تكون مرئية على الشاشة.
items(data): تقوم بإنشاء عنصر لكل عنصر في القائمة data.
Text(text = item): يعرض النص الخاص بكل عنصر في القائمة.

شرح الكود البرمجي لإضافة Scrolling إلى Column



Column (
    Modifier.constrainAs(lazyColumn) {
        top.linkTo(parent.top)
        start.linkTo(parent.start)
        end.linkTo(parent.end)
        bottom.linkTo(parent.bottom)
    }.verticalScroll(rememberScrollState()),
) {
    Text(text = "This is Test" ,
        Modifier
            .background(Color.Cyan)
            .padding(80.dp))
    Text(text = "This is Test" ,
        Modifier
            .background(Color.Blue)
            .padding(80.dp))
    Text(text = "This is Test" ,
        Modifier
            .background(Color.Cyan)
            .padding(80.dp))
    Text(text = "This is Test" ,
        Modifier
            .background(Color.Yellow)
            .padding(80.dp))
    Text(text = "This is Test" ,
        Modifier
            .background(Color.Cyan)
            .padding(80.dp))
}
Column: تُستخدم لعرض العناصر بشكل عمودي.
verticalScroll(rememberScrollState()): تُستخدم لإضافة إمكانية التمرير العمودي إلى Column.
Text: يعرض النص مع خلفية ملونة وحواف داخلية.

في بعض الأحيان يكون من الضروري إضافة التمرير إلى الأعمدة أو الصفوف من أجل عرض محتوى كبير في مساحة محدودة. في مثل هذه الحالات، استخدم التمرير الرأسي أو التمرير الأفقي.

العمود: يُستخدم لعرض العناصر عموديًا.
التمرير الرأسي: استخدم تذكر ScrollState لإضافة التمرير الرأسي إلى العمود والتحكم في حالة التمرير.
Modifier.background: يغير خلفية النص لكل عنصر.

مزايا إضافة التمرير
يسهل عرض كميات كبيرة من البيانات في مساحة محدودة.
يتيح التمرير للمستخدمين الوصول إلى المزيد من المحتوى.

إنشاء قوائم أفقية باستخدام LazyRow

مثل LazyColumn، يمكن أيضًا استخدام LazyRow لعرض القوائم أفقيًا.


  val data = listOf("A", "B", "C", "D")

LazyRow(
            modifier = Modifier.constrainAs(lazyColumn) {
                top.linkTo(text.bottom, margin = 16.dp)
                start.linkTo(parent.start)
                end.linkTo(parent.end)
                bottom.linkTo(parent.bottom)
            }
        ) {
            items(data) { item ->
                Text(text = item)
            }
        }

LazyRow: تُستخدم لعرض قائمة من العناصر بشكل أفقي. تعتبر LazyRow أكثر كفاءة من Row عند التعامل مع قوائم كبيرة لأنها تقوم بتحميل العناصر فقط عندما تكون مرئية على الشاشة.
items(data): تقوم بإنشاء عنصر لكل عنصر في القائمة data.
Text(text = item): يعرض النص الخاص بكل عنصر في القائمة.

مزايا LazyRow

مناسب لعرض المحتوى الأفقي مثل الصور أو العناصر متعددة الأبعاد.
LazyRow: يسمح بعرض العناصر أفقيًا، مما يؤدي إلى إنشاء قائمة أفقية.
يتم تحديد العناصر بنفس الطريقة كما في LazyColumn.

شرح الكود البرمجي لإنشاء ListView مع عناصر لزجة (Sticky Headers)

  LazyColumn(
    contentPadding = PaddingValues(vertical = 15.dp),
    verticalArrangement = Arrangement.spacedBy(10.dp),
    modifier = Modifier
        .fillMaxSize()
        .padding(paddingValues)
) {
    stickyHeader {
        Text("My Images")
    }
    item {
        10.spacerHeight()
        LazyRow(
            horizontalArrangement = Arrangement.spacedBy(10.dp)
        ) {
            items(count = state.backgrounds.size) { index ->
                val item = state.backgrounds[index]
                MyBackground(item = item)
            }
        }
    }
    stickyHeader {
        Text("My Backgrounds")
    }
    items(
        count = state.model.size, key = { state.model[it].text }) { index ->
        val item = state.model[index]
        MyCard(item = item, onClick = { onClick(item) })
    }
}
  


stickyHeader: تُستخدم لإضافة عناصر لزجة (Sticky Headers) تبقى ثابتة في الجزء العلوي من الشاشة أثناء التمرير.
LazyRow: تُستخدم لعرض قائمة من العناصر بشكل أفقي داخل LazyColumn.
MyBackground و MyCard: هما مكونات قابلة للتركيب (Composable Functions) مسؤولة عن عرض الخلفيات والبطاقات.

في الكود السابق تم ادراج LazyColumn بشكل كامل على مستوى الصفحه وبداخله item يوجد بداخله LazyRow لعمل list بشكل افقي حتى يصبح لدينا اكث من قائمه في نفس الصفحه
تم استخدام stickyHeader لعمل نص مثبت بحيث يتغير النص عندما يظهر النص الاخر الموازي له وهذا اذا كان لديك اكثر من قائمه

يُعد LazyColumn وLazyRow أداتين قويتين في Jetpack Compose اللتين تتيحان عرض القوائم بكفاءة وأداء عالٍ. باستخدام هذه الأدوات، يمكنك إنشاء واجهات مستخدم مرنة وسلسة مع تحسين تجربة المستخدم. سواء أكانت القوائم أفقية أم رأسية، يقدم Jetpack Compose الحل الأمثل.


كيفية تحسين الكود ليكون أكثر كفاءة؟

إعادة استخدام المكونات: يمكن تحويل MyBackground و MyCard إلى مكونات قابلة لإعادة الاستخدام.
إضافة وحدة اختبار: كتابة اختبارات لوظائف LazyColumn و LazyRow.
تحسين الأداء: استخدام remember و mutableStateOf بشكل صحيح لضمان إعادة الرسم فقط عند الحاجة.

تعليقات