마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트에 보여주고 싶은 데이터를 어떻게 보내야 하나요?

0 추천
package org.techtown.mycal.FR;

import static org.techtown.mycal.Load.loadList;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.icu.text.NumberFormat;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.recyclerview.widget.RecyclerView;

import org.techtown.mycal.R;

public class Fr1RecyclerViewAdapter extends RecyclerView.Adapter<Fr1RecyclerViewHolder> {
    private String[] title = {"주당순자산 =", "주가수익률 =", "주가순자산배수 =", "주가현금흐름배수 =",
            "주당순이익 =", "주당세전주가가치 ="};
    private String[] title1 = {"(BPS)", "(PER) ", "(PBR) ", "(PCR) ",
            "(EPS)", "(EV/EBITDA)"};
    private String[] Value1 = {"순자산", "매출액", "시가총액", "주가", "순이익", "기업가치"};
    private String[] Value2 = {"주식", "자기자본", "자본총계", "주당영업현금흐름", "보통주발행수", "세전영업이익"};
    @Override
    public Fr1RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fr1_recycler, parent, false);

        return new Fr1RecyclerViewHolder(itemView);

    }

    @Override
    public void onBindViewHolder(Fr1RecyclerViewHolder holder, int position) {
        holder.textView.setText(title[position]);
        holder.textView1.setText(title1[position]);
        holder.value1.setHint(Value1[position]);
        holder.value2.setHint(Value2[position]);
    }

    @Override
    public int getItemCount() {
        return title.length;
    }
}

class Fr1RecyclerViewHolder extends RecyclerView.ViewHolder { ... }

 

 

fr1_recycler.xml

제가 배운 방식은 이렇게 틀을 만들어 textView에 배열로 만들어놓은 이름을 틀에 넣어서 아래 그림같은 창이 여러개 만들어지도록 리사이클러뷰를 만들었습니다. 그리고 LongClick리스너를 해서 저장을 누르면 이 틀과 안에 있는 것들을 그대로 즐겨찾기라는 창에 저장을 하고싶은데 앞에서 말씀하신 것처럼 리스트에 데이터를 가져오라고 하셨는데 찾아봤는데 제가 하려고 한 방법은 나오지가 않습니다..

이 틀과 틀안에 있는 EditText와 TextView를 한꺼번에 가져오려면 어떤 데이터를 입력받아서 저장을 해야할지를 모르겠습니다.

안드로이드독학 (290 포인트) 님이 2021년 8월 9일 질문

1개의 답변

+1 추천
 
채택된 답변

리사이클러뷰 안의 아이템과 interaction 이 필요하시면 Adapter에 해당 처리를 할 수 있는 리스너를 다셔야 해요. TextWatcher는 EditText 에 글자를 입력할 때 마다 발생하는 이벤트를 처리할 수 있고, View.LongClickListener는 LongClick 이벤트를 캡쳐해줍니다. 아마 계산식을 입력할 때 결과를 보여주려면 TextWatcher를 사용하시면 될 것 같구요. 저장기능은 LongClickListener를 다시면 될 것 같구요.  가장 핵심적인 부분만 설명드리면,

// 클래스 이름은 용도에 맞는 적절한 이름을 사용하세요.
public abtract class ListItem {
    private final String label1;
    private final String label2;
    private final String hint1;
    private final String hint2;

    protected double value1;  //정확한 계산이 필요하면 BigDecimal사용.
    protected double value2;
    //생성자, getters, setters. 생략

    public abstract double calcuate();
}

// 계산 공식이 아이템 종류에 따라 다르다면 ListItem 클래스를 용도에 맞게 상속받아 사용하셔야 해요. 아니면 그냥 ListItem클래스만 사용하시면 될듯.
public class BPS extends ListItem {
   @Override 
   public double calcuate() {
       // value1과 value2 를 이용한 계산공식
   }
}

public class PER extends ListItem {
  ...
}

public class PBR extends ListItem {
  ...
}

public class PCR extends ListItem {
  ...
}


public class Fr1RecyclerViewAdapter extends RecyclerView.Adapter<...>  {

    interface Listener {
          void itemLongClicked(ListItem item);
    }

    private List<ListItem> items = new ArrayList<>();
    public void setItems(List<ListItem> items) {
         this.items = items;
         notifyDatasetChanged();
    }

