728x90

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();
    }

}


검색으로 찾은 자료들이 대부분 개념만 설명되어 완성된 결과를 얻을 수가 없어 삽질을 한참 했다.

'안드로이드 > Interface' 카테고리의 다른 글

Android Interface AsyncTask 예제  (0) 2019.11.05
Java Interface Example  (0) 2019.09.05
Java 인터페이스(interface) 개요  (0) 2019.08.20
Android Interface 예제 ★★★  (0) 2018.08.22
Android Interface 예제 1  (0) 2018.08.20
블로그 이미지

Link2Me

,