Search Frag
package com.example.madcamp_week2 import FavoriteAdapter import android.R import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import com.example.madcamp_week2.databinding.FragmentStockDetailBinding import com.example.madcamp_week2.databinding.FragmetStockSearchBinding import com.jjoe64.graphview.series.DataPoint import com.jjoe64.graphview.series.LineGraphSeries class StockSearchFragment: Fragment() { private var _binding: FragmetStockSearchBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmetStockSearchBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val searchAdapter = StockDataHolder .stockList?.let{ArrayAdapter(requireContext(), R.layout.simple_list_item_1, it)} binding.stockSearchSearchInputACTV.setAdapter(searchAdapter) binding.stockSearchSearchInputACTV.setOnItemClickListener { adapterView, view, i, l -> val selectedStock = adapterView.getItemAtPosition(i) as Stock openStockDetailFragment(selectedStock) } // Initialize RecyclerView with LinearLayoutManager binding.stockSearchFavoriteRV.layoutManager = LinearLayoutManager(requireContext()) // Get favorite list from FavoriteHolder val favoriteList = FavoriteHolder.favoriteList // Create adapter and set it to RecyclerView val adapter = FavoriteAdapter(favoriteList) binding.stockSearchFavoriteRV.adapter = adapter } private fun openStockDetailFragment(stock: Stock) { val stockDetailFragment = StockDetailFragment().apply { arguments = Bundle().apply { putString("STOCK_ID", stock.id) putString("STOCK_NAME", stock.name) } } parentFragmentManager.beginTransaction() .replace(com.example.madcamp_week2.R.id.blank_container, stockDetailFragment) .addToBackStack(null) .commit() } }
Detail Frag
package com.example.madcamp_week2 import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.example.madcamp_week2.databinding.FragmentStockDetailBinding import com.jjoe64.graphview.DefaultLabelFormatter import com.jjoe64.graphview.GraphView import com.jjoe64.graphview.series.DataPoint import com.jjoe64.graphview.series.LineGraphSeries import java.text.SimpleDateFormat import java.util.Date class StockDetailFragment: Fragment() { private var _binding: FragmentStockDetailBinding? = null private val binding get() = _binding!! private var stockDataSeries = LineGraphSeries<DataPoint>() private lateinit var stockId: String private lateinit var stockName:String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { stockId = it.getString("STOCK_ID").toString() stockName = it.getString("STOCK_NAME").toString() } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentStockDetailBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.stockFavoriteBT.setOnClickListener { FavoriteHolder.addFavorite(stockId) } reloadGraph(binding.stockDetailGraphGV, 'D') } private fun reloadGraph(graph: GraphView, period: Char){ val dateFormat = SimpleDateFormat("yyyymmdd") val currentDate = dateFormat.format(Date()) var dailyStockJson = getHistoryData(stockId, "20160101", "20240706", 'D') var dailyStockData = dailyStockJson?.let { parseHistoryData(it) } dailyStockData = dailyStockData?.reversed() if (dailyStockData != null) { addStockDataToGraph(graph, dailyStockData) formatGraphLabel(graph, dailyStockData) } } private fun addStockDataToGraph(graph: GraphView, stockDatas:List<stockData>){ val maxDataPoints = stockDatas.size var dayCount = 0.0 for (stockData in stockDatas) { val x = dayCount dayCount += 1.0 val y = stockData.stck_clpr stockDataSeries.appendData(DataPoint(x, y), false, maxDataPoints) } graph.addSeries(stockDataSeries) } private fun formatGraphLabel(graph: GraphView, stockDatas: List<stockData>){ graph.gridLabelRenderer.labelFormatter = object : DefaultLabelFormatter() { override fun formatLabel(value: Double, isValueX: Boolean): String { return if (isValueX) { // show normal x values val index = value.toInt() stockDatas[index].stck_bsop_date ?: "00000000" } else { // show currency for y values super.formatLabel(value, isValueX) + "원" } } } graph.gridLabelRenderer.setHorizontalLabelsAngle(150) graph.viewport.isScrollable = true graph.viewport.setXAxisBoundsManual(true) graph.viewport.setMinX(50.0) graph.viewport.setMaxX(99.0) } override fun onDestroyView() { super.onDestroyView() _binding = null } }
Holder
object FavoriteHolder { private val _favoriteList: MutableSet<String> = mutableSetOf() val favoriteList: List<String> get() = _favoriteList.toList() fun addFavorite(stockId: String) { _favoriteList.add(stockId) } }
Adapter
import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.cardview.widget.CardView import androidx.recyclerview.widget.RecyclerView import com.example.madcamp_week2.R class FavoriteAdapter(private var itemList: List<String>) : RecyclerView.Adapter<FavoriteAdapter.Holder>() { interface OnItemClickListener { fun onCardViewClick(view: View, favoriteItem: String, pos: Int) } private var listener: OnItemClickListener? = null fun setOnItemClickListener(listener: OnItemClickListener) { this.listener = listener } fun updateFavoriteList(newFavoriteList: List<String>) { itemList = newFavoriteList notifyDataSetChanged() } fun addFavoriteItem(favoriteItem: String) { itemList = itemList + favoriteItem notifyItemInserted(itemList.size - 1) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { val view = LayoutInflater.from(parent.context).inflate(R.layout.favorite_list, parent, false) return Holder(view) } override fun getItemCount(): Int { return itemList.size } override fun onBindViewHolder(holder: Holder, position: Int) { val favoriteItem = itemList[position] holder.bind(favoriteItem, position + 1) } inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val favoriteName: TextView = itemView.findViewById(R.id.favorite_name_TV) private val cardView: CardView = itemView.findViewById(R.id.favorite_view_CV) fun bind(favoriteItem: String, position: Int) { favoriteName.text = favoriteItem cardView.setOnClickListener { listener?.onCardViewClick(itemView, favoriteItem, adapterPosition) } } } }
// Get favorite list from FavoriteHolder val favoriteList = FavoriteHolder.favoriteList // Create adapter and set it to RecyclerView val adapter = FavoriteAdapter(favoriteList) binding.stockSearchFavoriteRV.adapter = adapter
: 이 부분이 핵심이었는 듯…
로그인 이미 했으면 데이터 추가 X
JSON 파일 만들어서 서버 전송 성공하기
JSON 파일 읽어오기 예시
// 읽어오기 예시 val favoriteList = FileHelper.loadFavoriteList(requireContext()) // Create adapter and set it to RecyclerView val adapter = FavoriteAdapter(favoriteList) binding.stockSearchFavoriteRV.adapter = adapter adapter.setOnItemClickListener(object : FavoriteAdapter.OnItemClickListener { override fun onCardViewClick(view: View, favoriteItem: String, pos: Int) { showDialog(favoriteItem) } })
