RecyclerView Adapter 를 별도 Adapter 파일로 만들어서 Activity 간 데이터 처리를 해보고 기록해둔다.
그동안 Inner Class 로 하나의 Activity 내에서 처리하는 것만 해봤는데 Activity간 처리하는 것이라 고려할 사항이 좀 된다.
RecyclerView 는 android.support.v7.widget.CardView 와 같이 사용하면 깔끔한 화면을 볼 수 있다.
또한, view 를 두개 이상 선택적으로 보여주는 것도 편하더라.
Intent 로 화면 전환 처리하는 걸 ContentAdapter 에서 처리하는 걸 문제없이 처리하기 위해 구글링으로 여러 자료를 참조하고 완성된 결과를 얻었다.
두 파일간에 Interface 를 통해 처리를 한다.
OnItemClickListene 를 인터페이스라고 하며 class 가 아닌 interface 라는 키워드를 이용하여 작성한다.
onItemClick함수를 인터페이스 함수라고 한다.
public interface OnItemClickListener { // Class 처럼 상속받아올 인터페이스명
void onItemClick(View v, int position); // 추상 메소드명
}
자바의 인터페이스 개념 이해를 위해서 구글링을 해보니 기본적인 Interface 개념만 나온다.
안드로이드 인터페이스 예제로 검색해야 원하는 걸 얻을 수 있다.
- http://yujuwon.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88-%EB%A7%8C%EB%93%A4%EA%B8%B0
- 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 파일은 모두 생략되어 있으니 구현 로직만 참고하면 많은 도움된다.
Custom View 또는 RecyclerView |
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(); }
} |
검색으로 찾은 자료들이 대부분 개념만 설명되어 완성된 결과를 얻을 수가 없어 삽질을 한참 했다.