2019. 11. 8. 14:54ㆍ모바일/Android_Java
RecyclerView Adapter 를 별도 Adapter 파일로 만들어서 Activity 간 데이터 처리를 해보고 기록해둔다.
그동안 Inner Class 로 하나의 Activity 내에서 처리하는 것만 해봤는데 Activity간 처리하는 것이라 고려할 사항이 좀 된다.
RecyclerView 는 android.support.v7.widget.CardView 와 같이 사용하면 깔끔한 화면을 볼 수 있다.
또한, view 를 두개 이상 선택적으로 보여주는 것도 편하더라.
Intent 로 화면 전환 처리하는 걸 ContentAdapter 에서 처리하는 걸 문제없이 처리하기 위해 구글링으로 여러 자료를 참조하고 완성된 결과를 얻었다.
두 파일간에 Interface 를 통해 처리를 한다.
OnItemClickListene 를 인터페이스라고 하며 class 가 아닌 interface 라는 키워드를 이용하여 작성한다.
onItemClick함수를 인터페이스 함수라고 한다.
publicinterfaceOnItemClickListener {// Class 처럼 상속받아올 인터페이스명
void onItemClick(View v, int position);// 추상 메소드명
}
자바의 인터페이스 개념 이해를 위해서 구글링을 해보니 기본적인 Interface 개념만 나온다.
안드로이드 인터페이스 예제로 검색해야 원하는 걸 얻을 수 있다.
- http://codeasy.tistory.com/2?category=751348
안드로이드 인터페이스 구성요소 :https://kairo96.gitbooks.io/android/content/ch3.1.html참조
안드로이드 Interface 를 사용한 예제 중에서https://gist.github.com/riyazMuhammad/1c7b1f9fa3065aa5a46f를 참조하면 도움된다. 단, mViewHolder.getPosition() 는 테스트해보니 deprecated 되었다고 동작이 되지 않는다.
position 은 getAdapterPosition() 로 넘기면 정상적으로 원하는 결과를 얻을 수 있다.
본 게시글에서는 Content_Item.java, XML 파일은 모두 생략되어 있으니 구현 로직만 참고하면 많은 도움된다.
public class ContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_ONE = 1;
private static final int TYPE_TWO = 2;
Context mContext;
private ArrayList<Content_Item> IvList;
Content_Item cItem;
private OnItemClickListener listener; // 이벤트 리스너를 변수로 선언
public interface OnItemClickListener { // 인터페이스 정의
void onItemClick(View v, int position);
}
public ContentAdapter(Context mContext, ArrayList<Content_Item> items, OnItemClickListener mOnClickListener) {
this.mContext = mContext;
IvList = items;
this.listener = mOnClickListener;
}
// determine which layout to use for the row
@Override
public int getItemViewType(int position) {
Content_Item item = IvList.get(position);
if (item.getIsFolder().equals("1")) {
return TYPE_ONE;
} else if (item.getIsFolder().equals("0")) {
return TYPE_TWO;
} else {
return -1;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 새로운 뷰를 만든다.
if (viewType == TYPE_ONE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_item, parent, false);
return new ViewHolder1(view);
} else if (viewType == TYPE_TWO) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.person_item, parent, false);
return new ViewHolder2(view);
} else {
throw new RuntimeException("The type has to be ONE or TWO");
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// ListView의 getView 부분을 담당하는 메소드
switch (holder.getItemViewType()) {
case TYPE_ONE:
((ViewHolder1) holder).bind(IvList.get(position), listener);
break;
case TYPE_TWO:
((ViewHolder2) holder).bind(IvList.get(position), listener);
break;
default:
break;
}
}
@Override
public int getItemCount() {
return IvList.size(); // 데이터 개수 리턴
}
public class ViewHolder1 extends RecyclerView.ViewHolder {
public ImageView mImage;
public TextView mTitle;
public ViewHolder1(View itemView) {
super(itemView);
// 화면에 표시될 View 로부터 위젯에 대한 참조 획득
mImage = (ImageView) itemView.findViewById(R.id.cell_image);
mTitle = (TextView) itemView.findViewById(R.id.cell_text);
}
public void bind(Content_Item item, final OnItemClickListener listener) {
cItem = item;
if(cItem.getIsFolder().equals("1")){
// 아이템 내 각 위젯에 데이터 반영
mImage.setImageResource(R.drawable.group_btn);
mTitle.setText(cItem.getName());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(view,getAdapterPosition());
}
});
}
}
}
public class ViewHolder2 extends RecyclerView.ViewHolder {
public ImageView mImage;
public TextView mTitle;
public TextView msubTitle1;
public TextView msubTitle2;
public ViewHolder2(View itemView) {
super(itemView);
mImage = (ImageView) itemView.findViewById(R.id.cell_image);
mTitle = (TextView) itemView.findViewById(R.id.cell_text);
msubTitle1 = (TextView) itemView.findViewById(R.id.cell_text_sub1);
msubTitle2 = (TextView) itemView.findViewById(R.id.cell_text_sub2);
}
public void bind(Content_Item item, final OnItemClickListener listener) {
cItem = item;
if(cItem.getIsFolder().equals("0")){
// 아이템 내 각 위젯에 데이터 반영
String imageUri = cItem.getPhoto();
if (imageUri.equals("")) {
mImage.setImageBitmap(R.drawable.photo_base);
} else {
Glide.with(itemView.getContext()).load(imageUri).into(mImage);
}
mTitle.setText(cItem.getName());
msubTitle1.setText(cItem.getCode());
msubTitle2.setText(cItem.getPosition());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(view,getAdapterPosition());
}
});
}
}
}
}
public class RecyclerviewList extends AppCompatActivity implements View.OnClickListener {
Context context;
private RecyclerView listView; // 리스트뷰
private ArrayList<Content_Item> cItemList = new ArrayList<>();
RecyclerView.Adapter contentListAdapter;
RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orglistview);
context = this.getBaseContext();
// Adapter에 추가 데이터를 저장하기 위한 ArrayList
listView = (RecyclerView) findViewById(R.id.recyclerview);
listView.setHasFixedSize(true);
// Set Layout Manager
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
listView.setLayoutManager(layoutManager);
contentListAdapter = new ContentAdapter(getApplicationContext(),cItemList, new ContentAdapter.OnItemClickListener(){
@Override
public void onItemClick(View v, int position) {
if(cItemList.get(position).getIsFolder().equals("1")){
Toast.makeText(context, "Item Clicked" + position, Toast.LENGTH_LONG).show();
} else if(cItemList.get(position).getIsFolder().equals("0")){
Intent intent = new Intent(RecyclerviewList.this, StaffView.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("idx", cItemList.get(position).getIdx());
intent.putExtra("title", cItemList.get(position).getName());
startActivity(intent);
}
}
}); // Adapter 생성
listView.setAdapter(contentListAdapter); // 어댑터를 리스트뷰에 세팅
// 서버에서 데이터 가져오기
getJSONData();
}
}
출처: https://link2me.tistory.com/1500 [소소한 일상 및 업무TIP 다루기]
검색으로 찾은 자료들이 대부분 개념만 설명되어 완성된 결과를 얻을 수가 없어 삽질을 한참 했다.
출처:https://link2me.tistory.com/1500[소소한 일상 및 업무TIP 다루기]
'모바일 > Android_Java' 카테고리의 다른 글
postDelayed (0) | 2019.12.05 |
---|---|
WindowManager.LayoutParams() (0) | 2019.11.11 |
Static (0) | 2019.10.30 |
테마관련 (0) | 2019.10.28 |
View관련 (1) | 2019.10.25 |