ABOUT ME

dddd-

Today
-
Yesterday
-
Total
-
  • [CustomListView] 안드로이드 커스텀 리스트뷰 아이템 클릭
    Android/개발 2017. 2. 18. 21:06


    안드로이드 간단하게 Custom ListView 만들기






    ListView에서는 ItemClickListener를 사용하여 쉽게 Click Event를 구현할 수 있습니다.

    ItemClickListener를 이용하여 Item의 이미지를 확대해서 보여주는 DetailActivity로 이동하는 예제를 만들어봤습니다!

    MainActivity의 ListView에서 Item을 클릭할 때 Intent를 이용하여 DetailActivity로 값을 넘겨주는 방식입니다.






    기본 프로젝트는 [CustomListView] 안드로이드 커스텀 리스트뷰에서 확인하실 수 있습니다.



    1. activity_detail.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">

    <ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    </LinearLayout>

    - DetailActivity에서 크게 보여줄 이미지가 들어갈 ImageView를 만들어 줍니다.





    2. listView.setOnItemClickListener() - MainActivity.java

    // listView의 ItemClickListener
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    /**
    * ListView의 Item을 Click 할 때 수행할 동작
    * @param parent 클릭이 발생한 AdapterView.
    * @param view 클릭 한 AdapterView 내의 View(Adapter에 의해 제공되는 View).
    * @param position 클릭 한 Item의 position
    * @param id 클릭 된 Item의 Id
    */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // adapter.getItem(position)의 return 값은 Object 형
    // 실제 Item의 자료형은 CustomDTO 형이기 때문에
    // 형변환을 시켜야 getResId() 메소드를 호출할 수 있습니다.
    int imgRes = ((CustomDTO)adapter.getItem(position)).getResId();

    // new Intent(현재 Activity의 Context, 시작할 Activity 클래스)
    Intent intent = new Intent(MainActivity.this, DetailActivity.class);
    // putExtra(key, value)
    intent.putExtra("imgRes", imgRes);
    startActivity(intent);
    }
    });

    - MainActivity에서 DetailActivity의 imageView에 담길 imgRes를 넘겨줍니다.






    3. DetailActivity.java

    package com.imaec.customlistviewdemo;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ImageView;

    public class DetailActivity extends AppCompatActivity {

    private Intent intent;
    private ImageView imageView;

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

    // MainActivity에서 보낸 imgRes를 받기위해 getIntent()로 초기화
    intent = getIntent();
    imageView = (ImageView) findViewById(R.id.imageView);

    // "imgRes" key로 받은 값은 int 형이기 때문에 getIntExtra(key, defaultValue);
    // 받는 값이 String 형이면 getStringExtra(key);
    imageView.setImageResource(intent.getIntExtra("imgRes", 0));
    }
    }

    - MainActivity에서 보낸 imgRes를 받아서 imageView에 보여줍니다.





    4. 여기까지 작성하고 프로젝트를 시작하면

    android.content.ActivityNotFoundException:

    Unable to find explicit activity class {com.imaec.customlistviewdemo/com.imaec.customlistviewdemo.DetailActivity};

    have you declared this activity in your AndroidManifest.xml?

    이러한 에러 메시지를 받을 것입니다.

    안드로이드에서 새로운 Activity를 생성하고 사용하기 위해서는 AndroidManifest.xml 파일에 Activity를 추가시켜줘야 합니다!

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    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 추가 -->
    <activity android:name=".DetailActivity"/>
    </application>





    - AndroidManifest.xml에 Activity까지 추가시킨 후 프로젝트를 실행시키면 정상적으로 동작할 것입니다!

      이상 리스트뷰에서 아이템클릭하여 새로운 액티비티 변환하는 소스였습니다!

      알면 알수록 활용도가 높은 리스트뷰 마스터합시다!!



    ListView 기본 사용법 알아보기

    RecyclerView 기본 사용법 알아보기



    댓글

Designed by Tistory.