안드로이드 13일차

ParkJinYoung·2022년 10월 25일
0

카톡만들기

public class MainActivity extends AppCompatActivity {
    Button btn_send;
    ArrayList<DirectVO> datas;
    RecyclerView rv_main;
    DirectAdapter adapter;
    EditText edt_content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
        btn_send = findViewById(R.id.btn_send);
        rv_main = findViewById(R.id.rv_main);
        edt_content = findViewById(R.id.edt_content);
        int[] imgs= new int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,
                R.drawable.img05};
        Random rd = new Random();

        datas = new ArrayList<>();
        datas.add(new DirectVO("박진영1","안녕하세요","오후 4:23",imgs[0]));
        datas.add(new DirectVO("박진영2","ㅎㅇ","오후 4:25",imgs[1]));
        datas.add(new DirectVO("박진영3","ㅇㅇ","오후 4:26",imgs[2]));
        datas.add(new DirectVO("박진영4","ㅇ","오후 4:28",imgs[3]));
        datas.add(new DirectVO("박진영5","확인","오후 4:32",imgs[4]));

        // 남이보낸 카톡은 왼쪽에 (왼쪽 view를 VISIBLE)
        // 내가 보낸 카톡은 오른쪽에 (오른쪽 view를 VISIBLE)
        // ListView의 항못을 그리는 작업은 Adapter에서 함(setText, setOnClickLister 등등...)
        // => VISIBLE도 Adapter에서 해야함
        // => Adapter에서 현재 로그인 (아직 구현 안했음) 한(이 메세지의 주인) name을 알아야함
        // 그래야 이 메세지를 왼쪽에 띄울건지 오른쪽에 띄울건지 결정할수있다.
        String my = "박진영1";


        // View Holder 클래스 -> 템플릿에 있는 모든 view를 필드에 선성,
        adapter =new DirectAdapter(datas,getApplicationContext(),my);
        rv_main.setAdapter(adapter);
        rv_main.setLayoutManager(new LinearLayoutManager(this));

        btn_send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                int img = rd.nextInt(5);


                long mNow = System.currentTimeMillis();
                Date mReDate = new Date(mNow);
                    SimpleDateFormat sdf = new SimpleDateFormat("a hh:mm",Locale.KOREA);
                    String getTime = sdf.format(mReDate);

                    String name = "박진영1";
                    String content = edt_content.getText().toString();
                    String time = getTime;

                    datas.add(new DirectVO(name,content,time,imgs[img]));
                    rv_main.smoothScrollToPosition(datas.size()-1);


            }

        });
    }
}

==================

public class DirectViewHolder extends RecyclerView.ViewHolder {
    // 상속(extends)시 오류는
    // 1.상위클래스가 추상클래스여서 추상메소드 오버라이딩해야할때
    // 2.상위클래스에 매개변수가 있는 생성자가 설계되어 있어서 super 호출해야할때


    //templete에 있는 view들을 저장하는 역할을 한다.
    //그러므로 모든 view를 필드에 생성해야한다.

    ImageView img;
    TextView tv_name,tv_content,tv_time;
    TextView tv_mymsg;
    TextView tv_mytime;
    public DirectViewHolder(@NonNull View itemView) {
        //생성자의 맨첫줄
        //templete을  자바 inflate

        super(itemView);

        img=itemView.findViewById(R.id.img);
        tv_name=itemView.findViewById(R.id.tv_name);
        tv_content=itemView.findViewById(R.id.tv_content);
        tv_time=itemView.findViewById(R.id.tv_time);
        tv_mymsg = itemView.findViewById(R.id.tv_mymsg);
        tv_mytime = itemView.findViewById(R.id.tv_mytime);
    }
}

=======================

public class DirectAdapter extends RecyclerView.Adapter<DirectViewHolder> {
    //필드 2개 datas , context
    private ArrayList<DirectVO> datas;
    private Context context;
    private String my;
    //생성자를 만들어서 값을 전달받는다
    public DirectAdapter(ArrayList<DirectVO> datas, Context context, String my) {
        this.datas = datas;
        this.context = context;
        this.my = my;
    }

    @NonNull
    @Override
    public DirectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //뷰홀더를 생성하는 곳
        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) {
        //position 번째 메세지의 주인이 Main에서 전달받은 name과 같다면
        if (datas.get(position).getName().equals(my)){
            // 오른쪽 view살리기
            holder.tv_mymsg.setVisibility(View.VISIBLE);
            holder.tv_mytime.setVisibility(View.VISIBLE);
            // 왼쪽 view날리기
            holder.tv_name.setVisibility(View.GONE);
            holder.tv_time.setVisibility(View.GONE);
            holder.tv_content.setVisibility(View.GONE);
            holder.img.setVisibility(View.GONE);
            // 오른쪽 view에 setText
            holder.tv_mymsg.setText(datas.get(position).getContent());
            holder.tv_mytime.setText(datas.get(position).getTime());
        }else {//남이 보낸 메세지라면
            // 오른쪽 view날리기
            holder.tv_mymsg.setVisibility(View.GONE);
            holder.tv_mytime.setVisibility(View.GONE);
            // 왼쪽 view살리기
            holder.tv_name.setVisibility(View.VISIBLE);
            holder.tv_time.setVisibility(View.VISIBLE);
            holder.tv_content.setVisibility(View.VISIBLE);
            holder.img.setVisibility(View.VISIBLE);
            // 왼쪽에 setText
            holder.img.setImageResource(datas.get(position).getImg());
            holder.tv_content.setText(datas.get(position).getContent());
            holder.tv_name.setText(datas.get(position).getName());
            holder.tv_time.setText(datas.get(position).getTime());
        }

    }

    @Override
    public int getItemCount() {
        return datas.size();
    }
}
profile
꾸준히

0개의 댓글