@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
btn_add = findViewById(R.id.btn_add);
rv_main = findViewById(R.id.rv_main);
datas = new ArrayList<>();
// list => index(순서)가 생긴다
// VO는 데이터에 이름을 지어준다. (순서 X)
// 객체를 생성할때 생성자가 호출되는데
// 생성자에 매개변수가 2개있으니 타입과 개수를 맞춰서 적어줘야한다.
// 클래스(Class) : 객체(ex : 메모리)를 만들기위한 설계도, 설계는 추상적으로(유연한 코드) => 속성(필드), 기능(메소드)
// 객체 : 실존하는 메모리형태(호출 new)
// 변수에서 주소 값 저장=> 레퍼런스 변수
// 업캐스팅일때만 변수의 형태와 다르게 적을수있다.
// DirectVO m1 = new DirectVO("네이버","https://www.naver.com/");
// DirectVO m2 = new DirectVO("구글","https://www.google.com/");
// DirectVO m3 = new DirectVO("유튜브","https://www.youtube.com/");
// 생성자로 필드값(public DirectVO) 초기화하는 경우=> 객체 생성될때 꼭 값이 필요한 변수에 대해서
// setter로 필드값 초기화하는 경우 => 수정이 필요한 변수에 대해서
// . 을 찍는건 [~에 있는] 이라는 뜻이다.
datas.add(new DirectVO("네이버", "https://www.naver.com/"));
datas.add(new DirectVO("구글", "https://www.google.com/"));
datas.add(new DirectVO("유튜브", "https://www.youtube.com/"));
datas.add(new DirectVO("넷플릭스", "https://www.netflix.com/kr/"));
// 어뎁트 구현하기
// BaseAdapter (RecyclerView에서 제공해주는 추상클래스) 상속받아 구현
// ViewHolder 클래스(객체) 함께 구현해야함
// 재사용을 위한
// RecyclerView에 Adapter
adapter = new DirectAdapter(datas, getApplicationContext());
rv_main.setAdapter(adapter);
rv_main.setLayoutManager(new LinearLayoutManager(this));
// ADD 기능 구현하기
// 1. Activity 새로 만들기(EdtText 2, Btn 1)
// 2. ADD 버튼에 이벤트 리스너 달기
// 3. Intent 사용해서 두번째 Activity로 이동하기
// 4. 이동해서 title과 address 입력하고 버튼 클릭하면 다시 MainActivity로 돌아오기
// 5. 돌아왔을 때 title과 address 값을 RecyclerView에 추가하기
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
AddActivity.class);
startActivityForResult(intent, REQUEST_ADD);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if(requestCode == REQUEST_ADD){
datas.add(new DirectVO(data.getStringExtra("title"), data.getStringExtra("address")));
adapter.notifyDataSetChanged();
//adapter 새로고침하는 코드
}
}
}
}
=============================================================
public class AddActivity extends AppCompatActivity {
Button btn_go;
EditText tv_title;
EditText tv_address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
btn_go = findViewById(R.id.btn_go);
tv_title = findViewById(R.id.tv_title);
tv_address = findViewById(R.id.tv_address);
btn_go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("title",tv_title.getText().toString());
intent.putExtra("address",tv_address.getText().toString());
setResult(RESULT_OK,intent);
finish();
}
});
}
}
=================================
public class DirectAdapter extends RecyclerView.Adapter<DirectViewHolder> {
// Adapter의 역할
// 템플릿(ViewHolder)에 데이터(ArrayList)를 씌우는 역할
// 필드2개
// data(ArrayList), Activity 정보 - Context
private ArrayList<DirectVO> datas;
// activity에서 할 수 있는 일들을 Adapter에서도 수행하려고
// startActivity(intent) 같은 것들 처리
private Context context;
//생성자에 매개변수 만들기
// 템플릿 꾸며야 하니 가져오기 <DirectVO> datas
public DirectAdapter(ArrayList<DirectVO> datas, Context context) {
this.datas = datas;
this.context = context;
}
@NonNull
@Override
public DirectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// ViewHolder 생성
// inflate 작업 수행 (xml에 있는 타입 -> java 객체 View)
// ex) findViewById, setContentView
DirectViewHolder holder = new DirectViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.templete,parent,false)
);
return holder;
}
@Override
public void onBindViewHolder(@NonNull DirectViewHolder holder, int position) {
final int temp = position;
// ✔✔✔✔ 꾸미는것은
// 기존에 만들어둔 ViewHolder를 전달 받아서 data로 꾸며주는 메소드
// 이 메소드는 getItemCount 메소드에 적어준 개수만큼 ✔실행✔된다.
holder.tv_title.setText(datas.get(position).getTitle());
holder.tv_address.setText(datas.get(position).getAddress());
holder.btn_go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// onClickListener 객체 (클래스)는 InnerClass 입니다
// InnerClass에서 외부 클래스의 정의된 변수에 접근 X => 동기화때문
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(datas.get(temp).getAddress()));
// Activity가 아닌 곳에서 startActivity를 할 때는 새로운 TASK에서 실행 될 수 있도록
// 옵션(flag)을 걸어줘야함
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
// 항목 개수
return datas.size();
}
}
set