리사이클러뷰 안의 아이템과 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)
}
}
대충 이럴 것 같아요. 데이터 타입이 중요한데, 실제 저장될 값을 가지도록 설계하세요. 숫자를 입력받으실 거니까 숫자데이터들이 클래스 필드에 존재해야 되겠죠.