묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
RecyclerView.Adapter vs ListAdpater
안녕하세요.ListAdapter로 리사이클러뷰를 생성할 때의 장점으로는 notify관련 함수를 개발자가 일일이 설정해줄 필요가 없고, DiffUtil을 통해 데이터 셋의 차이를 빠르게 계산해준다는 점이 있다라고 말씀해주셨는데 ... 그럼 기존의 Recyclerview.Adapter는 사용하지 않는 편이 더 좋은걸까요? 아니면 ListAdapter에 이러한 장점들이 있음에도 불구하고 Recyclerview.Adapter가 꼭 쓰여야하는 특별한 상황이 남아있을까요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
개복치개발자님 부탁드립니다!!
ListView로 게시글 만들고 읽고 보는 강의까지 전부 보고 실습해봤는데 강의가 정말 좋으셔서 잘 따라갈수 있었던것 같습니다. 그래서 정말 저한테 많은 도움이 되었습니다. 정말 감사합니다. 근데 혹시 ListView말고 RecyclerView로 만드신 게시글 만들고 읽고쓰게하는 강의는 만드실 생각이 없으신가요? RecyclerView가 더 안정적이고 좋다는 평이 많은데 확실히 ListView보다는 난이도가 어려워보입니다... 혹시 강의 가능하시다면 부탁드립니다!!
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
RecyclerView 7분중 GroupieViewHolder 자동입력과 UserItem을 Implement Members하는법을 모르겠어요.
1:1채팅 만들기(Android + Kotlin + Firebase) RecyclerView 7분 ChatListActivity.kt package com.example.chatting_videoimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport kotlinx.android.synthetic.main.activity_chat_list.*class ChatListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_chat_list) val adapter = GroupAdapter<GroupieViewHolder>오류코드e: C:\Users\MS\AndroidStudioProjects\chatting_video\app\src\main\java\com\example\chatting_video\ChatListActivity.kt: (12, 23): Unresolved reference: GroupAdapterLoginActivity package com.example.chatting_videoimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Logimport com.example.chatting_video.Rimport com.google.firebase.auth.FirebaseAuthimport kotlinx.android.synthetic.main.activity_login.*class LoginActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth private val TAG = LoginActivity::class.java.simpleName override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) auth = FirebaseAuth.getInstance() login_button.setOnClickListener { val email = login_email.text.toString() val password = login_password.text.toString() auth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithEmail:success") //데이터베이스에 유저 정보 넣어줘야 합니다. val intent = Intent(this, ChatListActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithEmail:failure", task.exception) } } } }}MainActivity package com.example.chatting_videoimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport com.google.firebase.auth.FirebaseAuthimport kotlinx.android.synthetic.main.activity_main.*import android.util.Log as Logimport kotlinx.android.synthetic.main.activity_main.login_button_main as login_button_mainclass MainActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth // ... // Initialize Firebase Auth private val TAG: String = MainActivity::class.java.simpleName override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) auth = FirebaseAuth.getInstance() join_button.setOnClickListener { val user = hashMapOf( "first" to "Ada", "last" to "Lovelace", "born" to 1815 ) val email = email_area.text.toString() val password = password_area.text.toString() auth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "성공") val uid = FirebaseAuth.getInstance().uid // Create a new user with a first and last name val user = hashMapOf( "first" to "Ada", "last" to "Lovelace", "born" to 1815 ) // Add a new document with a generated ID val intent = Intent(this, ChatListActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) } else { Log.d(TAG, "실패", task.exception) } } } login_button_main.setOnClickListener { val intent = Intent(this, LoginActivity::class.java) startActivity(intent) } } }여기선 성공 실패 코드를 지운게 있어요. 넣으면 오류가 걸려서 지웠어요. // Add a new document with a generated IDdb.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }db.이부분이 빨간색이 되었어요. 어떻게 해야하나요? User ackage com.example.chatting_videoclass User(val uid : String, val username : String)UserItem.kt package Modelimport android.content.ClipDataclass UserItem : ClipData.Item<GroupieViewHolder>(){}여기에서는 GroupieViewHolder라는 명령어가 자동입력이 되지 않고 빨간색이 뜹니다. activity_chat_list.xml <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/recyclerview_list" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ChatListActivity"> <androidx.recyclerview.widget.RecyclerView android:layout_width="344dp" android:layout_height="572dp" android:layout_marginStart="20dp" android:layout_marginLeft="20dp" android:layout_marginTop="40dp" android:layout_marginEnd="20dp" android:layout_marginRight="20dp" android:layout_marginBottom="40dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.761" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.632" /></androidx.constraintlayout.widget.ConstraintLayout> 여기서는 app:layoutManager="android.recyckerview.widget.LinearLayoutManager"를 넣었습니다.activity_login.xml <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout 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="#a6d8fe" tools:context=".LoginActivity"> <EditText android:id="@+id/login_email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="85dp" android:ems="10" android:inputType="textPersonName" android:hint="login_email" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/login_password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:ems="10" android:inputType="textPersonName" android:hint="login_password" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/login_email" /> <Button android:id="@+id/login_button" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="80dp" android:text="login_button" android:background="#fb7606" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/login_password" /></androidx.constraintlayout.widget.ConstraintLayout>activity_main.xml <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout 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="#a6d8fe" tools:context=".MainActivity"> <EditText android:id="@+id/UserName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="85dp" android:ems="10" android:inputType="textPersonName" android:hint="UserName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.502" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/email_area" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:ems="10" android:inputType="textPersonName" android:hint="email_area" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.497" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/UserName" /> <EditText android:id="@+id/password_area" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:ems="10" android:inputType="textPersonName" android:hint="password_area" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.502" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/email_area" /> <Button android:id="@+id/join_button" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="join_button" android:background="#fb7606" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.473" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/password_area" /> <Button android:id="@+id/login_button_main" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="36dp" android:text="login_button" android:background="#fb7606" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.473" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/join_button" /></androidx.constraintlayout.widget.ConstraintLayout>message_list_row.xml <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout 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="80dp"> <TextView android:layout_width="73dp" android:layout_height="26dp" android:layout_margin="20dp" android:text="name" tools:layout_editor_absoluteX="10dp" tools:layout_editor_absoluteY="30dp"> </TextView> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:text="message" tools:layout_editor_absoluteX="130dp" tools:layout_editor_absoluteY="30dp"> </TextView></androidx.constraintlayout.widget.ConstraintLayout>name messagename messagename message 이게 어떻게 뜨는지 궁금해요. video\app\src\main\java\com\example\chatting_video\ChatListActivity.kt: (12, 23): Unresolved reference: GroupAdaptere: C:\Users\MS\AndroidStudioProjects\chatting_video\app\src\main\java\com\example\chatting_video\MainActivity.kt: (36, 13): Unresolved reference: db이런오류들을 어떻게 해결해야 하나요? val adapter = GroupAdapter<GroupieViewHolder>를 인력하면 빨간색으로 떠요자동입력이 안되요. implementation "com.xwray:groupie:$groupie_version" 2.9.0은 어떻게 입력하는 것인가요? 이걸 그대로 입력하면 오류가 떠요. GroupAdapter와 GroupieViewHolder가 입력되는 부분이 없어서 빨간색 오류가 뜨고, 실행이 안되요. 무슨 코드를 추가해야 이것들이 자동 입력이 되나요? 그리고 수업강의하실때 만들었던 원본 파일있으시면 공유가능할까요? 제거랑 비교하면서 코드를 짜려고요.
-
미해결누구나 할 수 있는 안드로이드 앱 개발 - 2 (Kotlin)
itemClick != null 에 대하여
<1-3. 콘텐츠 앱 - itemClick, WebView 강의> 09:30) if(itemClick != null) 로 묶어주는데, itemClick 이 null이 아닌 경우에 실행한다. 라는 의미가 무엇인가요? 답변 부탁드려용, 감사합니당.
-
미해결누구나 할 수 있는 안드로이드 앱 개발 - 2 (Kotlin)
Interface 생성 이유
<1-3. 콘텐츠 앱 - itemClick, WebView 강의> 안녕하세용, 우와 RecyclerView에 Click 추가하는 부분이 어렵네용 (문법 파악이 아직 덜되어서 더 그런듯합니당. ㅠ) 07:21) ItemClick 이라는 interface 를 먼저 생성해주고, 그 후에 var형 변수로 선언해서 요리조리 사용하시던데 interface로 요렇게 따로 생성을 하고 시작하는 이유가 있나요? interface 에 대해서 구글링해보아도 요것의 용도를 잘 이해하지 못하겠어서요! ㅠ_ㅠ