728x90
반응형
커스텀 리스트뷰를 생성하는 방법입니다. 파이어베이스와 연동하였습니다.
리스트를 추가하고싶다면 따로 버튼을 만들어서 추가하시면 됩니다.
기본적인 코드와 동작을 확인하시면 좋을것같습니다.
리스트뷰 객체.java
//테이블이라고 생각하고, 테이블에 들어갈 속성값을 넣기
//파이어베이스는 RDBMS와 다르기 때문에 테이블이라는 개념이 없음. 원래는 키값이라고 부름
public class memo_list {
String mname; //제목
String mcontent; //내용
public memo_list(){} // 생성자 메서드
public String getmname() {
return mname;
}
public void setmname(String mname) {
this.mname = mname;
}
public String getmcontent() {
return mcontent;
}
public void setmcontent(String mcontent) {
this.mcontent = mcontent;
}
//값을 추가할때 쓰는 함수
public memo_list(String mname, String mcontent){
this.mname = mname;
this.mcontent = mcontent;
}
}
메인화면.java
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<memo_list> arrayList;
private FirebaseDatabase database;
private DatabaseReference databaseReference;
//DatabaseReference는 데이터베이스의 특정 위치로 연결하는 거라고 생각하면 된다.
//현재 연결은 데이터베이스에만 딱 연결해놓고 키값(테이블 또는 속성)의 위치 까지는 들어가지는 않은 모습이다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//커스텀 리스트뷰 시작
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true); // 리사이클러뷰 기존성능 강화
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
arrayList = new ArrayList<>(); // 그룹 객체를 담을 어레이 리스트 (어댑터쪽으로)
database = FirebaseDatabase.getInstance(); // 파이어베이스 데이터베이스 연동
databaseReference = database.getReference(); // DB 테이블 연결
//값이 변경되는걸 감지하는 함수!
databaseReference.child("memo").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// 파이어베이스 데이터베이스의 데이터를 받아오는 곳
arrayList.clear(); // 기존 배열리스트가 존재하지않게 초기화
for (DataSnapshot snapshot : dataSnapshot.getChildren()) { // 반복문으로 데이터 List를 추출해냄
memo_list memo_list = snapshot.getValue(memo_list.class); //객체를 선언하여 데이터를 담기
arrayList.add(memo_list); // 담은 데이터들을 배열리스트에 넣고 리사이클러뷰로 보낼 준비
}
adapter.notifyDataSetChanged(); // 리스트 저장 및 새로고침
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// 디비를 가져오던중 에러 발생 시
//Log.e("MainActivity", String.valueOf(databaseError.toException())); // 에러문 출력
}
});
adapter = new memo_Adapter(arrayList, this);
recyclerView.setAdapter(adapter); // 리사이클러뷰에 어댑터 연결
}
}
어댑터.java
public class memo_Adapter extends RecyclerView.Adapter<memo_Adapter.CustomViewHoler> {
private ArrayList<memo_list> arrayList;
private Context context;
private FirebaseDatabase database;
private DatabaseReference databaseReference;
//메인에서 어댑터로 받아온 값
public memo_Adapter(ArrayList<memo_list> arrayList, Context context) {
this.arrayList = arrayList;
this.context = context;
}
@NonNull
@Override
public CustomViewHoler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//메모 list.xml 연결하기
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.memo_list, parent, false);
CustomViewHoler holder = new CustomViewHoler(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull final CustomViewHoler holder, int position) {
//각 리스트뷰에 값을 넣는 부분
holder.mname.setText(arrayList.get(position).getmname());
holder.mcontent.setText(arrayList.get(position).getmcontent());
// 만약 정수형이라면 holder.gtime.setText(String.valueOf(arrayList.get(position).getstudytime()));
}
public class CustomViewHoler extends RecyclerView.ViewHolder {
//리스트.xml 요소 아이디 연결
TextView mname;
TextView mcontent;
public CustomViewHoler(@NonNull View itemView) {
super(itemView);
this.mname = itemView.findViewById(R.id.mname);
this.mcontent = itemView.findViewById(R.id.mcontent);
}
}
}
리스트.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/gray"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_margin="10dp"
android:layout_gravity="center"
android:text="메모이름"
android:textColor="@color/white"
android:id="@+id/mname"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:visibility="invisible"
android:id="@+id/mcontent"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="2dp"
android:orientation="horizontal"
android:background="@color/white"></LinearLayout>
</LinearLayout>
메인화면.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"
android:background="@color/gray">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
: 편의를 위해 리니어 레이아웃 안에 감쌌습니다. androidx.coordinatorlayout속에 만든 이유는.. 제가 플로팅 버튼을 같이 사용하기 때문입니다. 애초에 리니어로 만드셔도 상관없습니다.
728x90
반응형
'Mobile > Android' 카테고리의 다른 글
안드로이드 화면 새로고침 하기 (Activity, Adapter) (0) | 2021.05.17 |
---|---|
안드로이드 EditText 클릭 방지 이벤트 (0) | 2021.04.30 |
안드로이드 플로팅 버튼 만들기 (0) | 2021.04.30 |
안드로이드 캘린더뷰 값 저장하기 (0) | 2021.04.29 |
안드로이드 리사이클러뷰에서 팝업 메뉴 만들기 (0) | 2021.04.22 |