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
반응형
728x90
반응형

간단하게 말하자면 json파일을 읽어올 수 없다는 오류입니다.

 

 

1. json 파일 문제

json 파일을 제대로 넣은건지 확인하셔야합니다.

이미 넣으셨다면 지웠다가 다시 넣어보시는걸 추천드립니다.

 

 

2. sdk 파일 문제

OpenCV를 활용하기 위해 sdk 파일을 사용하고 계실텐데요. 이유는 알 수 없지만 갑자기 sdk의 내용이 수정되었는지 아래와 같은 오류가 나타났습니다. sdk를 새로 넣으니 문제가 사라졌습니다. 이걸로 이틀정도 고생을 했는데 다들 해결하시길 바랍니다.

Execution failed for task ':opencv:processDebugGoogleServices'.

728x90
반응형
728x90
반응형

- 파이어베이스 JSON 형태

 

 

 

 

- 중복 검사 코드

databaseReference.child("Together_group_list").child(Gname_edit.getText().toString()).child("gname").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            String value = snapshot.getValue(String.class);

                            if(value!=null){
                                Toast.makeText(getApplicationContext(),"이미 존재하는 그룹명입니다.",Toast.LENGTH_SHORT).show();//토스메세지 출력
                            }
                            else{
                                addGroup(Gname_edit.getText().toString(),Gintro_edit.getText().toString(),Gcate_tv.getText().toString(), goaltime, gmp);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            // 디비를 가져오던중 에러 발생 시
                            //Log.e("MainActivity", String.valueOf(databaseError.toException())); // 에러문 출력
                        }
                    });

Together_group_list 안에 본인이 입력한 글자(그룹명) 안에 gname 키에서 그룹명을 value에다가 뽑아냅니다.

 

그리고 value가 null과 같지않다면 글자가 있다는것이고, 그것은 해당 그룹이 존재한다는 말이기 때문에 중복됨을 알 수 있습니다. 그래서 "이미 존재하는 그룹명입니다."라고 토스트 메시지를 띄웠습니다.

 

else의 경우는 null이라고 생각하면 됩니다. 그 말은 즉슨, 아직 본인이 입력한 글자의 그룹명이 존재하지 않는다는 것이고, 중복되지 않는다는 말 입니다. 그래서 해당 그룹명을 가진  그룹을 추가해줬습니다.

728x90
반응형
728x90
반응형

Activity에서 새로고침 하기

		finish();//인텐트 종료
                    overridePendingTransition(0, 0);//인텐트 효과 없애기
                    Intent intent = getIntent(); //인텐트
                    startActivity(intent); //액티비티 열기
                    overridePendingTransition(0, 0);//인텐트 효과 없애기

 

 

 

Adapter에서 새로고침 하기

			Intent intent = ((Activity)context).getIntent();
                        ((Activity)context).finish(); //현재 액티비티 종료 실시
                        ((Activity)context).overridePendingTransition(0, 0); //효과 없애기
                        ((Activity)context).startActivity(intent); //현재 액티비티 재실행 실시
                        ((Activity)context).overridePendingTransition(0, 0); //효과 없애기
728x90
반응형
728x90
반응형

포커싱과 터치가 안되도록 하는 부분만 넣어주면 됩니다.

 

저는 클릭이 안되는 것을 사용자에게 알리기 위해, 에딧텍스트에 회색 배경을 설정하였습니다.

Gname_edit.setBackgroundColor(ContextCompat.getColor(this,R.color.Gray));//배경색 설정
Gname_edit.setFocusable(false);//포커싱과
Gname_edit.setClickable(false);//터치가 안되도록!

 

728x90
반응형
728x90
반응형

원하는 부분에 이 코드만 넣어주면 됩니다.

 

contenxt는 아마 Adapter 구현을 하면서 Activity에서 받아오는 값으로 지정되어있을겁니다.

((Activity)context).finish();

 

728x90
반응형

+ Recent posts