اذهب إلى المحتوى
  • 0

أضافة أشعارات الى تطبيق عند أضافة child جديد الى Firebase

عبدالرحمن العنزي4

السؤال

السلام عليكم ورحمة الله وبركاته, أنا لدي تطبيق مربوط على Fire Base ويتم سحب البيانات الى recycler-view موجودة في صفحة من fragment وكل ما أضغط على رقم معين يتم أرسالي الى fragment اخرى لأكمال بقية الخبر وبحمد الله التطبيق يعمل بشكل جيد, لكن الأن أنا اريد أضافة أشعار الى التطبيق كل ما أريد أن أضيف child ومعلوماتة الى fire base وأريد ان أسحب فقط العنوان و ملخص الخبر وأضافتهم الى الاشعار وأريد أيضا كل ما أضغط على أشعار معين يتم ارسالى الى fragment الخبر وليس الصفحة التي يتواجد بها recycler-view !!. هل هناك طريقة معينه لتنفيذ هذه الفكرة؟ علما بأني جربت طريقتي لكن الاشعار وحدة من يظهر بدون العنوان او الملخص وايضا ولا يتم فتح البرنامج عند الضغط على الاشعار؟

الذي أريدة هو :

  1. أشعار في كل وقت أضيف فيه child جديد الى fire base  يحتوي على title و description ويتم أرسالة مباشرة
  2. كل ما يتم الضغط على الاشعار يتم توجيه المستخدم الى صفحة الخبر 

ملاحظة : أنا أستخدم navigation graph في التنقل بين الملفات و save args في نقل البيانات

- تستطيع استخدام java او kotlin ان أردت

 

 class MyApp 

class MyApp() : Application() {
    val n_ID_Channel = "أشعار اخر الأخبار"
    override fun onCreate() {
        super.onCreate()

      
        createNotificationChannel()
    }

    fun createNotificationChannel(){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val channel_name = "أشعار صفحة الأخبار"
            val description_text = "القسم الخاص لأشعارات صفحة الأخبار"

            val name = channel_name
            val text = description_text
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel = NotificationChannel(n_ID_Channel, name, importance).apply {
                description = text
            }
            val notificationManager : NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

            notificationManager.createNotificationChannel(channel)
        }
    }

}

 

LatestNewsFragment

 


class LatestNewsFragment : Fragment() {

    private lateinit var news_list: ArrayList<NewsListViewModel>
    private lateinit var mRef: DatabaseReference
    private lateinit var recyclerView: RecyclerView
    private lateinit var progress : ProgressBar
    private lateinit var layout : LinearLayout

    private lateinit var pendingIntent: PendingIntent


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

        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)



        recyclerView = view.findViewById<RecyclerView>(R.id.newsList)
        recyclerView.layoutManager = LinearLayoutManager(
            context,
            LinearLayoutManager.VERTICAL,
            false
        )

        news_list = arrayListOf<NewsListViewModel>()

        progress = view.findViewById(R.id.progress_news)
        layout = view.findViewById(R.id.progress_layout)
    }

    override fun onStart() {
        realTimeNewsDataBase(requireView())
        val refresh = view?.findViewById<SwipeRefreshLayout>(R.id.refresh_layout)

        refresh?.setOnRefreshListener(object : SwipeRefreshLayout.OnRefreshListener {

            override fun onRefresh() {
                realTimeNewsDataBase(requireView())
                refresh.isRefreshing = false
            }

        })

        super.onStart()

    }

    fun realTimeNewsDataBase(view: View) {
        progress.visibility = View.VISIBLE
        val data_base = FirebaseDatabase.getInstance()
        mRef = data_base.getReference("LatestNews")

        mRef.addValueEventListener(object : ValueEventListener {

            override fun onDataChange(snapshot: DataSnapshot) {
                news_list.clear()

                if (snapshot.exists()) {
                    for (list in snapshot.children) {
                        var data = list.getValue(NewsListViewModel::class.java)
                        news_list.add(0,data!!)

                        progress.visibility = View.GONE
                    }
                    val adapter = NewsListAdapter(
                        requireContext(),
                        news_list, view
                    )
                    recyclerView.adapter = adapter
                }
            }


            override fun onCancelled(error: DatabaseError) {
                Log.w(TAG, "onCancelled", error.toException())
                Toast.makeText(context, "${error.message}", Toast.LENGTH_SHORT).show()
                progress.visibility = View.GONE
            }

        })
        mRef.addChildEventListener(object : ChildEventListener{

            override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
              
              // من المفترض هنا يتم ارسال الاشعار الى التطبيق عند اضافة بيانات جديدة
                val data = NewsListViewModel()

                N_NotifictionData(data.title, data.desc)
            }


            override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
                Toast.makeText(context, "${previousChildName} was changed", Toast.LENGTH_SHORT).show()
            }


            override fun onChildRemoved(snapshot: DataSnapshot) {
                Toast.makeText(context, "$snapshot was removed", Toast.LENGTH_SHORT).show()
            }


            override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
                Toast.makeText(context, "${previousChildName} was moved", Toast.LENGTH_SHORT).show()
            }


            override fun onCancelled(error: DatabaseError) {
                Toast.makeText(context, "${error.message} was changed", Toast.LENGTH_SHORT).show()
            }

        })
    }
    fun N_NotifictionData( title : String? = null, desc : String? = null){
        val i = Intent(requireContext(), NewsDetailFragment :: class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
         pendingIntent = PendingIntent.getActivity(requireContext(), 0, i, 0)

        val builder = NotificationCompat.Builder(requireContext(), MyApp().n_ID_Channel)
            .setSmallIcon(R.drawable.ic_email)
            .setContentTitle(title)
            .setContentText(desc)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setDefaults(NotificationCompat.DEFAULT_ALL)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)

        with(NotificationManagerCompat.from(requireContext())){
            notify(1, builder.build())
        }
    }



}

 

NewsDetailsFragment 

 

package com.gazelle.wadifatk.newsList

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.navigation.fragment.navArgs
import com.bumptech.glide.Glide
import com.gazelle.wadifatk.OverLoad
import com.gazelle.wadifatk.R
import com.klinker.android.link_builder.Link
import com.klinker.android.link_builder.applyLinks
import java.text.DateFormat
import java.util.*

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER

class NewsDetailFragment : Fragment() {

    val args: NewsDetailFragmentArgs by navArgs()
    private lateinit var overLoad : OverLoad
    private lateinit var share : ImageView
    
   
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_news_detail, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        overLoad = OverLoad(requireContext())

        val text = view.findViewById<TextView>(R.id.information_text)
        val image = view.findViewById<ImageView>(R.id.image_view)
        val title = view.findViewById<TextView>(R.id.title_news)
        val date = view.findViewById<TextView>(R.id.date_news)
        val type = view.findViewById<TextView>(R.id.type_news)
        val desc = view.findViewById<TextView>(R.id.desc_news)
        val details = view.findViewById<TextView>(R.id.news_details)
        share = view.findViewById(R.id.share_N)

        val image1 = args.newsDataList.image
        Glide.with(view)
            .load(image1)
            .into(image)
        val title1 = args.newsDataList.title
        title.text = "" + title1

        val date1 = args.newsDataList.date
        date.text = "" + date1
        val type1 = args.newsDataList.type
        type.text = type1
        val desc1 = args.newsDataList.desc
        desc.text = desc1
        val details1 = args.newsDataList.details
        details.text = details1

     
    }

  
}

وهذه صورة للأشعار 

 

 

WhatsApp Image 2021-12-10 at 4.44.42 PM.jpeg

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

لا توجد أي إجابات على هذا السؤال بعد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...