티스토리 뷰
내 스타일 콜백 메소드 정의
Call 과 CallBack 개념
일반적으로 사용자가 시스템에 임의의 서비스를 호출하는 것을 call 이라고 한다 (보편적)
이런 보변적인 방법과 달리 시스템 측에서 이벤트를 발생시켜 이에 대한 처리를 해달라고 요청해오는 과정
이 있기 때문에 콜백이라고 한다.
즉 사용자가 시스템에게 무엇을 처리해 달라고 요청하면 콜
시스템이 사용자가 요청한 처리를 하다가 다른것도 처리해달라고 요청 하면 콜백이라 생각하면 될 것 같다.
콜백함수 사용 목적
특정 조건을 만족할때 어떤 행위를 일으켜야 할때,
행위의 주체가 되어서 특정 조건을 만족하는지 안하는지를 계속 체크 한다
특정 조건이 주체가 되어 조건 만족시 다른 행위에게 작업을 요청 한다.
예시 ) 어댑터안에 존재하는 레이아웃 높이를 해상도별로 가져온 후 그 높이 값을 플래그먼에 특정 레아아웃 객체로 전달해서
높이를 변경 해줘야 된다고 생각해 보자
사진은 플래그먼트 안에 존재하는 리싸이클 뷰에 정의된 레이아웃 아이템들이 들어 가는 구조 이다.
: 로직 흐름
사진에 보이지는 않지만 3번째 토클 버튼이 활성화 되면 아이템 추가 버튼이 생성 되어 2번째 사진에 보이는 아이템들이 동적으로
추가 되는 구조 일때
리싸이클 뷰의 영역 크기는 고정이라 영역 이상에 아이템들이 들어 오게 되면 리싸이클 뷰 자체 스크롤이 생겨서 아래로
아이템이 쌓이게 되지만 기본적으로는 영역 이상에 아이템을이 새로 생성이 되더라도 사용자는 새로 생성되었는지 알수
없게 된다.(스크롤을 내려야 확인 할 수 있다) 여기서 새로 생긴 영역에 포커스를 맞추고 알 수 있게 하거나 프래그먼트의
리싸이클 뷰 영역을 해당 아이템 높이 만큼 늘려 주어 스크롤 없이 바로 볼 수 있게 처리 할 수 있다. 여기서는 요청이
두번째 방법으로 선정 되어 작업 하게 되었다.
요청사항 및 제약사항이 더 있지만 너무 길어지기 때문에 패스하고 소스로 상황에 맞는 콜백 메소드를 구현해 보자 ...
- 프래그먼트에 add 버튼이 콜 되면 리싸이클 뷰 즉 어댑터 쪽에서 2번째 사진에 보이는 아이템을 추가 하고 이때 해상도별
높이 값, 어댑터에서 구할 수 있는 레이아웃에 높이 값을 다시 프래그먼트에 전달 해주어야 되는데 이 때 콜백 메소들 이용해서
처리 해야 한다.
프래그먼트 와 어댑터 에서 바라 볼 수 있는 인터페이스를 정의 하자
: 나는 보통 공통으로 사용하는 콜백 메소드가 아니라면 inner class 로 콜백을 일으키는 객체에 포함 시킨다.
( 상황에 맞게 콜백 메소드를 사용 하자... )
** 중요!! 여기 상황은 어댑터에서 콜백을 만들어야 되는 상황 **
어댑터 클래스 안에 인터페이스를 정의 해보자
class Adapter
public interface OnEditTextHeight {
void onEditTextHeight(int layoutHeight);
}
: 인자값은 해당 아이템 뷰에 레이아웃의 높이값을 던져 주기 위함이다.
인터페이스를 정의한 이 후 어댑터 객체가 이 인터페이스를 멤버 변수로 가지게 해야 한다.
private OnEditTextHeight onEditTextHeight;
여기서 Adapter 객체를 소유하게 될 프래그먼트가 해당 인터페이스 new 할 수 있게 리스너 메소드를 만들어 준다
public void setOnEditTextHeightListener(OnEditTextHeight onEditTextHeightListener) {
this.onEditTextHeight = onEditTextHeightListener;
}
: 리스너 메소드를 만들어 줄 때 당연히 인자값으로 인터페이스 타입을 지정해 주고 프래그먼트에서 넘어 올 객체를
조금 전에 정의한 어댑터 클래스 멤버 변수로 선언한 인터페이를 연결 시켜 주어 같은 메모리를 바라 보게 한다.
(조금 풀어 설명 하면 프래그먼트에서나 어댑터에서나 같은 인터페이스 객체를 바라 보게 되겠지....)
자 이제 어댑터에서 사용하는 방법은 아까 로직 흐름을 설명할 때 아이템을 추가 시키는 콜이 들어 올때 아이템 레이아웃의
높이 값을 전달 하는 콜백 이벤트를 발생 시킬 때 콜백을 일으키면 되겠다라고 생각 되지만 결론은
오버라이드 onBindviewHolder 메소드를 실행에서 실행 시키면 된다. (이유는 어댑터 클래스 동작 방법을 알면 된다.)
onEditTextHeight.onEditTextHeight(holder.edit_view_ll.getHeight());
: 해상도별 높이 값은 간단히 getHeight() 값 하나면 된다..
이해를 돕기 위해 onBindviewHolder 메소드 전체 메소드를 보여 주면 대략 이렇다
핸들러에 포스트딜리이드 메소드를 사용하는 이유는
생성 시점에서는 바로 높이 값을 구할 수 없기 때문에(생성시점) 딜레이를 주어 값을 가져 올 수 있게 처리 한다.
@Override
public void onBindViewHolder(@NonNull final MissionSetViewHolder holder, final int position) {
final OneHeart item = dataSet.get(position);
android.os.Handler handler = new android.os.Handler();
// 해상도 별 레이아웃 height 값 전달(클릭시 한번만 실행)
if (position == 0) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
LogUtil.d(TAG, "layoutHeight : " + holder.edit_view_ll.getHeight());
onEditTextHeight.onEditTextHeight(holder.edit_view_ll.getHeight());
}
}, 20);
}
holder.index_position.setText(position+"");
holder.mission_content_et.setText(item.title);
if (item.total == 0) {
holder.mission_cnt_et.setText("");
} else {
holder.mission_cnt_et.setText(item.total+"");
}
holder.edit_del_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dataSet.size() > 1) {
removeAtPosition(holder.getAdapterPosition());
}
}
});
holder.mission_content_et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
OneHeart oneHeart = new OneHeart();
oneHeart.title = s.toString();
oneHeart.total = dataSet.get(holder.getAdapterPosition()).total;
dataSet.set(holder.getAdapterPosition(), oneHeart);
}
@Override
public void afterTextChanged(Editable s) {
}
});
holder.mission_cnt_et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
OneHeart oneHeart = new OneHeart();
int totalCount = Utility.parseWithDefault(s.toString(), 0);
oneHeart.total = totalCount;
if (totalCount > 99999) {
oneHeart.total = 99999;
}
oneHeart.title = dataSet.get(holder.getAdapterPosition()).title;
dataSet.set(holder.getAdapterPosition(), oneHeart);
}
@Override
public void afterTextChanged(Editable s) {
}
});
dataSet.set(holder.getAdapterPosition(), item);
}
그럼 어댑터 객체를 실행시킬때 onBindviewHolder 실행되고 뷰홀더로 가져오는 레이아웃에 높이값을 가져와 콜백메소드로 전달하게 된다
그리고 프래그먼트 쪽에서 저 값을 전달 받아 어느 변수어 저장하거나 바로 이벤트를 발생 시키면 될 것이다. 여기서는 멤버 변수에
값을 할당하게 하고 다른 처리 하도록 한다.
class Fragment
private MissionOnHeartAdapter adapter;
: 프래그먼트 객체에서 어댑터 클래스를 멤버 변수로 가지고 있다
그럼 다음 어댑터 객체안에 만들어 두었던 리스너 메소드를 사용하고 익명클래스를 생생하기 되면 다음과 같이 처리가 된다.
adapter.setOnEditTextHeightListener(new MissionOnHeartAdapter.OnEditTextHeight() {
@Override
public void onEditTextHeight(int layoutHeight) {
// 해상도별 레이아웃 높이 값 전달
EACH_MISSION_EDIT_HEIGHT = layoutHeight;
}
});
이해를 돕기위해 리싸이클 뷰 생성 메소드를 표시하면 다음과 같다
private void setMissionRecyclerView() {
adapter = new MissionOnHeartAdapter(getActivity(), oneHeartList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
// adapter 콜백리스너 등록
if (adapter != null) {
adapter.setOnEditTextHeightListener(new MissionOnHeartAdapter.OnEditTextHeight() {
@Override
public void onEditTextHeight(int layoutHeight) {
//콜백 메소드로 전달받은 값을 프래그먼트 쪽 멤버 변수에 할당 해 준다.
EACH_MISSION_EDIT_HEIGHT = layoutHeight;
}
});
adapter.setOnMissionSetItemClickListener(new MissionOnHeartAdapter.OnMissionSetItemClick() {
@Override
public void onDelItemClick() {
setDimensionsHeight(eachHeartMissionLl, DEL, EACH_MISSION_EDIT_HEIGHT, EACH_MISSION_EDIT_DEL_COUNT);
}
});
// 드래그 & 스와이프
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
adapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapter.removeAtPosition(viewHolder.getAdapterPosition());
}
}).attachToRecyclerView(recyclerView);
}
}
이제 높이 값을 알고 있기 때문에 add 이벤트를 일으키면서 리싸이클 뷰 크기를 동적으로 늘리거나 줄일 수 있게 된다
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_each_mission_tv:
if (toggleBtnOnOffCheck(eachHeartToggleBtn, eachHeartMissionLl)) {
int addCount = 0;
int currentSize = adapter.getItemCount();
for (int i = 0; i < EACH_MISSION_EDIT_ADD_COUNT; i++) {
addCount++;
if ((currentSize + addCount) <= EACH_MISSION_EDIT_LIMIT_COUNT) {
// 데이터 삽입
OneHeart oneHeart = new OneHeart();
oneHeart.title = "";
oneHeart.total = 0; // 어댑터에게 아이템을 추가 하라고 콜 이벤트를 발생 시킨다
adapter.addAtPosition(adapter.getItemCount(), oneHeart);
} else {
addCount--;
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_13));
break;
}
} // 여기서는 전달받은 아이템 뷰 높이값 만큼 프래그먼트에 포함된 리싸이클 뷰 영역에 레이아웃 // 높이값을 늘려주는 동작 이다.
setDimensionsHeight(eachHeartMissionLl, ADD, EACH_MISSION_EDIT_HEIGHT, addCount);
}
break;
case R.id.save_mission_btn:
if (oneEachValidateCheck()) {
missionSetLl.setVisibility(View.GONE);
if (missionSetting.isOn) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_26));
}
}
break;
}
}
private void setDimensionsHeight(View view, boolean addOrDel, int height, int setCount){
android.view.ViewGroup.LayoutParams params = view.getLayoutParams();
int currentHeight = view.getHeight();
// true : add , false : del
if (addOrDel) {
currentHeight += height * setCount;
} else {
currentHeight -= height * setCount;
}
params.height = currentHeight;
view.setLayoutParams(params);
}
여기까지가 기본적인 콜백 메소드 개념을 이용해서 콜백 리스너를 달아 사용하는 방법이다.
프래그먼트 java 쪽 전체 소스
public class MissionSetFragment extends BaseFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private final String TAG = MissionSetFragment.class.getSimpleName();
private FragmentMissionSettingBinding binding;
public LinearLayout missionSetLl;
private RecyclerView recyclerView;
private MissionOnHeartAdapter adapter;
public MissionSetting missionSetting;
private ArrayList<OneHeart> oneHeartList = new ArrayList<>();
private EditText accumulationRecommendContentEt;
private EditText accumulationRecommendTargetCountEt;
private EditText accumulationHeartContentEt;
private EditText accumulationHeartTargetCountEt;
private ToggleButton accumulationRecommendToggleBtn;
private ToggleButton accumulationHeartToggleBtn;
private ToggleButton eachHeartToggleBtn;
private LinearLayout accumulationRecommendLl;
private LinearLayout accumulationHeartLl;
private LinearLayout eachHeartMissionLl;
private Button saveMissionBtn;
private Context context;
private int EACH_MISSION_EDIT_HEIGHT = 0;
private final int EACH_MISSION_EDIT_ADD_COUNT = 1;
private final int EACH_MISSION_EDIT_DEL_COUNT = 1;
private final int EACH_MISSION_EDIT_LIMIT_COUNT = 10;
private final boolean ADD = true;
private final boolean DEL = false;
private boolean isPortraitRec;
private MissionSettingInfoDBHelper missionSettingInfoDBHelper;
private TextView missionOneHeartText;
private View titleBorder5;
private TextView addEachMissionTv;
public MissionSetFragment() {
}
@SuppressLint("ValidFragment")
public MissionSetFragment(MissionSetting missionSetting, boolean isPortraitRec) {
this.missionSetting = missionSetting;
this.isPortraitRec = isPortraitRec;
}
public static MissionSetFragment getInstance(MissionSetting missionSetting, boolean isPortraitRec) {
return new MissionSetFragment(missionSetting, isPortraitRec);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_mission_setting, container, false);
initValue();
addEventListener();
startMethod();
return binding.getRoot();
}
private void initValue() {
missionSetLl = binding.missionSetLl;
recyclerView = binding.eachMissionRv;
// 누적추천미션 타이틀
accumulationRecommendContentEt = binding.accumulationRecommendContentEt;
// 누적추천미션 목표 수
accumulationRecommendTargetCountEt = binding.accumulationRecommendTargetCountEt;
// toggleBtn
accumulationRecommendToggleBtn = binding.accumulationRecommendToggleBtn;
accumulationHeartToggleBtn = binding.accumulationHeartToggleBtn;
eachHeartToggleBtn = binding.eachHeartToggleBtn;
// 저장버튼
saveMissionBtn = binding.saveMissionBtn;
// 누적하트추천미션
accumulationHeartContentEt = binding.accumulationHeartContentEt;
accumulationHeartTargetCountEt = binding.accumulationHeartTargetCountEt;
accumulationRecommendLl = binding.accumulationRecommendLl;
accumulationHeartLl = binding.accumulationHeartLl;
eachHeartMissionLl = binding.eachHeartMissionLl;
missionOneHeartText = binding.missionOneHeartText;
addEachMissionTv = binding.addEachMissionTv;
titleBorder5 = binding.titleBorder5;
context = getContext();
missionSetting = new MissionSetting();
}
private void setDimensionsHeight(View view, boolean addOrDel, int height, int setCount){
android.view.ViewGroup.LayoutParams params = view.getLayoutParams();
int currentHeight = view.getHeight();
// true : add , false : del
if (addOrDel) {
currentHeight += height * setCount;
} else {
currentHeight -= height * setCount;
}
params.height = currentHeight;
view.setLayoutParams(params);
}
private void startMethod() {
setViewInit();
setMissionRecyclerView();
}
private void addEventListener() {
binding.addEachMissionTv.setOnClickListener(this);
saveMissionBtn.setOnClickListener(this);
accumulationRecommendToggleBtn.setOnCheckedChangeListener(this);
eachHeartToggleBtn.setOnCheckedChangeListener(this);
accumulationHeartToggleBtn.setOnCheckedChangeListener(this);
}
private void setMissionRecyclerView() {
adapter = new MissionOnHeartAdapter(getActivity(), oneHeartList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
// adapter 콜백리스너 등록
if (adapter != null) {
adapter.setOnEditTextHeightListener(new MissionOnHeartAdapter.OnEditTextHeight() {
@Override
public void onEditTextHeight(int layoutHeight) {
// 해상도별 레이아웃 높이 값 전달
EACH_MISSION_EDIT_HEIGHT = layoutHeight;
}
});
adapter.setOnMissionSetItemClickListener(new MissionOnHeartAdapter.OnMissionSetItemClick() {
@Override
public void onDelItemClick() {
setDimensionsHeight(eachHeartMissionLl, DEL, EACH_MISSION_EDIT_HEIGHT, EACH_MISSION_EDIT_DEL_COUNT);
}
});
// 드래그 & 스와이프
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
adapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapter.removeAtPosition(viewHolder.getAdapterPosition());
}
}).attachToRecyclerView(recyclerView);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_each_mission_tv:
if (toggleBtnOnOffCheck(eachHeartToggleBtn, eachHeartMissionLl)) {
int addCount = 0;
int currentSize = adapter.getItemCount();
for (int i = 0; i < EACH_MISSION_EDIT_ADD_COUNT; i++) {
addCount++;
if ((currentSize + addCount) <= EACH_MISSION_EDIT_LIMIT_COUNT) {
// 데이터 삽입
OneHeart oneHeart = new OneHeart();
oneHeart.title = "";
oneHeart.total = 0;
adapter.addAtPosition(adapter.getItemCount(), oneHeart);
} else {
addCount--;
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_13));
break;
}
}
setDimensionsHeight(eachHeartMissionLl, ADD, EACH_MISSION_EDIT_HEIGHT, addCount);
}
break;
case R.id.save_mission_btn:
if (oneEachValidateCheck()) {
missionSetLl.setVisibility(View.GONE);
if (missionSetting.isOn) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_26));
}
}
break;
}
}
@SuppressLint("StringFormatInvalid")
private boolean oneEachValidateCheck() {
missionSetting.totalRecom = new TotalRecom();
missionSetting.totalHeart = new TotalHeart();
missionSetting.oneHeartList = oneHeartList;
missionSetting.jsonString = "";
// 3개중 하나는 on 이 되어 있어야 rquest 요청 처리
if (!accumulationHeartToggleBtn.isChecked() && !accumulationRecommendToggleBtn.isChecked() && !eachHeartToggleBtn.isChecked()) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_19));
missionSetting.isOn = false;
} else {
missionSetting.isOn = true;
}
//누적추천미션 체크
String totalRecomTitle = accumulationRecommendContentEt.getText().toString();
int totalRecomTotal = Utility.parseWithDefault(accumulationRecommendTargetCountEt.getText().toString(), 0);
if (accumulationRecommendToggleBtn.isChecked()) {
if (totalRecomTitle.length() <= 0) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_20));
return missionSetting.isValidationOk = false;
}
if (totalRecomTotal <= 0) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_21));
return missionSetting.isValidationOk = false;
}
missionSetting.totalRecom.title = totalRecomTitle;
missionSetting.totalRecom.total = totalRecomTotal;
}
// 누적하트미션 체크
String totalHeartTitle = accumulationHeartContentEt.getText().toString();
int totalHeartTotal = Utility.parseWithDefault(accumulationHeartTargetCountEt.getText().toString(), 0);
if (accumulationHeartToggleBtn.isChecked()) {
if (totalHeartTitle.length() <= 0) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_22));
return missionSetting.isValidationOk = false;
}
if (totalHeartTotal <= 0) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_23));
return missionSetting.isValidationOk = false;
}
missionSetting.totalHeart = new TotalHeart();
missionSetting.totalHeart.title = totalHeartTitle;
missionSetting.totalHeart.total = totalHeartTotal;
}
// 개별하트 미션
int sameValue = 0;
if (eachHeartToggleBtn.isChecked()) {
for (int i = 0; i < oneHeartList.size(); i++) {
String title = oneHeartList.get(i).title;
if ("".equals(title) || title == null) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_17));
return missionSetting.isValidationOk = false;
}
int heartTotal = oneHeartList.get(i).total;
if (heartTotal < 1) {
showSnackBar(binding.getRoot(), getResources().getString(R.string.accumulation_text_18));
return missionSetting.isValidationOk = false;
}
// 하트 수 pk 처리
for (int j = 0; j < oneHeartList.size(); j++) {
if (oneHeartList.get(i).total == oneHeartList.get(j).total) {
sameValue++;
}
}
if (sameValue == 2) {
showSnackBar(binding.getRoot(), String.format(
getResources().getString(R.string.accumulation_text_29), oneHeartList.get(i).total));
return missionSetting.isValidationOk = false;
} else {
sameValue = 0;
}
}
Gson gson = new Gson();
String json = gson.toJson(oneHeartList);
missionSetting.jsonString = json;
missionSetting.oneHeartList = oneHeartList;
}
// 실행여부
missionSetting.isValidationOk = true;
missionSettingInfoDBHelper = new MissionSettingInfoDBHelper(getContext());
missionSettingInfoDBHelper.insertDB(missionSetting);
return missionSetting.isValidationOk;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.accumulation_recommend_toggle_btn:
toggleBtnOnOffCheck(accumulationRecommendToggleBtn, accumulationRecommendLl);
break;
case R.id.accumulation_heart_toggle_btn:
toggleBtnOnOffCheck(accumulationHeartToggleBtn, accumulationHeartLl);
break;
case R.id.each_heart_toggle_btn:
toggleBtnOnOffCheck(eachHeartToggleBtn, eachHeartMissionLl);
break;
}
}
private void setViewInit() {
missionSetLl.setVisibility(View.VISIBLE);
// 기존 값 로드 처리
missionSettingInfoDBHelper = new MissionSettingInfoDBHelper(getContext());
missionSetting = missionSettingInfoDBHelper.getMissionSettingInfo();
if (!Utility.objectIsEmpty(missionSetting)) {
if (!Utility.objectIsEmpty(missionSetting.totalRecom)) {
if (missionSetting.totalRecom.title.length() > 0) {
accumulationRecommendToggleBtn.setChecked(true);
accumulationRecommendContentEt.setText(missionSetting.totalRecom.title);
accumulationRecommendTargetCountEt.setText(missionSetting.totalRecom.total.toString());
}
}
if (!Utility.objectIsEmpty(missionSetting.totalHeart)) {
if (missionSetting.totalHeart.title.length() > 0) {
accumulationHeartToggleBtn.setChecked(true);
accumulationHeartContentEt.setText(missionSetting.totalHeart.title);
accumulationHeartTargetCountEt.setText(missionSetting.totalHeart.total.toString());
}
}
if (!Utility.objectIsEmpty(missionSetting.jsonString) && !"".equals(missionSetting.jsonString)) {
eachHeartToggleBtn.setChecked(true);
JsonArray jsonArr = (JsonArray) new JsonParser().parse(missionSetting.jsonString);
for (int i = 0; i < jsonArr.size(); i++) {
OneHeart oneHeart = new OneHeart();
JsonObject jsonObject = (JsonObject) jsonArr.get(i);
oneHeart.title = jsonObject.get("title").toString().replace("\"", "");
oneHeart.total = Integer.parseInt(jsonObject.get("total").toString());
oneHeartList.add(oneHeart);
}
} else {
toggleBtnOnOffCheck(eachHeartToggleBtn, eachHeartMissionLl);
for (int i = 0; i < 1; i++) {
OneHeart oneHeart = new OneHeart();
oneHeart.title = "";
oneHeart.total = 0;
oneHeart.count = 0;
oneHeartList.add(oneHeart);
}
}
}
}
private boolean toggleBtnOnOffCheck(CompoundButton toggleButton, LinearLayout targetLayout) {
CompoundButton button = toggleButton;
if (toggleButton.isChecked()) {
if (button.equals(eachHeartToggleBtn)) {
missionOneHeartText.setVisibility(View.GONE);
titleBorder5.setVisibility(View.VISIBLE);
addEachMissionTv.setVisibility(View.VISIBLE);
}
targetLayout.setVisibility(View.VISIBLE);
} else {
if (button.equals(eachHeartToggleBtn)) {
missionOneHeartText.setVisibility(View.VISIBLE);
titleBorder5.setVisibility(View.GONE);
addEachMissionTv.setVisibility(View.GONE);
}
targetLayout.setVisibility(View.GONE);
}
return button.isChecked();
}
@Override
protected BroadcastReceiver createReceiver() {
return new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
}
@Override
protected void requestSocketMessage(String appService) {
}
@Override
protected IntentFilter getIntentFilter() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(AppService.MISSION_WRITE);
return intentFilter;
}
@Override
protected Context getFragmentContext() {
return getActivity();
}
protected void showSnackBar(View view, String msg) {
Utility.showSnackBar(view, msg);
}
}
어댑터쪽 java 전체 소스
public class MissionOnHeartAdapter extends RecyclerView.Adapter<MissionOnHeartAdapter.MissionSetViewHolder> {
private final String TAG = MissionOnHeartAdapter.class.getSimpleName();
public ArrayList<OneHeart> dataSet;
private Context context;
private OnMissionSetItemClick onMissionSetItemClick;
private OnEditTextHeight onEditTextHeight;
public static class MissionSetViewHolder extends RecyclerView.ViewHolder {
public TextView index_position;
public ImageView edit_del_iv;
public EditText mission_content_et, mission_cnt_et;
public LinearLayout edit_view_ll;
public MissionSetViewHolder(View v) {
super(v);
edit_view_ll = v.findViewById(R.id.edit_view_ll);
edit_del_iv = v.findViewById(R.id.edit_del_iv);
mission_content_et = v.findViewById(R.id.mission_content_et);
mission_cnt_et = v.findViewById(R.id.mission_cnt_et);
index_position = v.findViewById(R.id.index_position);
}
}
// 삽입
public void addAtPosition(int position, OneHeart oneHeart) {
if (position > dataSet.size()) {
// 현재 존재하는 아이템의 수보다 많은 위치를 지정하므로 마지막 위치에 추가
position = dataSet.size();
}
dataSet.add(oneHeart);
notifyItemInserted(position);
}
// 삭제
public void removeAtPosition(int position) {
if (position < dataSet.size()) {
onMissionSetItemClick.onDelItemClick();
dataSet.remove(position);
notifyItemRemoved(position);
}
}
//이동
public void move(int fromPosition, int toPosition) {
final String title = dataSet.get(fromPosition).title;
final int total = dataSet.get(fromPosition).total;
OneHeart oneHeart = new OneHeart();
oneHeart.title = title;
oneHeart.total = total;
dataSet.remove(fromPosition);
dataSet.add(oneHeart);
notifyItemMoved(fromPosition, toPosition);
}
public MissionOnHeartAdapter(Context context, ArrayList<OneHeart> oneHeartList) {
this.context = context;
this.dataSet = oneHeartList;
}
@NonNull
@Override
public MissionSetViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.mission_eitor_item, parent, false);
final MissionSetViewHolder vh = new MissionSetViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(@NonNull final MissionSetViewHolder holder, final int position) {
final OneHeart item = dataSet.get(position);
android.os.Handler handler = new android.os.Handler();
// 해상도 별 레이아웃 height 값 전달(클릭시 한번만 실행)
if (position == 0) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
LogUtil.d(TAG, "layoutHeight : " + holder.edit_view_ll.getHeight());
onEditTextHeight.onEditTextHeight(holder.edit_view_ll.getHeight());
}
}, 20);
}
holder.index_position.setText(position+"");
holder.mission_content_et.setText(item.title);
if (item.total == 0) {
holder.mission_cnt_et.setText("");
} else {
holder.mission_cnt_et.setText(item.total+"");
}
holder.edit_del_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (dataSet.size() > 1) {
removeAtPosition(holder.getAdapterPosition());
}
}
});
holder.mission_content_et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
OneHeart oneHeart = new OneHeart();
oneHeart.title = s.toString();
oneHeart.total = dataSet.get(holder.getAdapterPosition()).total;
dataSet.set(holder.getAdapterPosition(), oneHeart);
}
@Override
public void afterTextChanged(Editable s) {
}
});
holder.mission_cnt_et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
OneHeart oneHeart = new OneHeart();
int totalCount = Utility.parseWithDefault(s.toString(), 0);
oneHeart.total = totalCount;
if (totalCount > 99999) {
oneHeart.total = 99999;
}
oneHeart.title = dataSet.get(holder.getAdapterPosition()).title;
dataSet.set(holder.getAdapterPosition(), oneHeart);
}
@Override
public void afterTextChanged(Editable s) {
}
});
dataSet.set(holder.getAdapterPosition(), item);
}
@Override
public int getItemCount() {
return dataSet.size();
}
public void setOnMissionSetItemClickListener(OnMissionSetItemClick onMissionSetItemClick) {
this.onMissionSetItemClick = onMissionSetItemClick;
}
public interface OnMissionSetItemClick {
void onDelItemClick();
}
public void setOnEditTextHeightListener(OnEditTextHeight onEditTextHeightListener) {
this.onEditTextHeight = onEditTextHeightListener;
}
public interface OnEditTextHeight {
void onEditTextHeight(int layoutHeight);
}
}
'tip' 카테고리의 다른 글
tip39. 디바이스 버전 가져오기 (0) | 2018.08.06 |
---|---|
tip6. 디버그 모드 구분하기 (0) | 2018.05.25 |