안드로이드 11일차

ParkJinYoung·2022년 10월 21일
0

커스텀

@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

profile
꾸준히

0개의 댓글