상세 컨텐츠

본문 제목

[안드로이드] 리스트(RecyclerView) 와 바로가기메뉴(ContextMenu)

안드로이드

by aries574 2021. 1. 10. 20:14

본문


2021/01/05 - [안드로이드] - [안드로이드] 다이얼로그(Dialog) 리스트(List)로 보여주는 방법

2021/01/06 - [안드로이드] - [안드로이드]다이얼로그(Dialog) 체크박스(CheckBox)로 보여주기

2021/01/07 - [안드로이드] - [안드로이드] 다이얼로그(Dialog) 사용자정의 (Custom) 화면으로 보여주기

2021/01/08 - [안드로이드] - [안드로이드]프래그먼트(Fragment) 간의 데이터 전달방법(Listener)

2021/01/09 - [안드로이드] - [안드로이드]바로가기메뉴(ContextMenu) 바탕화면 변경해보기


이번 시간에는 데이터를 리스트로 보여주는 RecyclerView와 

리스트를 선택할 때 액션을 할 수 있게 ContextMenu를 적용하는 예제를 만들어 보겠습니다.


1. 라이브러리 추가

이번 예제를 하기 위해서는 design 라이브러리가 필요하며 사용방법은 아래 링크를 참조하시면 됩니다.

2020/12/19 - [안드로이드] - [안드로이드]라이브러리 찾아 등록하는 방법

com.android.support:design으로 검색하시면 됩니다.


2-1 예제 데이터 추가( res -> values -> strings.xml)

<resources>
<string name="app_name">RecyclerView</string>

<string-array name="animal_names">
<item>pig</item>
<item>cat</item>
<item>dog</item>
<item>rabbit</item>
</string-array>
</resources>

2-1 예제 아이콘 추가(res -> drawable)

아이콘 저장하고 drawable폴더에 저장하시면 됩니다.




3. 데이터 클래스 추가(Animal.java)


파일명은 Animal로 했습니다.


public class Animal {

private int animal_id;
private String animal_name;

public Animal(int animal_id, String animal_name) {
this.animal_id = animal_id;
this.animal_name = animal_name;
}

public int getAnimal_id() {
return animal_id;
}

public void setAnimal_id(int animal_id) {
this.animal_id = animal_id;
}

public String getAnimal_name() {
return animal_name;
}

public void setAnimal_name(String animal_name) {
this.animal_name = animal_name;
}
}


4. 리스트 화면 추가(item_layout.xml)

파일명은 item_layout로 했습니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginTop="3dp"
android:elevation="6dp"
app:cardCornerRadius="6dp"
android:layout_margin="6dp"
android:id="@+id/mCardView"
>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:scaleType="centerCrop"
android:id="@+id/animal_album"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginLeft="100dp"
android:id="@+id/animal_name"/>
</LinearLayout>
</androidx.cardview.widget.CardView>


5. 어뎁터생성(Adapter) RecyclerAdapter.java)

화면과 데이터를 연결해주는 기능을 합니다.


import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewholder> {

private List<Animal> animals = new ArrayList<>();

public RecyclerAdapter(List<Animal> animals){
this.animals = animals;
}

@NonNull
@Override
public MyViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);

return new MyViewholder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewholder holder, int position) {
holder.animalName.setText(animals.get(position).getAnimal_name());
holder.animalImage.setImageResource(animals.get(position).getAnimal_id());
}


@Override
public int getItemCount() {
return animals.size();
}

public static class MyViewholder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{

ImageView animalImage;
TextView animalName;
CardView cardView;

public MyViewholder(@NonNull View itemView) {
super(itemView);

animalImage = itemView.findViewById(R.id.animal_album);
animalName = itemView.findViewById(R.id.animal_name);
cardView = itemView.findViewById(R.id.mCardView);
cardView.setOnCreateContextMenuListener(this);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("아이템을 선택하세요");
menu.add(this.getAdapterPosition(), 121, 0, "아이템 삭제");
menu.add(this.getAdapterPosition(), 122, 1, "아이템 추가");
}

}

public void removeItem(int position){
animals.remove(position);
notifyDataSetChanged();
}
}


6. 메인화면 구현(activity_main.xml)

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

<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mRecyclerView"
android:scrollbars="vertical"
/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>


7. 메인코드 구현(MainActivity.java)


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

//이미지
private int[] animal_id = {R.drawable.cat, R.drawable.dog, R.drawable.pig, R.drawable.rabbit};

//동물목록
private String [] animal_names;

//동물리스트
private List<Animal> animals = new ArrayList<>();

private RecyclerView recyclerView;
private RecyclerAdapter adapter;

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

animal_names = getResources().getStringArray(R.array.animal_names);

recyclerView = findViewById(R.id.mRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);

getAnimal();

adapter = new RecyclerAdapter(animals);
recyclerView.setAdapter(adapter);

}

public void getAnimal(){

int count = 0;

for(String animalName : animal_names){

Animal animal = new Animal(animal_id[count], animalName);
animals.add(animal);
count++;
}
}

@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {

switch (item.getItemId()){
case 121:
displayMessage("아이템 삭제");
adapter.removeItem(item.getGroupId());
return true;
case 122:
displayMessage("아이템 추가");
return true;
default:
return super.onContextItemSelected(item);
}

}

public void displayMessage(String message){
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}

}


8. 실행화면




2021/01/05 - [안드로이드] - [안드로이드] 다이얼로그(Dialog) 리스트(List)로 보여주는 방법

2021/01/06 - [안드로이드] - [안드로이드]다이얼로그(Dialog) 체크박스(CheckBox)로 보여주기

2021/01/07 - [안드로이드] - [안드로이드] 다이얼로그(Dialog) 사용자정의 (Custom) 화면으로 보여주기

2021/01/08 - [안드로이드] - [안드로이드]프래그먼트(Fragment) 간의 데이터 전달방법(Listener)

2021/01/09 - [안드로이드] - [안드로이드]바로가기메뉴(ContextMenu) 바탕화면 변경해보기

반응형

관련글 더보기

댓글 영역