    private Listener listener;
    public void setLisetener(Listener listener) {
       this.listener.= listener;
    }

    @Override
    public int getItemCount() {
        return items.size;
    }

    public ListItem getItem(int position) {
         return items.get(position);
    }

    public void setItemLognClickListener(View.OnLongClickListener longClickListener) {
          this.itemLognClickListener = itemLognClickListener;
    }

   @Override
    public void onBindViewHolder(Fr1RecyclerViewHolder holder, int position) {
        ListItem item = getItem(position);
        holder.bind(item);
        holder.itemView.setLongClickListener(new View.OnLongClickListener() {
              @Override
              public boolean onLongClick(View v) {
                    if (listener != null) {
                          listener.itemLongClicked(item);
                          return true;
                    }
                    return false;
              }
        });

        // holder.value1와 holder.value2가 하는 일 동일하면 TextWatcher를 하나만 생성해서 공유.
       // TextWatcher 의 로직을 Listener 에 메소드를 추가해 전달할 수도 있음.
       holder.value1. addTextChangedListener(new TextWatcher() {
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
                    // 입력에 따른 처리. 예외 처리 반드시 할 것.
                    compute(item);
              }
             // 나머지 사용하지 않으므로 생략
        });

        holder.value2 addTextChangedListener(new TextWatcher() {
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
                    compute(item);
              }
              // 나머지 메소드는 생략
        });

        private void compute(ListItem item) {
               double value1 = Double.parsetDouble(holder.value1.getText().toString());
               double value2 = Double.parsetDouble(holder.value2.getText().toString());
               item.setValue1(value1);
               item.setValue2(value2);
               item.calcuate(); 
               //리턴값이 필요하면 추가.
        }
    }
}

//ViewHolder

public void bind(ListItem item) {
    textView.setText(item.getLabel1());
    textView1.setText(item.getLabel2());
    value1.setHint(item.getHint1());
    value2.setHint(item.getHint2());

    //리스트를 불러올 때 이미 입력된 값이 있다면 아래처럼 세팅을 해야할텐데, 이렇게 하시려면 
    //이미 저장된 아이템인지 아닌지에 대한 추가정보가 필요합니다. ListItem 에 Id같은 필드를 추가해서
    //저장할 때 할당한다든지, value를 Double타입으로 만들고 기본값을 null로 주던지, 아니면 boolean 값을 하나둬서 이미 저장된 것인지 아닌지 처리하시면 됩니다.
    //그리고 TextWatcher 이벤트가 자동으로 호출될 수 있기 때문에 이에 대한 처리가 필요합니다. 
    //경우에 따라서는 TextWatcher대신에 View.onFocuchangedListener를 사용할 수도 있습니다.
    value1.setText(String.valueOf(item.getValue1()));
    value2.setText(String.valueOf(item.getValue1()));
}

//Activity
// 아이템 생성. 아이템별로 계산식이 똑 같다면 그냥 ListItem을 사용하시면 됩니다.
recyclerAdapter.setItems(
   Arrays.asList(
       new BPS("주당순자산", "BPS", "순자산", "주식"),
       new PER("주가수익률", "PER", "매출액", "자기자본"),
       new PBR("주가순자산배수", "PBR", "시가총액", "자본총계"),
...
   )
)

private ListItemHelper listItemHelper = new ListItemHelper();
recyclerAdapter.setListener(
    new Fr1RecyclerViewAdapter.Listener() {
         @Override
          public itemLongClicked(ListItem item) {
                  listItemHelper.save(item);
          }
    }
);

public class ListItemHelper {
     public void save(ListItem item) {
         // TODO : 아이템 저장 (파일 또는 Database)
     }
}

 

대충 이럴 것 같아요. 데이터 타입이 중요한데, 실제 저장될 값을 가지도록 설계하세요. 숫자를 입력받으실 거니까 숫자데이터들이 클래스 필드에 존재해야 되겠죠.

spark (226,380 포인트) 님이 2021년 8월 9일 답변
안드로이드독학님이 2021년 8월 10일 채택됨
저장을 한다는게 즐겨찾기창(xml)에다가 추가한다는 말이었는데 제가 헷갈리게 말을 했네요
그렇게 하시려면 먼저 저장을 하셔야겠죠. 그런 다음 즐겨찾기 화면에서 저장된 데이터를 불러오면 됩니다.
...