Android
Android [메모앱] recyclerView
leopard4
2023. 2. 1. 17:38
포인트
1.클래스는 무조건 model 패키지에 만들기 (유지보수를위함)
2.앱을누르면 매니페스트 action 부분이 실행된다는것
3. recycleView 를 사용시 워크플로우(작업흐름)
1) "보여줄행"_row.xml 파일 생성 (리니어로 되있는지/ width / height가 적정하게 되있는지 확인)
2) 데이터를 저장할 ArrayList 나 List 에서 한행씩 보여줄 데이터만 액세스를 할수있는지 확인
3) Adapter 폴더에 Adapter 클래스를 생성
4.리니어 레이아웃을 사용해야한다는것 (상세)
왜냐하면
이부분에서 recyclerView를 리니어 레이아웃으로 설정했기 때문이다.
다르케하면 안보임
main 코드
package com.leopard4.memoapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.leopard4.memoapp.adapter.MemoAdapter;
import com.leopard4.memoapp.model.Memo;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText editMemo;
Button btnSave;
RecyclerView recyclerView;
MemoAdapter adapter;
ArrayList<Memo> memoList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editMemo = findViewById(R.id.editMemo);
btnSave = findViewById(R.id.btnSave);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true); // 리사이클러뷰의 크기가 변하지 않는다.
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); // 리사이클러뷰의 레이아웃을 세팅
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 1. 유저가 입력한 메모를 가져온다.
String content = editMemo.getText().toString().trim();
if (content.isEmpty()) {
Toast.makeText(MainActivity.this, "메모를 입력해주세요", Toast.LENGTH_SHORT).show();
return;
}
// 2. 메모를 memoList에 저장한다.
Memo memo = new Memo();
memo.setContent(content);
// Collections.reverse(memoList);
// memoList.add(memo);
memoList.add(0, memo); // 맨 앞에 저장
// Collections.reverse(memoList);
// 만약 Collections.reverse(); 사용한다면 앞뒤로 사용해야 버그가없다.
// Collections.reverse(); 의 void는 메모리를 바꾼다는것
// 저장을 누르면 hint가 나오게
editMemo.setText("");
// 3. 리사이클러뷰의 데이터가 변경되었음을 알려준다.
adapter.notifyDataSetChanged();
}
});
// memoList에 저장된 데이터를 뿌려준다.
adapter = new MemoAdapter(MainActivity.this, memoList);
recyclerView.setAdapter(adapter);
}
}
memo class
package com.leopard4.memoapp.model;
public class Memo {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
MemoAdapter
package com.leopard4.memoapp.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.leopard4.memoapp.R;
import com.leopard4.memoapp.model.Memo;
import java.util.ArrayList;
public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder>{
Context context; // 어떤 액티비티에서 실행할건데 라는것
ArrayList<Memo> memoList;
public MemoAdapter(Context context, ArrayList<Memo> memoList) {
this.context = context;
this.memoList = memoList;
}
@NonNull
@Override
public MemoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.memo_row, parent, false);
return new MemoAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MemoAdapter.ViewHolder holder, int position) {
Memo memo = memoList.get(position); // 메모리스트에서 해당 포지션의 메모를 가져온다.
holder.txtContent.setText(memo.getContent()); // 해당 포지션의 메모를 텍스트뷰에 뿌려준다.
}
@Override
public int getItemCount() {
return memoList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView txtContent;
public ViewHolder(@NonNull View itemView) {
super(itemView);
txtContent = itemView.findViewById(R.id.txtContent);
}
}
}