반응형



RecyclerView에서 아이템 클릭시 해당 내용을 다른 액티비티에 보여주는 예제입니다. 


최초작성 2019. 2. 17

최종작성 2019. 8. 22




1. RecyclerView 기본 예제 코드는 다음 포스팅을 참고하세요.


Android RecyclerView 간단한 예제

https://webnautes.tistory.com/1214




2. 다음 코드를 추가합니다. 



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview_main_list);
        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLinearLayoutManager);


        mArrayList = new ArrayList<>();
        mAdapter = new CustomAdapter( mArrayList);
        mRecyclerView.setAdapter(mAdapter);

        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
                mLinearLayoutManager.getOrientation());
        mRecyclerView.addItemDecoration(dividerItemDecoration);


     
        mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Dictionary dict = mArrayList.get(position);
                Toast.makeText(getApplicationContext(), dict.getId()+' '+dict.getEnglish()+' '+dict.getKorean(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void onLongClick(View view, int position) {
            }
        }));
       

        Button buttonInsert = (Button)findViewById(R.id.button_main_insert);
        buttonInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                count++;

                // Dictionary 생성자를 사용하여 ArrayList에 삽입할 데이터를 만듭니다.
                Dictionary data = new Dictionary(count+"","Apple" + count, "사과" + count);

                //mArrayList.add(0, dict); //RecyclerView의 첫 줄에 삽입
                mArrayList.add(data); // RecyclerView의 마지막 줄에 삽입

                mAdapter.notifyDataSetChanged(); //변경된 데이터를 화면에 반영
            }
        });

    }

   
    public interface ClickListener {
        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }

    public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private MainActivity.ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));
                    }
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildAdapterPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    }

}




3. 데이터 추가 버튼을 눌러서 Recyclerview에 데이터를 추가합니다. 

그 다음 Recyclerview에서 아이템 하나를 선택하면 해당 목록에 있는 내용을 Toast를 사용하여 화면에 보여줍니다. 





4. 이제 다른 액티비티에 값을 전달해봅니다. 

텍스트뷰에 전달받은 값을 보여줄 용도로 사용할 activity_result.xml 레이아웃 파일을 추가합니다. 


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:text="TextView" />

</androidx.constraintlayout.widget.ConstraintLayout>




5. 전달받은 값을 보여줄 ResultActivity.java 액티비티 파일을 추가합니다.


package com.tistory.webnautes.endlessloading;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;

public class ResultActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);


        String id = "";
        String korean = "";
        String english = "";

        Bundle extras = getIntent().getExtras();

        id = extras.getString("id");
        korean = extras.getString("korean");
        english = extras.getString("english");


        TextView textView = (TextView) findViewById(R.id.textView_result);

        String str = id + '\n' + english + '\n' + korean;
        textView.setText(str);

    }
}




6. ResultActivity를 AndroidManifest.xml 매니패스트 파일에 추가합니다. 

이렇게 해주어야 액티비티간 전환이 가능합니다.


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ResultActivity"> </activity>
        
    </application>




7. MainActivity에 다른 액티비티로 데이터를 전달하는 코드를 추가합니다. 

RecyclerView에서 선택된 아이템이 전달됩니다. 


       mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Dictionary dict = mArrayList.get(position);
                Toast.makeText(getApplicationContext(), dict.getId()+' '
                        +dict.getEnglish()+' '+dict.getKorean(), Toast.LENGTH_LONG).show();

                Intent intent = new Intent(getBaseContext(), ResultActivity.class);

                intent.putExtra("id", dict.getId());
                intent.putExtra( "korean", dict.getKorean());
                intent.putExtra("english", dict.getEnglish());

                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {
            }
        }));




8. 실행결과 전달받은 데이터를 보여줍니다. 





관련 포스팅


Android RecyclerView 간단한 예제

https://webnautes.tistory.com/1214



Android RecyclerView에 데이터를 추가/편집/삭제하는 예제

https://webnautes.tistory.com/1222



반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 안녕하세요 2019.05.18 09:53

    안녕하세요 글 잘읽어보았습니다
    혹시 recyclerview를 데이터베이스의 테이블을 받아서 보여주도록했는데 하나씩 클릭하였을때 클릭한 정보를 다음 화면에 intent로 전달하는 방법은 없을까요??
    intent.putextra를 쓰고있는데 recyclerview의 객체.gettext.tostring은 안되네요 ㅠ
    intent.putextra (mRecyclerview.gettext.tostring)처럼요 gettext가 없는거 같은데 대신에 제가 뭘써야하는지 답을 듣고 싶습니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.18 18:05 신고

      다음처럼 하면 됩니다.
      아이템 클릭시 반환 받는 positon으로

      어레이리스트에서 데이터를 가져온 후
      Data data = mArrayList.get(position);


      다음처럼 원하는 엑티비티로 보내면 됩니다.

      Intent intent = new Intent(getActivity(), ResultActivity.class);
      intent.putExtra("id", data.getId());
      startActivityForResult(intent, 300);

    • 안녕하세요 2019.05.18 19:25

      Data data = mArrayList.get(position);
      Intent intent = new Intent(getActivity(), ResultActivity.class);
      intent.putExtra("id", data.getId());
      startActivityForResult(intent, 300);
      말씀하신대로했는데 Data 부분에서 빨간줄 나오는데 따로 import 시켜야하는건지 아니면 따로 무언가를 설정해주어야하는건지 알고싶습니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.18 23:18 신고

      예로 들어 설명한겁니다.....
      본 포스팅에 맞추어서 해야 합니다..

      지금 다시보니 포스트의 7번에 이미 구현되어 있군요..

  2. hw00173 2019.07.12 00:08

    안녕하세요.

    항상 좋은 자료를 제공해주셔서 감사합니다.

    해당 예제를 통해 리사이클러뷰 아이템 클릭 이벤티를 구현하였는데, 추가적으로 구현하고 싶은 기능이 있어 질문드립니다.

    아이템 클릭시 그 아이템 view가 선택되었다는 표시로 백그라운드나 글자 색상 등이 변경되게끔 하고 싶은데,

    어댑터 단에서 해당 아이템뷰의 클릭리스너를 구현하였으나, 아무런 변화가 없어서 질문드립니다.!

    어떻게 하면 될 지 도움을 받고 싶습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.12 10:15 신고

      findViewById로 리소스를 가져온 후..
      아이템 클릭시 해당 리소스의 값을 변경하면 될듯한데 안되나요?

      아마도 클릭 이벤트 안에서 접근하려면 해당 리소스를 가리키는 변수 선언시 final을 앞에 붙여야 할듯합니다.

  3. hw00173 2019.07.12 11:07

    빠른 답변 감사합니다.
    말씀해주신 대로 어댑터 단에서 클릭리스너를구현하였습니다,
    하지만 아이템을 터치를 할 경우
    위에서 쓴 클릭리스너가 먼저 동작하고
    롱클릭을하였을 경우 어댑터의 클릭메소드가 동작합니다.

    이 경우에는 어떤식으로 해결해야 하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.12 12:14 신고

      하나의 동작에 중복해서 여러 기능을 넣을 수 없습니다.

      기존 클릭 이벤트에 원하는 기능을 넣어 동작하는지 테스트해보세요.

+ Recent posts