チームプロジェクトの3番目のコードコメント(作成者-2)


前回の記事に続いて、コードの説明を続けます.

CSFragment


CSFragmentは、顧客センターでよくクエリーされる内容を収集し、ユーザーに表示する画面で、電話や電子メールで顧客センターに連絡する前に検索中のクエリーがあることを確認します.
この画面の領域にはViewPager 2が含まれています.ViewPagerについて簡単に説明します.

ViewPager


:スクリーンスライドにアニメーションを自動的に適用できるオブジェクト.
1画面の範囲内の部分で画面を左右または上下に切り替えることができる.

下の動画のように、左右にアニメーション動作をします.
これらのViewPager 2にRecyclerViewを作成してデータを入力すると、一般的に多くの出前プラットフォームを使用しているホテルを見学する際に、ホテル種別を変更するためにタッチで移動することもあるが、ホテルリストを横に移動してホテル種別を変更することもある.ViewPager 2は、これらの動作を完了するのに役立ちます.
ViewPager 2コードの表示:
private lateinit var viewAdapter : HomeListFragmentPagerAdapter

if (::viewAdapter.isInitialized.not()) { 
            val csCategory = CSCategory.values() 

            val CSListfragmnet = csCategory.map {
                CSListFragment.newInstance(it)
            }

            viewPagerCs.adapter = HomeListFragmentPagerAdapter(
                this@CSFragment,
                CSListfragmnet
            )
        }
        viewPagerCs.offscreenPageLimit = 1
ViewAdapterが初期化されていない場合、csCategory値を受信し、mapを介してデータを注入します.ここにCSListFragmentがありますが、このFragmentは後で説明しますが、この部分ではRecyclerViewが作成され、アダプタとしてViewPager 2に入れられます.
上のコードが正常に動作している場合

次の画像のようにデータを出力します.現在の画像の画像は、機能中心で実現されているコード化部分であり、UI上の不安定さがある.上のクライアント中心部分と下のCircle ButtonはCSFragmentの画面であり、中間の使い方部分はCSListFragmentからRecyclerViewを受信し、ViewPager 2アダプタで挿入した部分である.

このセクションの質問


ViewPager 2の場合は、ViewGroupを継承してRecyclerViewを作成できますが、元のViewPager 2には適していません.また、既存のプロパティに基づいて、メモリに左右のビューを作成する必要がありますが、これは効率的ではありません.このように開発したのは当初想定していた制作においても変更があったためであるが,これではCS部分単独のRecyclerAdapterが必要となる.
既存のコードを再利用し、クラスを減らすために、この方法を使用して実装しましたが、他のチームメンバーから見れば、この部分はかえって効率的ではない可能性があります.そこで、まずViewPager 2のメモリ部分についてもっと多くの資料を集めて比較して、単独のAdapterで純RecyclerViewを生成するか、それとも今方法を堅持するかを考えたいと思います.

CSListFragment


次に、CSFragmentにRecyclerViewを送信するCSListFragmentを示します.このセクションでは、Adapterという変数にデータを入れ、CSFragmentに統合します.CSListFragmentは任意の配置値のデータを表示する必要があるため、CSListViewModelというViewModelが存在し、ViewModelを受信すると、以下のようにViewModelを継承する.
private val viewModel by viewModel<CSListViewModel> {
        parametersOf(csCategory)
    }
private val csCategory by lazy {
        arguments?.getSerializable(CS_CATEGORY_KEY) as CSCategory
    }
CScategoryとして格納されたデータを受信するために、CScategoryをパラメータとして定義し、ViewModelからデータを受信する.
また、ここには、
private val resourcesProvider by inject<ResoucesProvider>()
ResourceProviderという名前のコードが注入されています.これはCSデータではなく、ホーム部分にデータを出力するためのデータスタイルです.ModelRecyclerAdapterは、H o m e ListFragmentPagerAdapterとともに使用されていますが、実際には無効になっていますが、適用されています.
次はRecycleViewです.アダプタのAdapterセクションに適用します.
   private val adapter by lazy {
        ModelRecyclerAdapter<CSModel, CSListViewModel>(
            listOf(), viewModel, resourcesProvider,
            object : CSModelListener {
                override fun onClickItem(listModel: CSModel) {
                    val data = ImageData(listModel.csTitle, listModel.csContent, listModel.csAuthor)
                    val bundle = Bundle()
                    bundle.putParcelable("data", data)
                    view?.let { it1 ->
                        Navigation.findNavController(it1)
                  .navigate(R.id.action_CSFragment_to_CSDetailFragment, bundle)
                    }
Adapterに適切なモデルとViewModelを追加し、Listenerを作成し、ビューセクションをクリックしたときに操作するイベントを追加します.該当するモジュールデータをパッケージ化してBundelに入れるには、データをクリックします.そして動作時に一緒に入れてCSDetailFragmentで一緒に入れますCSDetailFragmentはデータを受信し、指定したフォーマットにデータを入れます.

ImageData


ここで、画像データは、シリアル化処理によりデータの伝送速度が向上し、システムオーバーヘッドが小さいため、よく用いられる.
コードの表示:
@Parcelize
data class ImageData(
    val csTitle : String,
    val csContent : String,
    val csAuthor: String,
) : Parcelable
変数のデータ型をStringとして指定し、Parcelableを継承します.

EmailFragment


EmailFragmentでは、カスタマーセンターで質問があった場合、Emailでコミュニケーションします.
 private fun sendEmail() {
        val emaildata = EmailData(
            "[email protected]",
           binding.titleEdit.text.toString(),
            binding.contentEdit.text.toString())
        val intent = Intent(Intent.ACTION_SENDTO)
            .apply {
                type = "text/plain"
                data = Uri.parse("mailto:")
                putExtra(Intent.EXTRA_EMAIL, arrayOf(emaildata.emailAddress))
                putExtra(Intent.EXTRA_SUBJECT, emaildata.title )
                putExtra(Intent.EXTRA_TEXT,  emaildata.content  )
            }
        if (emaildata.title =="" || emaildata.title == null || emaildata.content == "" ||  emaildata.content  == null) {
            Toast.makeText(context, "제목 또는 내용을 입력해주세요", Toast.LENGTH_SHORT).show()
        }
        else {
            startActivity(Intent.createChooser(intent, "Send Email"))
            backStack()
        }
    }
まず、EmailData Parcelableに送信するEメールアドレスとEditTextを接続します.
Android OS MailシステムGmailにEmailDataを統合します.各位置に適合
SUBJECT(タイトル)、TEXT(コンテンツ)を送信します.アクションにタイトルとコンテンツが作成されていない場合、アクションを実行せずにタイトルまたはコンテンツを作成するように要求されるToastメッセージが出力されます.条件が満たされている場合はIntentを実行します.こちらです.
backstack()メソッドは、バックグラウンドスタックにスタックされているため、動作が完了したら削除して、前の画面に戻ります.

これはコードによって実現されるEmail画像です.

CSDetailFragment


この分割は、公告内容等の詳細な文字を含む画面である.
コードが正しく表示されている場合
      val csData = arguments?.getParcelable<ImageData>("data")
        title.text = csData?.csTitle.toString()
        author.text = csData?.csAuthor.toString()
        content.text = csData?.csContent.toString()
CSFragmentは、Bundleにデータを送信し、各Bundleにデータを送信します.作成者またはタイトルの内容をデータで画面に表示します.

の最後の部分


これは私が書いた部分のコードコメントを説明します.次の文章は、私が書く過程で出会った問題と、これらの問題の解決方法、意外に解決した問題について書きます.長い文章を読んでくれてありがとう.