Multiple Items in Listview (RecyclerView) in Android Studio – Part 5

안녕 모두, 내 이름은 Oum Saokosal입니다 우리는 안드로이드 RecyclerView에서 우리의 교훈을 계속할 것입니다

우리는 안드로이드 RecyclerView MySQL 데이터베이스에 연결에 대해 얘기하고 우리는 Volley와 PHP를 거친 다음 PHP가 MySQL에 연결하고 이전 비디오, 우리는 Volley와 Part 1, Part 2, Part 3, 우리는 RecyclerView에 대해 이야기했습니다 자, 이제부터 PHP에서 데이터를 얻는 방법에 대해 계속하겠습니다 사실, 우리는 PHP와 MySQL의 코드에 대해 조금 이야기했습니다 이것은 내 YouTube 채널, Facebook, Twitter 및 github입니다 좋아요, 그래서 이것은 우리가 이야기 할 부분입니다

그리고 이것은, 당신도 마찬가지입니다 웹 서버로 이동하여 데이터베이스 루프백에 연결하고 다시 보내면 우리는 Volley에 대해 이야기합니다 이미 알았습니다이 동영상에서 StringRequest에 대해 이야기하겠습니다 좋아, 그리고 마지막으로 할 일은 JSON 텍스트를 ArrayList로 변환하는 것이다

자, 안드로이드로 돌아가 보자 우리는 MySingleton을 가지고 있습니다 좋아요이 클래스는 요청보기를 여기에서 얻을 수있는 클래스입니다 전장에서 지휘관 한 명만 갖고 싶기 때문에

우리는 많은 지휘관을 갖고 싶지 않으므로 이제 우리 데이터베이스를 이렇게 확인해 보겠습니다 그리고 데이터베이스를 보자 이것은 JSON 일 뿐이며 고객 / 제품 내부의 PHP에서 가져 왔습니다 Part 4에있는 이전 부분으로 돌아 가라 그러면 소스 코드를 다운로드 할 수있다

이전에, 아마도 나는 아직 그것을 지퍼로 열지 않았을 것입니다 그래서 계속하기 전에 그것을 할 수있는 좋은시기 일 수 있습니다 괜찮아 나는 그 일을 잊어 버렸다 그래서 복사 만하고, 데이터베이스 일 수도 있고, 고객과 수출 일 수도있다

나는 그 일을 잊어 버렸으므로 지금은 그것을 볼 좋은 시간이다 파일이 많이 있지만, 그 중 일부만 있으면됩니다 알겠습니다 그러면 우리는 그것을 넣을 것입니다 여기에서는 반드시 열어서 웹 서버의 적절한 폴더에 넣으십시오

괜찮아 당신은 그것을 가져 오는 법을 알고 있습니다, 그리고 이것이 코드이고 당신이 원한다면 그것을 바꿀 필요가 있습니다 데이터베이스 이름, 알았어, 암호 또는 기타를 변경하려면, 이것은 전형적인 코드 일뿐입니다 데이터를 읽을 수 있습니다 나는 그것을 조금 설명 할 것이다 그러나 그렇게 어렵지는 않다

단지 그것을 따라 가라 좋아요, 그리고 나서 압축해야합니다 압축하십시오 좋아, 이걸 보니 업로드 할게, 알았어 이제 우리 수업을 계속하자

우리가 사용할 데이터베이스는 고객이고 테이블은 제품이므로 우리는 테이블을 나타내는 클래스를 만들거나 다른 클래스를 만들 것입니다 클래스, 나는 그것을 제품이라고 부르겠다 알았어 직렬화 가능하며 현재 공용 클래스 Product는 Serializable { public int pid; public string name; public int qty; 공개 더블 가격; } 플로트가 그런 식으로 이루어지기 때문에 플로트를 사용해서는 안됩니다 원하지 않습니다

그런 식으로 사용하십시오 따라서 double을 사용하십시오 공용 문자열 image_url; user_ID를 사용하면됩니다 사실, 당신이 잠그면, A 사용자, 그 다음엔 사용자 A의 일부 항목을 표시하려고하지만이 자습서에서는 그렇게하지 않을 것이므로 당신이 그것을 사용하든 원하지 않든, 실제로는 사용하지 않을 것입니다 그런 식으로 넣어

자, 이제 ItemAdapter가 item을위한 것이므로 여기서는 사용하지 않을 것입니다 다른 하나를 만들겠습니다 ProductAdapter입니다 코드가 매우 비슷하기 때문에 그냥 코드를 복사하면, 여기에서 올거야 그럼 내가 바꿀거야, 그래서 이건 ProductAdapter와이 제품은 여기에 동일해야합니다

예! 그런 다음 ViewHolder가 필요합니다 이 네 가지 항목에서 그것은 제품이므로이 제품입니다 나는 이것도 바꿀 것입니다이 것 우리는 이것을 바꿀 것입니다

먼저 삭제하겠습니다 혼동하고 싶지 않습니다 이건 어쩌면 당신 ______과 그럼 또 다른 레이아웃이 필요합니다 레이아웃이 이미 완료되었으므로 복사하여 붙여 넣습니다 당신이 이해하지 못하는 경우를 대비해서, 그 상황 뒤에있는 상황을 알기를 바랍니다

파트 1, 2, 3을 볼 시간이 필요합니다 왜냐하면 나는 같은 시간을 낭비하고 싶지 않기 때문입니다 이 비디오에서 다시 한 번, 이제 우리는 이미 8 분 안에 있습니다 그래서,이 하나는 CardView, 내가 제품으로 변경됩니다 그리고 어쩌면 내가 이름을 사용하려면, 가격은 품질이 그것을 필요로하지 않기 때문에, 우리 주식의 양은 필수적이며, 그러나 단지 이름이 붙여지고, 상금과 이미지가 그 것이다 이건 이미지이고 괜찮아요

아마 다른 이름이 필요할 것입니다이 이름은 이름입니다 네,이게 맨 위에 있거나 뭔가있을 거예요 이전 것을 확인하겠습니다 어쩌면, 우리는 이것을 시도 할 것입니다

예, 예, 괜찮습니다, 예! 이걸 제가 말하고 싶은 것은 이미지뿐만 아니라 나는 그것을 끌고 싶다 ' 끔찍한 음! 좋지 않아 알았어, 내가 해줄 께

나는 그것을 지우고 싶다면 그냥 지우십시오 좋아, 이제 너는 300을 가지려고하고 나면 이미지에서 가지고 싶다 그래서 소스를 넣는다 여기서 안드로이드 drawable / pp는 여기에있는 이미지이고 scaleType은 centerCrop입니다 좋아, 이건 200이 될거고 우리는 또 다른 _____을 쓸거야, 그럴 수있어? 예, 여기가 텍스트 이름이고 다른 가격을 원합니다

이제 자동으로 추가 된 속성과 같은 항목이 있기 때문에 더 좋습니다 나는 그것이 무엇인지 잊었다 그래서 이름을 바꾸어 봅시다 IvImageURL이 될거야, 맞아! 이 하나는 tvName과 tvPrice입니다 우리는 이것을 바꿀 것이기 때문에 아래 레이아웃이이 것입니다

이건 같은,이, 그리고 한 가지 더, 그것은 항상 색상, 문제는 기본 색상이 표시되지 않으므로 여기서 색상을 사용하겠습니다 만약 당신이 그것을 사용하고 싶다면, 당신도 알다시피, [우물 우물쭈물 소리]처럼 16 진수 색상으로도 괜찮습니다 이제 하나의 이미지와 두 개의 텍스트 상자 유형보기가 있습니다 자, 이제 우리는 ProductViewHolder를 만들려고합니다

그래서 CardView 이제는 cvProduct 및 IvImageURL, tvName 및 TV 가격 알았어 그래서 이것은 제품에 대한 ViewHolder입니다 그런 다음 항목이 아닌 여기에 제품이 필요합니다 그래서 여기에도 제품이 필요합니다

좋습니다 만약 굴절시키고 싶다면 그냥 이런 제품으로 바꾸십시오 이건 아직 바뀌지 않았어, 알았어! 이제 새로운 레이아웃을 여기에 부풀려 야합니다 product_cardview_layout입니다 우리가 방금 만든거야, 알았어

이제는 이걸 제외하고는 괜찮아 보입니다 우리는 뭔가를 여기서 묶을거야 그래서 처음에는 텍스트가 더 낫다 그래서 우리는 여기서 제품을 얻을 것입니다 그리고 그것은 무엇입니까? 여기에있는 제품들과 어떤 위치에서, 이 제품 및 홀더 다음 텍스트를 이름에 넣을 수 SetText 이런, 제품 및 이름

한가지 더 가격은이 가격은하지만 가격은 두 배입니다 맞아요 여기에 문자열, 그리고 다시 피카소 알았어 Picasso

width (context) load (productimage_url) placeholder (Rdrawable

pp) error (androidRdrawablestat_notify_error)

into (holderivImgUrl); ViewHolder 측면입니다 좋습니다 이제 좋습니다 자, 이제 싱글 톤, 제품 클래스 그리고이 하나의 아이템을 가지고 있습니다

그러나 우리는 그렇지 않습니다 데이터를 가지고있어, 알았어, 우리는 더 이상 아이템을 사용하지 않을 것이다 더 나은, 그리고이 하나 이제 나는 use을 사용할 것이다 ArrayList <product> ProductList = getDataFromServer (); 우리가 할 수 있을까요? 나는 우리가 싱글 톤을 사용할 것이기 때문에 우리가 할 수 있다고 생각하지 않는다, 아마 우리는 그것을 조금해야만한다

나중에,하지만 이걸 끝내자 이 항목은 더 이상 항목이 아닙니다 그게 제품이야, 알았어 이제 우리가 얻고 자하는 데이터는 여기에서 나온 것이 아니고, JSON의 웹에서 온 것입니다 그런 다음 여기에서 발리 (Volley)를 사용할 필요가 있습니다

그러면 우리가 서버에서 얻을 수있는 것입니다 이제 RecyclerView는 괜찮아 보이지만 Volley를 사용해야하므로 호출해야합니다 여기에 StringRequest가 있고 StringRequest에는 네 개의 매개 변수가 있음을 기억하자 메소드, URL, 응답 및 오류 (좋아, 새로운 StringRequest, 요청 방법 및 사용자) 단지 데이터를 얻고 싶습니다 좋아, URL

그래서 지금은 Google을 테스트하고 테스트하기가 쉽기 때문에 Google에서 테스트하고 싶습니다 여기서 �S forget을 잊어서는 안되며, 지역 호스트에서 ���도 괜찮습니다 이제 두 개 더 필요합니다이 하나가 응답이고 다른 하나가 오류입니다 알았습니다

당신은 여기에서 지저분해질 것입니다 그래서 당신은이 ok, 4 개의 세미콜론을 좋아할 것입니다 그리고 아마도 이것과 같이하는 것이 좋습니다 CtrL + Space를 입력하십시오 우리는 제안으로 볼 것입니다

이것은 데이터 리스너 응답이며이 중 하나 인 CtrL + Space, 오류 리스너입니다 따라서 여기에 오류가 발생할 때마다 오류가 표시됩니다 오류가 발생하지 않는 경우를 대비해서, 너는 아무것도 볼 수 없을거야 오류가 발생하면 오류가 종료되는 것처럼 테스트해야하므로 그 의미는 약간의 오류가 있으므로 오류 결과를 _____에 표시하려면 오류를 닫는 것이 좋습니다 나 한테 뭔가 잘못된 것처럼 말할 수있어, 알았어

이런 식으로 사용자를 놀라게하고 싶지는 않지만, 우리는 로그하고 볼 필요가 있습니다 오류, 그래서 우리는 태그, 오류가 있어야합니다, 당신은 여기에 메시지를, 그리고 여기에 태그를 대개 여기서 이름을 사용하십시오 그래서 최종 문자열 TAG = �MainActivity�; 이런, 괜찮아! 자, 이제 실제 코드를 사용하겠다는 응답을 얻고 싶습니다

로그이므로 결과는 여기서 ______로 표시되므로 데이터를 가져올 지 알 수 있습니다 Google에서 제공했는지 여부 좋아,이 중 하나는 사용할 수 없으므로 이제 실행 해 보겠습니다 로컬 호스트를 테스트하는 것이 에뮬레이터에서 가져 오는 것이 좋습니다 하지만 지금은 먼저 Google을 테스트 해 보도록하겠습니다

잊어 버리면 잊지 않을 것입니다 오류가있다 Ok, 오! 나는 이것을 잊었다

방금 StringRequest를 호출했지만 Singleton에 추가하지 않았습니다 Singleton은 현장에서 지휘관과 같다고 생각합니다 이전 비디오에서 설명했습니다 이것을 사용할 수는 있지만 사용하는 것이 좋습니다 그것과 같은 ApplicationContext는 큐를 추가하고 여기에 StringRequest를 추가한다

한 번 더 테스트를 한 후 여기서 내부 호스트를 테스트 할 것입니다 이전 비디오에서 말했던 것처럼 다음과 같은 두 가지 공통적 인 문제가 나타납니다 1 금지 된 사용 권한 2

JSON malfom 이 문제는 많은 문제를 일으킬 수 있으므로 여기에서 연결할 수 있는지 확인하십시오 이제 구글을 보자 이제 구글을 볼 수있다 예! 우리는 그것을 볼 수 있습니다

여기 아래에 있습니다 찾을 수 없다면 MainActivity를 입력하십시오 태그를 사용했기 때문입니다 네, 수업의 이름으로 태그를 볼 수 있습니다 다음은 Google입니다

이제 인터넷에 연결할 수 있음을 의미합니다 이제는 로컬 호스트를 테스트하는 좋은 시간이고 로컬 호스트에는 's'및 또한이 같은 로컬 호스트 말할 수 없다! 별칭 1003

2를 넣어야합니다 나 같은 동작이 필요한 경우 숫자 10032를 사용해야하지만 u가 실행되는 경우 위의 옵션이있는 것처럼 숫자 10

022와 같이 사용할 수 있습니다 if BlueStacks를 사용하고 100

22도 사용하십시오 예를 들어 현재 포트 번호가 80 인 경우 다른 포트를 사용하는 경우 여기에 열 다음에 전체 URL의 경로를 지정해야합니다 이런 식으로 복사하여 붙여 넣는 것이 좋습니다하지만 여기서는 1 번부터 테스트해야합니다

당신은 을 입력해야합니다 좋아, 테스트 해보자 내가 실행할 수 있는지 없는지 설명 할거야

자, 이제 JSON을 여기에서 얻을 수 있습니다 그러나 언젠가는 이것을 가지고 있지 않을 것입니다 이걸 보게되면, 행운을 빈다 그러나 그렇지 않다면, 돌아가서 ''라고 타이핑해야한다 과 나는 너를 잘 이해할 수 있기 때문에 너희들 대부분이 나 같은 행운이되지 않을 것이다

그리고 나는 항상 그렇게 해 나는 그것을 고치는 법을 알고 있지만, 당신을 위해, 나는이 문제를 계속해서 반복 할 것이라고 생각합니다 다시 한 번 질문을 많이 했으므로 이제 어떻게 해결할 수 있는지 보여 드리겠습니다 YouTube 시청자 따라서 http를 입력해야합니다

좋아요 다음과 같이 입력 할 수 없습니다 Google은 사용자가 무언가를 입력 할 때 여전히 필요로하는 것처럼 입력하므로 http, 1003

2 및 ENTER를 입력하십시오 이런 것을 볼 수 있습니까? 좋아, 그렇지 않으면 구성 및 구성 파일로 이동하여 수정해야합니다 여기서도 허가를 변경하십시오 모두가 당연한 것으로 요구하십시오 임무가 거부 된 것처럼 보이면, 당신은 모든 부여 된 것을 요구하기 위해 변화합니다

좋아, 좋아 한 가지 더, JASON malform은 일반적으로 notepad ++입니다 그것은 당신이 여기에서 볼 때, 당신은 무언가를 앞에 볼 것입니다 두 개의 UTF, UTF-8이 있지만 다른 하나는 BOM이없는 UTF-8입니다 그래서 메모장 + + 및 다른 도구는 일반적으로이 서식이 있으므로 변경해야합니다

UTF-8로 오케이 메모장 + + 특히 당신은 메뉴에 가서 좋아해요 그것을 작동시키고 다른 텍스트 편집기를 사용한다면 스스로 처리해야합니다 어떤 텍스트 편집기를 사용하고 있는지 모르겠다 문제가 있다면, 이 비디오의 아래에, 나는 당신에게 말할 것입니다

자, 이제 텍스트를 얻었습니다 JSON을 가지고 있습니다 이제 JSON 텍스트를 변환하고 싶습니다 좋아, ArrayList에 마지막 부분 그래서 저는 이것을위한 도서관을 가지고 있습니다

직접 변환하려는 경우 라이브러리를 사용할 수 있습니다 이렇게 githubcom/kosalgeek에 가보십시오 그러면 KGJasonConverter에 가보겠습니다 나는 PhtoUtil과 같은 좋은 라이브러리를 가지고있다

FileCacher가있다 asynctask 1과 2 (MD5)에 대한 것이지만, 우리는 KGJasonConverter를 사용할 것입니다 당신이해야 할 일은 그것을 다운로드하고 GSON을 다운로드하는 것입니다 그래서 오른쪽 클릭을하십시오 그리고 나서 내 것을 다운로드하십시오, 그래서 그것을 다운로드하고, 그 재료를 변환하는 방법, 괜찮아

그래서, 당신은 GSON이 필요합니다 그리고 아마도 당신도 GRADLE을 사용할 수 있습니다 그러나 나는 잊었습니다 그것은 당신이 그것을 찾을 수 없다면, 단지 GSON을 다운로드 할 수 있습니다, 그 벌금, 그냥 다운로드, 알았어

그래서 당신은 이것을 필요로하므로, 당신도 이것을 필요로합니다 어디 있니? 맥 오 맥! 못 찾겠 어 어쨌든, 하나씩 복사하고 프로젝트로 가서 당신은 여기로, 당신은 프로젝트 파일로 이동하십시오 당신이 그것을 볼 수 없다면, 여기를 클릭하십시오, 프로젝트 파일 및 당신은 응용 프로그램과 libs에 가서 오른쪽 클릭 붙여 넣으세요, 알았어요 지금 라이브러리를 실행하고 추가하면 GSON도 필요합니다

이제 인덱싱을하고 있어요 건물을 통과 할 수 없기 때문에 조금 기다려야했습니다 비트 좋아, 이제 지나쳤다 오른쪽 다리와 라이브러리를 추가하십시오

이제 안드로이드로 돌아갈 수 있습니다 여기에서 Gradle을 다시 확인할 수 있습니다 이제는 컴파일러에서의 화재도 볼 수 있습니다 이제 내 라이브러리를 사용할 준비가되었습니다 여기에서 응답 내에서이 라이브러리를 사용할 것입니다

왜냐하면 여기가 하나의 ______ 방법과 같기 때문에, 당신이해야 할 일, 당신이 아는 모든 것 방법 안에서 수행해야하는 작업을 원한다면 당신은 데이터를 얻고 싶습니다, 당신은 얻을 수 없습니다, 당신은 ok 안에 들어가야 만합니다 파트너 옵저버를 안다면 다른 파트너를 만들 수 있습니다 인터페이스가 있지만, 실제로는 당신을 위해 일할 것입니다하지만 그걸 안으로하십시오, 알았습니다 여기에는 아주 작은 것이있을 것입니다

여기에 그것을 사용하려면 두 가지 방법이 있습니다 괜찮습니다하지만 바깥 쪽을 사용하려면, 괜찮아요, 그냥 이렇게 자르고 이것으로 바꾸세요 지금은 괜찮아요 그리고 그것은 classier를 구현하는 것과 같습니다

이런 식으로 밖에 좋은 방법이있어, 알았어 그리고 너는 밖에서 뭔가 쓸 수있어 하지만 당신이 사용하기를 원하지만 대부분 사람들은 그것은, 그러나 당신이 5를 따르는 것이 좋은 습관입니다 어쨌든 이제 JSON을 얻었으므로 변환 할 코드는 코드 한 줄에 불과합니다 예! 그냥 복사 해

알았어 그게 바로 복사해서 지금은 여기에서 바꾸고 싶습니다 그래서 이것은 제품 라인입니다 우리는 제품에 대해 이야기하고 있으며 이것은 다시 제품입니다 이제 JSON이 이것입니다, 알았습니다

이것은 ProductList입니다 이전 비디오에서 우리는 더미에서 데이터를 생성하는 것처럼 사용했습니다 이제 베타 버전이므로 지금 전화 해주세요 그래서이 코드는 외부에서 사용되었으므로 이제 여기에서 메서드를 사용하려고합니다 이제 ProductList가 JSON에서 가져오고 데이터를 넣습니다

ProductAdapter에 추가하십시오 사실, 여기에 ProductAdapter가 이미 생성되었으므로 지금은 좋습니다 여기에 데이터가 표시됩니다 문제는 이제 이미지를 볼 때 기억합니다 이미지 이름의 마지막 부분 만 넣습니다

괜찮아 그래서 이제 우리는 세 가지 ______를 갖습니다 왜냐하면 그 이미지는 URL 형식으로 이미지는 costumer 안에 있습니다 좋아요 고객과 이미지는 괜찮습니다

그래서 우리는 이것을 복사 할 것입니다, 좋아요, 여기, 여기, 여기에 그것을 사용할 것입니다 전체 URL과 실제 프로젝트에서 이와 같은 작업을 수행하는 것이 좋습니다 이 URL을 실제 URL로 변경하십시오 내 웹 사이트가 코사크 인 경우, 괜찮아 하지만 지금은 지역의 사람들을 위해서, 그냥 이렇게하고 우리가 이것 전에 슬래쉬하지 않는다는 것을 기억하십시오

우리는 여기에 슬래쉬를 추가 할 것이지만이 같은 공간과 제품은 여기에 없습니다 좋아, 좋아 보인다 이제, 여기에 새로운 LinearLayout과 LayoutManager가 있습니다 좋아요, 여기 안쪽에 어댑터를 설치하려고합니다 우리는 그것을 호출 할 것입니다

승인 좋아 보인다, 나는 그것이 지금 좋을 것이기를 바란다 그래서 여기의 이미지, 예! 제품 CardView 좋아,이 하나의 컨텍스트, 제품, 제품, 알았어! IvImageURL 및 tvName 및 tvPrice 좋아, 좋아 보인다, 달려 가자 서버가 실행 중인지 확인하십시오

와우! 그것은 매우 오랜 시간이 걸립니다 멈추게 해줘 알았지? 이것은 우리가 지금 데이터베이스 서버에서 얻은 데이터입니다 확인해 봅시다이 사진은 그림 1, 선택 3은 선택하지 않습니다

ID # 3이 처음입니다 일부 사진이 삭제되었으므로 그림 3, 예이 사진이 있습니다 오, 안돼, 안돼, 우리가 거꾸로하고, 잊어 버렸어 그래서 그것을 뒤집었고, 그래서 그것은 정상에서 11 번째가 될거야

하단에 # 3이 있으므로 이미지 # 6이 여기에 있습니다 네! 올바른 것입니까! 흠! 흥미 롭다 왜 이걸 가지고 있니, # 7? 보자 이건 12입니다, 알았어 맞아

첫 번째와 # 6, 예, 크기를 변경할 수 있습니다 패딩을 변경할 수 있습니다 너 괜찮아 그래서, 조금 요약 해 보겠습니다 여기에는 많은 단계가 있습니다

이것은 전체 단계이지만 RecyclerView의 일부일뿐입니다 여기 데이터가 있으면 여기서도 많은 단계가 필요할 것입니다 그렇습니다 세 가지 요청에서 네 개의 매개 변수, 알겠습니다 그러면 데이터를 얻은 다음 변환합니다

데이터 및이 라이브러리는 방금 사용했습니다 너는 너 자신을 쓸 수있다 그것은 거대한 일이 될 것입니다 여기 이전 부분이 있습니다 아시다시피, 여기가 새로운 것이고, Volley입니다

웹에서 가져온 데이터를 다시 검색 할 수 있습니다 URL이 잘못되었다고 가정 해 봅시다이 중 하나가 없으면 시도해보십시오 우리가 끝내기 전에 한가지 빨리 해보고 오류가 있는지 보자 그리고 지금 당신은 그것을 막을 것입니다

그래서 이것은 하나의 실수입니다 왜냐하면 이것은 마사지이기 때문에 두 개의 문자열을 넣어야합니다 다시 실행하십시오 현재 작동하고 있기 때문에 어떤 문제도 발생하지 않기 때문에 어쩌면 작동하지 않는 앱 일 수도 있습니다 내가 어떻게 그럴 수 있니, 어떻게하면 돼, 너도 알다시피, 너는 아마도 불평 할거야

그것에 대해 좋아, 이제 또 다른 유형, 다른 유형을 보자, ok 75 여기, 오류가 아닙니다 왜 당신은 그것에 대해 불평하고 있습니까, 아니면 언젠가 당신이 처음부터 그것을 다시해야 할 때가 있습니다 너도 알다시피, 그것은 이전의 것과 계속 같다 내가 다시 실행하게 해줘

좋아, 뭔가 잘못 됐어, 이제 서버 오류를 보자, 알았어 다시 한번 보자 우리가 다른 것을 얻을 수 있고 이렇게 메시지를 얻을 수 있다면 그렇게 할 수 있을까? 오, 여기 메시지를받을 수 없으니 괜찮습니다 그냥 이렇게하세요 괜찮습니다

그것을 아는 것이 좋다, 너는 알고있다 좋아, 이제 Android Volley에 대해 자세히 알고 싶다면 다음과 같이 제안하고 싶습니다 내 YouTube 채널로 이동하면 Android Volley에 대한 많은 동영상을 볼 수 있습니다 이 재생 목록에서 처음부터 시작합니다 예를 들어, 설정 및 방법 에서처럼 세 가지 요청 인 JSON을 사용하고, 업데이트하고 싶습니다

데이터 오류를 삽입합니다 Android Volley와 함께 할 수있는 다른 것들도 있습니다 마지막으로 잊지 말고 내 채널을 구독하고 엄지 손가락을주세요 만약 의견이 있으시면 아래에 의견을 남겨주십시오 당분간 나는 작별 인사를하고 싶습니다

그리고 나는 당신을 다음 번에 보게 될 것입니다 이미지 이름의 마지막 부분 만 알았어 이제 이미지가 URL 형식이되기 때문에 세 개의 ______가 있습니다 이미지는 costumer 안에 있습니다 좋아요

고객과 이미지는 괜찮습니다 그래서 우리는 이것을 복사 할 것입니다, 좋아요, 여기, 여기, 여기에 그것을 사용할 것입니다 전체 URL과 실제 프로젝트에서 이와 같은 작업을 수행하는 것이 좋습니다 이 URL을 실제 URL로 변경하십시오 내 웹 사이트가 코사크 인 경우, 괜찮아

하지만 지금은 지역의 사람들을 위해서, 그냥 이렇게하고 우리가 이것 전에 슬래쉬하지 않는다는 것을 기억하십시오 우리는 여기에 슬래쉬를 추가 할 것이지만이 같은 공간과 제품은 여기에 없습니다 좋아, 좋아 보인다 이제, 여기에 새로운 LinearLayout과 LayoutManager가 있습니다 좋아요, 여기 안쪽에 어댑터를 설치하려고합니다

우리는 그것을 호출 할 것입니다 승인 좋아 보인다, 나는 그것이 지금 좋을 것이기를 바란다 그래서 여기의 이미지, 예! 제품 CardView 좋아,이 하나의 컨텍스트, 제품, 제품, 알았어! IvImageURL 및 tvName 및 tvPrice 알았어, 좋아 보인다

서버가 실행 중인지 확인하십시오 와우! 그것은 매우 오랜 시간이 걸립니다 멈추게 해줘 알았지? 이것은 우리가 지금 데이터베이스 서버에서 얻은 데이터입니다 확인해 봅시다

이 사진은 그림 1, 선택 3은 선택하지 않습니다 ID # 3이 처음입니다 일부 사진이 삭제되었으므로 그림 3, 예이 사진이 있습니다 오, 안돼, 안돼, 우리가 거꾸로하고, 잊어 버렸어

그래서 그것을 뒤집었고, 그래서 그것은 정상에서 11 번째가 될거야 하단에 # 3이 있으므로 이미지 # 6이 여기에 있습니다 네! 올바른 것입니까! 흠! 왜 이걸 가지고 있니, # 7? 어디 보자 이건 12입니다, 알았어 맞아

첫 번째와 # 6, 예, 크기를 변경할 수 있습니다 패딩을 변경할 수 있습니다 너 괜찮아 그래서, 조금 요약 해 보겠습니다 여기에는 많은 단계가 있습니다

이것은 전체 단계이지만 RecyclerView의 일부일뿐입니다 여기 데이터가 있으면 여기서도 많은 단계가 필요할 것입니다 그렇습니다 세 가지 요청에서 네 개의 매개 변수, 알겠습니다 그러면 데이터를 얻은 다음 변환합니다

데이터 및이 라이브러리는 방금 사용했습니다 너는 너 자신을 쓸 수있다 그것은 거대한 일이 될 것입니다 여기 이전 부분이 있습니다 아시다시피, 여기가 새로운 것이고, Volley입니다

웹에서 가져온 데이터를 다시 검색 할 수 있습니다 URL이 잘못되었다고 가정 해 봅시다이 중 하나가 없으면 시도해보십시오 우리가 끝내기 전에 한가지 빨리 해보고 오류가 있는지 보자 그리고 지금 당신은 그것을 막을 것입니다

그래서 이것은 하나의 실수입니다 왜냐하면 이것은 마사지이기 때문에 두 개의 문자열을 넣어야합니다 다시 실행하십시오 현재 작동하고 있기 때문에 어떤 문제도 발생하지 않기 때문에 어쩌면 작동하지 않는 앱 일 수도 있습니다 내가 어떻게 그럴 수 있니, 어떻게하면 돼, 너도 알다시피, 너는 아마도 불평 할거야

그것에 대해 좋아, 이제 또 다른 유형, 다른 유형을 보자, ok 75 여기, 오류가 아닙니다 왜 당신은 그것에 대해 불평하고 있습니까, 아니면 언젠가 당신이 처음부터 그것을 다시해야 할 때가 있습니다 너도 알다시피, 그것은 이전의 것과 계속 같다 내가 다시 실행하게 해줘

좋아, 뭔가 잘못 됐어, 이제 서버 오류를 보자, 알았어 다시 한번 보자 우리가 다른 것을 얻을 수 있고 이렇게 메시지를 얻을 수 있다면 그렇게 할 수 있을까? 오, 여기 메시지를받을 수 없으니 괜찮습니다 그냥 이렇게하세요 괜찮습니다

그걸 알면 반가워요 좋아, 이제 Android Volley에 대해 자세히 알고 싶다면 다음과 같이 제안하고 싶습니다 내 YouTube 채널로 이동하면 Android Volley에 대한 많은 동영상을 볼 수 있습니다 이 재생 목록에서 처음부터 시작합니다 예를 들어, 설정 및 방법 에서처럼 세 가지 요청 인 JSON을 사용하고, 업데이트하고 싶습니다

데이터 오류를 삽입합니다 Android Volley와 함께 할 수있는 다른 것들도 있습니다 마지막으로 잊지 말고 내 채널을 구독하고 엄지 손가락을주세요 만약 의견이 있으시면 아래에 의견을 남겨주십시오 지금은 작별 인사를하고 싶습니다

가까운 장래에 만나겠습니다

DevBytes: ListView Cell Insertion Animation

[음악 재생] 안녕하세요, 제 이름은 Dan Olshansky입니다 저는 Google의 Android 팀에서 인턴입니다

그리고 오늘 저는 ListView 애니메이션에 대해서 이야기 할 것입니다 삽입 따라서이 데모에서 우리가하려고하는 것은 데이터 집합의 0 번째 인덱스에 새 객체 추가 ListView와 연결된 다음 해당 셀을 애니메이션 처리합니다 아래로 그것으로 그렇게 될 것이므로, ListView는 새로운 셀을위한 공간을 만들 것입니다

새 셀이 다시 애니메이션을 적용 할 때 아래쪽으로 움직입니다 그리고 나서, 멋진 작은 부분으로 애니메이션에서 우리는 이미지의 일부가 될 것입니다 새 요소가있을 때 셀이 올바른 위치로 움직입니다 그것에 추가됩니다 이 애니메이션에 대해 알아야 할 중요한 몇 가지 사항은 다음과 같습니다

몇 가지 트릭과 내가 만난 문제 중 일부는 사실 데이터 세트를 변경하면 일부 오브젝트 필요한 경우 더 이상 사용할 수 없습니다 레이아웃이 발생했습니다 그래서 당신이해야 할 일은 당신이 모든 것을 데이터 세트를 수정하기 전에 항목을 더 이상 참조가 없다면 데이터 세트를 수정하십시오 이러한 항목 중 일부는 여전히 목록보기의 경계는 필요하지 않으므로 그 후에는 더 이상 데모로 곧바로 뛰어 들어가서 우리가 가진 것은 버튼, 왼쪽으로 작은 원형보기

목록이 완전히 비어 있습니다 행 추가 – Animate는 새 셀을 만들고 아래쪽으로 움직입니다 원하는만큼 요소를 추가 할 수 있습니다 그 반복 루핑 보시다시피 아래쪽으로 움직입니다

ListView의 모든 요소는 애니메이션 아래에 있습니다 그 일이 일어날 때까지 원하는 경우 목록을 스크롤 할 수 있습니다 그러나 주목할만한 흥미로운 점은 심지어 이 이미지들 각각은 데이터 세트의 일부 임에도 불구하고 목록에있는 해당 항목과 관련된 정확한 셀, 우리가하고있는 일은 외부에서 이미지를 움직이는 것입니다 ListView의 올바른 위치로 ListView를 클릭 한 다음 스크롤하여 나중에 여기에 나열하십시오 그런 다음 코드를 살펴보면 삽입에 들어갈 수 있습니다

ListView, ListView를 확장하는 객체입니다 이 새 항목을 삽입 할 수 있습니다 그리고 당신이 볼 수있는 많은 다른 적용된 코드가 나온 후에 이후에 모든 기본 논리는 행 추가에서 발생합니다 먼저, 여기서해야 할 일은 먼저 참조를 얻는 것입니다 어댑터의 경우

그리고 나중에, 내가 할 일은 균형과 내 모든 항목의 drawables 데이터 세트가 변경되기 전에 ListView가 발생했습니다 그래서 저는 보이는 모든 세포를 반복 할 것입니다 그리고 모든 단일 셀의 스크린 샷을 찍을 것입니다 나는 그걸 저장할거야 또한 모든 단일 셀의 잔액을 가져 오려고합니다

그것을 해시지도도 마찬가지입니다 그래서 지금, 그 세포가 아직도 존재하는지 여부에 관계없이 데이터 세트를 변경 한 후에도 그들에 대한 언급이있다 그런 다음 아래로 내려 가면 실제로 새 객체를 추가합니다 내 데이터 세트에 추가하고이 테이블 ID를 추가하십시오 해당 항목에 해당합니다

내 배열 어댑터에 지정했기 때문에 안정된 ID의 경우는 true 그렇다면 새로운 안정적인 ID가 있는지 확인해야합니다 해당 요소에 추가되었습니다 그런 다음 레이아웃을 요청할 notifyDataSetChanged를 ListView 대신에 그러나 이것이 내가 살아 움직이기를 원하기 때문에, 공통점 이러한 애니메이션을 많이 사용하는 트릭은 onPreDrawListener를 사용하여 다시 한 번, onMeasure와 onLayout Layout은 이미 호출되었습니다

안에 포함 된 모든 위젯의 모든 최종 값 ListView는 이미 계산되었지만 아직 작성되지 않았습니다 아직 화면에 그려져있다 그래서 여기가 당신이하고 싶은 커스텀 애니메이션입니다 이미 참고 자료가 있으므로 여기에서 할 수 있습니다 모든 최종 값

따라서 onPreDraw로 이동하여 리스너를 제거하고 우리가 모든 것을 저장할 새로운 배열 목록 애니메이션 그래서 첫째로, 내가 새로운 셀을 0 번째 인덱스, 사용하고자하는 뷰입니다 많은 계산과 애니메이션이 필요합니다 그리고 내가 만들고있는 것은 ImageView 복사본을 만드는 것입니다 필요한 뷰를 실제로 애니 메이팅 할 수 없기 때문에 세포 안에서, 경계 밖에서, 그리고 그것을 넣으십시오

내가 필요로하는 곳 하지만 내가 할 일은 ImageView라는 새로운 사본을 만드는 것입니다 그 내용은 셀 자체의 ImageView 그런 다음, 그냥 그 위치에 애니메이션을 적용한 다음 제거합니다 더 이상 필요가 없을 때

그래서 새로운 행에 애니메이션을 적용하면 다른 것들 중 하나가됩니다 do는 그 셀과 연관된 텍스트를 움직 이기만하면된다 그것이 아래로 움직이는 때 그것을 안으로 퇴색하십시오 그리고 이미지와 관련해서, 제가 필요로하는 수학이 있습니다 어디에서 시작할지 결정할 끝내야 만합니다

그러나 그것이 끝나면, 당신이 정말로 알아야 할 것은 모두 셀의 ImageView를 보이지 않게 설정해야합니다 애니메이션이 진행되는 동안 사본 ImageView가 표시되어야합니다 나는 오버 슛 인터폴 레이터를 사용하고 x 그리고이 작은 이미지를 얻기 위해 이미지의 y 속성 시원한 터지는듯한 효과 그런 다음 새 셀 뷰에서 해당 위치로 애니메이션을 만듭니다 일단 끝나면 나중에 애니메이션을 할 수 있습니다

내 사본 ImageView 제거하고 설정 내 정상적인 시야를 정상으로 되돌립니다 그래서 더 아래로 스크롤 – 일단 데이터 세트 변경이 발생하면 이미 수정되었습니다 그렇다면, 나는 눈에 보이는 모든 아이들을 반복 할 것입니다 이 시점에서 ListView 그리고 내가 할 수있는 두 종류의 아이들이있을 것입니다

이에 상응하는 균형을 취하는 사람들과 해시지도 [INAUDIBLE] 원래 그리고 그렇지 않은 사람들 그들이 상응하는 균형을 가지고 있다면 그 의미는 ListView에서 볼 수 있다는 것입니다 애니메이션 이전에 애니메이션 후에 ListView 그래서 내가해야 할 일은 객체 애니메이터를 만드는 것입니다 그것을 이전 위치에서 새로운 위치로 변환합니다

그 시작 균형이 없다면, 그게 무슨 뜻인지 이 데모의 맥락에서 단 하나의 셀 이 구성을 가질 수 있습니다 그것은 이전에 ListView에 없었던 것을 의미하지만, ListView 후에 그리고 우리는 하나의 새로운 아이템을 ListView,이 인덱스는 0 번째 인덱스에 있어야합니다 그리고 저는 이것을 애니메이션으로 만들고 싶기 때문에 조금하겠습니다 높이가 무엇인지를 결정하는 수학적 비트, 구분선 높이가

그리고 나서, 나는 똑같은 것을하고 그것의 전이를 움직입니다 속성을 원래 있던 위치에서 가져 오려면 내가 레이아웃 이후에 원하는 곳으로 그리고 물론 저는 다른 이들이 필요하지 않기 때문에 더 이상, 나는 해시지도에서 그것들을 제거한다 그런 다음 아래로 스크롤하여 키 집합을 반복하면됩니다 내 해시지도에 남아있는 모든 항목, 이것이 의미하는 것 이것들은 ListView에 있던 아이템들이다

데이터 세트는 변경되지만 더 이상 ListView에 표시되지 않습니다 데이터 세트가 변경된 후 여기에는 외부로 이동 된 항목이 포함됩니다 새 항목 삽입으로 인해 ListView의 범위 그리고이 항목들은 더 이상 ListView 컨테이너, 내가 할 필요가 비트 맵을 사용하는 것입니다 이전에 캡처 한 드로어 블 (drawables) 내 ListView의 맨 위에, 그리고 마치 그들의 경계를 애니메이션 그들은 여전히 ​​ListView에있었습니다 경계선에 활력을 불어 넣기 때문에, 경계가 바뀔 때마다 내 시각을 무효화하여 ListView를 업데이트하십시오

그리고 좀 더 효율적으로하기 위해 [INAUDIBLE]로 무효화 내가 전체를 다시 무효화하지 않도록 ListView 및 모든 일회 만 다시 그리기 비트 맵 드로어 블 중 하나가 애니메이션으로 표시됩니다 그래서 모든 비트 맵 드로어 블을위한 애니메이션을 설정했습니다 그리고 나는 또한 내가 가지고있는 배열에 그것을 추가한다 mCellBitmapDrawables는 잠시 후에 메모 해 두겠습니다 애니메이션을 애니메이터 세트에 추가합니다

나는이 모든 것을 함께 움직인다 그리고 나서 결국 make와 같은 모든 기본 작업을 수행합니다 내 ListView를 다시 사용하도록 설정하면 ImageView가 실제 셀을 다시 표시하고 복사 이미지를 만듭니다 보이지 않는, 그런 것들 자, 이제 dispatchDraw에서, 여기에서 제가 사용할 것입니다

그 배열에 대응하는 모든 비트 맵 드로어 블의 배열 사라진 물건 나는 그들 모두를 통해 반복하고 그들을 끌어 올 것이다 매번 dispatchDraw가 호출되는 캔버스 여기서 주목해야 할 중요한 사항 중 하나는 크기는 단지 여분이 없다는 것을 확인하기 위해 제로입니다 새 Java 객체를 사용하여 완료 한 위치 그리고 더 아래로 스크롤, 수표 만있어

내가 애니메이션으로 애니메이션을 적용할지 여부를 확인하고 있습니다 새로운 이미지 또는 아닙니다 예를 들어, 여기를 아래로 스크롤 한 다음 행, 나는 정상에 있지 않아 애니메이션을 만들지 않을거야 그 이미지에서 반면에 내가 여기 있으면 새로운 ImageView가 애니메이션 처리됩니다

여기 아래로, 제가 복용하는 방법에 대한 더 많은 코드가 있습니다 ListView 셀의 스냅 샷과 어떻게 애니메이트 하는가? 자리에, 절대 위치를 얻는 방법뿐만 아니라 화면에서 내가 추가 ImageView가 어디에 있는지 알고 싶을 때 내가 그것을 움직일 장소를 결정할 때 필요합니다 그래서 그것은 새로운 세포를 삽입하는 방법과 거의 같습니다 ListView에 추가 된 것들을 애니메이트하십시오 — 감사

RecyclerView ins and outs – Google I/O 2016

MALE SPEAKER 1 : ListView는 Android 10부터 사용되었습니다

그리고 그것은 반복 된 구조를 다루기위한 것입니다 일관된 내용으로 더 구체적으로 말하자면, 이런 종류의 반복 된 구조를 간단한 설정 여기에서 볼 수 있듯이 이전 설정 화면이 있습니다 진저 브레드에서 그리고 이것은 이미 많은 확장을 한 후에 나타났습니다

ListView가 의도 한 것입니다 때로는 내용이 너무 일관 적이 지 않은 경우도 있습니다 그래서 당신은 서로 다른 뷰 타입을 가지고 있습니다 등등 그리고 우리는 단지 기능을 계속 추가했습니다

그러나 ListView가 해결해야하는 핵심 문제 그렇다면 어떻게 할 수 있을까요? 수백 톤, 수천, 아마도 더 많은 것들 보기 자체를 만드는 것은 정말 비쌀 수 있습니다 특히 안드로이드 초기 시대의 오래된 기기에서, 메모리는 제한적입니다 따라서 수만 개를 만들 수는 없습니다 한 번에 모든 것을 다룰 수 있습니다

그리고 대답은 우리가 속이는 것입니다 따라서 ListView를 사용하면 연기와 거울로 트릭을 만들 수 있습니다 UI 개발에 종사하는 모든 사람 무대 마술사와 공통점이 많습니다 무대 마술사는 잘못된 지시와 다른 종류를 사용합니다 당신을 생각하게 만드는 무대에서의 트릭 너는 너가 진짜가 아닌 것을보고있다

그리고 그것이 옳다면 그것은 옳습니다 그래서, 그들이 보는 것은 용어로 UI입니다 사용자가 믿는 것의 그래서 우리가 사용하는 속임수는 우리가 단지 창조하고 놓는 것입니다 사용자가 지금 볼 수있는보기를 사용자가 스크롤하면 더 많은 항목을 계속 배치합니다 당신 머리 속에 있어야 할 이미지 지금은 "월러스와 그로밋" 트랙을 빠르게 깔고있는 곳 움직이는 기차 앞에서

이것이 기본적으로 ListView가 작동하는 방식입니다 그리고 이것을 가능하게하기 위해, ListView 어댑터 구성 요소를 사용합니다 이제 이것은 제공되는 구성 요소입니다 응용 프로그램 자체 그리고 그것을 생성하고 채우는 데 사용됩니다

항목보기 수요에 이 getView 메소드는 어댑터에 있습니다 특정보기에 대해 어댑터를 쿼리하는 데 사용됩니다 해당하는 데이터 항목을 표시하려면 목록의 특정 위치로 이동합니다 그리고 우리가하는 특별한 트릭은 또한 특별한 변환보기를 전달합니다

동일한 항목 유형으로 보장되는 어댑터가 새로운 위치를 믿는다는 것 동일한보기를 재사용 할 수 있도록 인플레이션 비용을 다시 지불 할 필요가 없습니다 시간이 지남에 따라 계속해서 더 많은 기능을 추가했습니다 그들이 일이기 때문에 ListView에 그 사람들이 애플 리케이션에 필요한 그리고 이런 종류의 질문이 많이 생겼습니다 그래서, ListView 기능 후에 기능 후에 성장했다

그리고 I / O 2010에서이 이야기를 다시 볼 수 있습니다 네가 그 중 몇 개를보고 싶다면 그 이야기 조심해 정말 멋지 네요 너는 그것을 봐야한다

나는 그것을 즐겼다 네가 원하면, 네 그 이야기 중 일부에서 우리의 고전적인 UI의 일부를 볼 수 있습니다,뿐만 아니라, 네 멋지 네 하지만 실제로 우리가 계속 기능을 추가 할 때 ListView에, 우리는이 복잡성 당좌 대월 지점에 일종의 타격을 입혔습니다

우리에게는 너무 많은 특징이있었습니다 서로 상호 작용을하지만 실제로는 그렇지 않다 모두 그들 중 조금은 일회성이다 그리고이 모든 긴 꼬리 기능들이었습니다 매우 이상한 상호 작용을 많이 일으켰습니다

그것이 실제 의미하는 바는 무엇입니까? 모두가 앱을 썼다 그 일은 그들이 원했던 방식대로 작동했습니다 하지만 그 많은 것들은 정말로 정의되지 않은 행동의 결과 ListView 구현 그 자체 그리고 일단 충분한 앱이 그렇게하기 시작하면, 그렇다면 우리가 지원해야하는 사실상의 API입니다 ListView의 동작에 대한 작은 변화 이러한 핵심 사용 사례 중 일부를 개선 할 수 있습니다

일부 앱의 영웅 사용 사례를 깨뜨리는 결과를 낳았습니다 다른 곳에서 사용하고 싶습니다 우리는 또한 많은 중복 기능을 가지고있었습니다 ListView에서 ListView 선택 또는 View focus와 같이 우리는 사용합니까? 이미 뷰 계층 구조가 키보드 포커스 같은 것을 처리하는 방법을 알고있다 네비게이션 할 때마다, 그러나 ListView 자체적으로 완전히 다른 아이디어를 가졌다

이 현재 선택의 측면에서, 선택기 드로잉 (Drawable)은 뷰 뒤 또는 위에 그려지는데, 설정 한 구성에 따라 다릅니다 그리고 이로 인해 많은 부분이 중복되었습니다 그리고 그것뿐 아니라, 훨씬 복잡한보기를 사용하여 ListView 시작하면 항목을 전환해야합니다 이 setItemsCanFocus 옵션으로, ListView를 무효로한다 내부 선택 처리 및 대신 View 계층의 포커스 처리를 사용합니다 마찬가지로 항목 클릭 수신기 주변에서도 동일한 문제가 발생했습니다

보기 클릭 청취자 및 다른 종류의 일반적인 터치 손질 그래서 ListView는 아주 좋은 편의를 제공했습니다 ListView에서 항목 클릭 리스너를 설정할 수있는 곳 그 자체에 대한 클릭을 얻습니다 그 목록에서 발생합니다 자,이 말이 아주 의미가 있습니다

정말 균일 한 목록, 항목 목록이 있고 방금 그것에서 뭔가를 골라 내고 싶다 팝업 메뉴와 비슷하다 오버플로 메뉴에서 가져온 것 오늘 앱 상단 구석에 있습니다 그러나 대안으로, 클릭 청취자를 연결하십시오 이러한 견해 자체

그리고 어느 쪽이 사건을 처리 할 것인가? 때로는 항상 명확하거나 직관적이지 않았습니다 그래서 사람들은 우리에게 많은 시간을 요구할 것입니다 너는 내가 어느 것을 사용하는지 안다 그리고 그 대답은 항상 끝을 맺었습니다 그것은 좋아, 좋아, 잘, 목록 항목이 얼마나 복잡한 지, 등등

언제든지 대답해야합니다 에 대한 질문을 명확히하는 유형의 많은, 좋아, 좋아 너 뭐하려고? 그런데 정말로 그런 종류의 개발자는 복잡합니다 이야기 하지만 실제로 그 종류의 큰 것 전체 RecyclerView 노력을 시작했습니다

ListView 애니메이션은 정말 어렵습니다 그리고 핵심 문제는 어댑터가 우리는 그들을 똑똑하게하기에 충분합니다 따라서 어댑터를 변경하면 notifyDataSetChange라고 말하면서, 그리고 가정은 바뀔 수있었습니다 우리는 무엇을 확신 할 수 없습니다 계속 진행하고 현재 모든 항목을 다시 바인딩 할 것입니다

보이는 것과 거기에서 가라 그리고 시간이 지남에 따라 몇 가지 프로토 타입이있었습니다 그 중 일부는 팀 구성원들이 그 중 일부를 수행했습니다 지역 사회 구성원들에 의해 행해졌 다 모두 애니메이션으로 항목을 표시하려고합니다

데이터 세트가 변경 될 때마다 안팎으로 일종의 직관적 인 방식으로 그러나 이들 모두에는 몇 가지 중요한 한계가있었습니다 이것들의 대부분은, 다시, ListView의 내부 구현의 상세 그 애플 리케이션은 정말로 의지했다 그래서 우리는 이러한 것들을 고칠 수 없었습니다 가능한 이러한 애니메이션 그래서 결국, 당신은 결국이 얼굴을 ListView로 만듭니다

그래, 봐 봐 봐 그의 얼굴에있는 후회에서, 나는 이것을 [좋아하지 않는] 일을하는 것처럼, 그러나 나는 이것을해야하는지 정말로 확신하지 못합니다 나는 후회할거야

나는해야 해 그래, 쳇이 얼굴을 많이 쓰고있어 MALE SPEAKER 2 : 프레임 워크와 함께 제공됩니다 맞아 그리고 또 다시,이 문제들 중 또 하나 우리가 ListView와 함께했던 것은 단지 이 복제 된 기능 – [부끄럽다] – 뭐라구? [2] : [? – 슬 라이드

?] [INAUDIBLE] 네, 우리가 한 것 같네요, 그렇지 않습니까 승인 그래서 우리가 계속 전진하면서, 사람들이 시작했습니다 그들의 ListView에서 훨씬 더 복잡한 레이아웃을 사용하여 항목

우리는 매우 간단한 설정 화면과 같은 것으로부터 시작했습니다 진저 브레드에서 갑자기 사람들이 전체 사회적 흐름에서 항목을 보여주고 있습니다 그들에게 많은 다른 구성 요소들로, 상호 작용의 많은 다른 점과 더불어 그래서 우리가 ListView에서 제공 한 간단한 그리드와리스트 및 GridView와 프레임 워크는 실제로 이러한 유스 케이스를 적절하게 처리하기에는 충분하지 않았습니다 사람들은 이러한 종류의 비틀 거리는 격자를 만들기를 원했고, 반응 형 레이아웃 등등

그리고 정말로 이러한 유형의 레이아웃을 변경하려는 경우, 당신은 많은 핵심 코드를 재 작성하고있었습니다 ListView는이 어댑터 기반 재활용을 수행하는 데 사용됩니다 그래서 우리가 할일이 있다면, 우리는 무엇을 바꾸겠습니까? 음, 우리가하고 싶었던 것들 중 하나 모범 사례를 높이는 것이 었습니다 ListView를 사용하여 일류 API에 대한 작업 우리는이 ViewHolder 패턴을 사용하여 로마와 내가 갔다 "World of ListView"대화 링크 이전 이야기에서

ViewHolder 패턴에 대한 좋은 점은 ListView에 존재했던 것처럼 그것은 하나를 주었다 당신이 정렬 할 수있는 지점 당신이 재사용 한 함께 일하고 그 단일 액세스 지점을가집니다 findViewbyID 호출을 많이 캐시 할 수 있습니다 확장 된 뷰 하위 계층 구조에 적용 할 수 있습니다 특히 오래된 기기의 경우 큰 차이를 만들었습니다

더 적은 순회를하고있었습니다 그리고 점점 더 복잡한 항목 레이아웃을 만들면서, 그것은 더 중요했다 그래서 우리는 생각했습니다 좋습니다 그 부분을 핵심 API의 일부로 만듭니다

좋아, 이제 가자 그냥 이것을하는 대신에 모두가 블로그를 읽어야하는 모범 사례가되어야합니다 알아 내야 할 게시물, 앞으로 나아가서 이것이 당신이 보는 어떤 것입니다 작업 설명서를 읽 자마자 RecyclerView

우리는 뷰 생성과 바인딩을 분리하려고합니다 자, 이것은 커서 어댑터에서 일어난 일이었습니다 당신이 SQL로 작업했다면 아마 많은 사람들이 사용했을 것입니다 라이트 데이터베이스 또는 콘텐츠 제공 업체 ListView 어댑터의 보조 데이터 소스로 사용하십시오 우리는 onCreate와 onBind 단계를 분리했습니다

그러나 당신이 생생한 ListView 어댑터를 직접 작성했다면, 다음은 본질적으로 질문이었습니다 getView 메소드의 처음 몇 줄의 코드 convertView가 null과 같은 경우, 새로운 것을 작성합니다 그런 다음 일종의 철저히 구속하고 바인딩을 수행하십시오 그리고 이것은 그 것들 중 하나였습니다 잊기 매우 쉽다

그리고 네가 그 일을 잊어 버린다면 이 재활용 정비공에서 완전히 잃어버린 것을 의미합니다 그 ListView 정말 당신의 성능을 향상 종류 준 때로는 분명하지 않았습니다 왜 이것이 외부에서 일어 났는지 그리고 다음으로, 우리는 정말로 이 선택 처리의 무리를 버리고 정말 아주 단순화 된 목록에만 의미가 있습니다

프레임 워크의 일반적인 포커스와 입력에만 의존합니다 취급, 왜냐하면 이것은 다시, 그냥 단순함에 온다

프레임 워크의 나머지 부분과 함께 작업, 일종의 일관성을 강화시키는 종류 뷰 계층의 나머지 부분과 함께 그리고 이기적으로, 우리는 조금 더 원했고 우리의 끝에서 더 쉬운 유지 보수 왜냐하면 나는 아무도 내부를 보지 않았다면 AOSP에서 ListView의 나는 그것이 어린 아이들을 놀라게하는 데 사용될 수있을 것이라고 확신한다 그래서 우리는 핵심을 보편적으로 유지하려고했습니다 총 통증이었던 모든 것들 나 자신의 재활용을 쓰려고하면 다시 쓰다 컨테이너, 우리는 길을 갖고 싶었다

개발자에게 어느 정도 제공 통조림 형태로 무료로 제공 모든 것을 재발견하는 일종의 우리가 힘든 길을 따라야 만 했어 그리고 우리는 당신이 이 롱테일 기능들을 모두 구현하십시오 그 ListView는 ListView에서 API로 제공됩니다 다른 플러그인과 마찬가지로 우리가 공유하고 혼합 할 수 있습니다 당신이 원했던 경험을 얻기 위해 매치

우리는 똑똑한 어댑터가 필요했습니다 ListView 어댑터의 문제 notifyDataSetChanged라고 말할 수 있습니다 좋아, 뭐가 바뀌 었니? 어 그리고 그것은 당신이 아는 전부였습니다 그리고 이것은 애니메이션을 정말로 어렵게 만듭니다

우리는 그 라인을 따라 조금 더 나아갈 것입니다 따라서 RecyclerView 어댑터는 변경된 사항, 그저 뭔가가 변한 것이 아닙니다 이제 데이터 소스로 작업하는 경우 그런 종류의 세분화 된 메시징을 제공하지는 않지만, 여전히 이전 ListView 스타일을 사용할 수 있습니다 헤이, 뭔가 바뀌었고, 알아 내려고 우리는 최선의 노력을 다해 대응할 것입니다

하지만 정말로, 만약 당신이 어떤 지식을 가지고 있다면 데이터 세트의 특정 변경 사항이 무엇인지, 당신은 더 나은 결과를 얻을 수 있습니다 이것은 또한 우리가보다 효율적인 재활용을 할 수 있음을 의미합니다 애니메이션이 아닙니다 어댑터의 특정 항목 만 알면 변경되면 모든 것을 다시 바인딩 할 필요가 없습니다 그게 화면에있어, 우리는 단지 그 하나의 견해를 리 바인드해야합니다

측정 및 레이아웃에 많은 시간을 절약 할 수 있습니다 업데이트 적용 단계 알았어 그래서 그것은 RecyclerView 태어났습니다 그래서 ListView에서 배운 실수를 저지하십시오 좋아, 어떻게 RecyclerView를 쓰지? 같은 실수를 반복합니다

RecyclerView의 주요 기능은 다음과 같습니다 [? 보완 기반 아키텍처]? 이것은 RecyclerView의 아키텍처입니다 그리고 우리는 그것의 세부 사항을 통해 갈 것입니다 나는 그것이 매우 중요하다고 생각한다 나는 너의 대부분이 이미 그것을 사용한다고 믿는다

누가 무엇을하는지, 어떤 것을 사용해야 하는지를 아는 것은 좋은 일입니다 또는 어느 것을 사용자 지정해야하는지, 유스 케이스에 따라 다르다 RecyclerView를 사용하면 이것이 기본보기입니다 [INAUDIBLE] 3 가지 주요 요소가 있습니다 레이아웃 관리자, 항목 애니메이터 및 어댑터가 있습니다

따라서 어댑터는 레이아웃 관리자가 제공합니다 대부분의 사람들은 자신을 쓸 수 있으며, 항목 애니메이터도 같습니다 좋은 기본 설정이 있는데 [? 너는 할 수 있니?] [? 쓰기?] 당신 자신 그래서 레이아웃 매니저는 휠을 위치시키고, 항목 애니메이터가 애니메이션을 적용하고 어댑터 바퀴를 제공합니다 RecyclerView는 보스입니다

그래서 중앙 위치입니다 이 모든 구성 요소와 통신합니다 함께 일하게하는 것 그래서 우리는 레이아웃 매니저를 볼 필요가 있습니다 선형 목록 일 수도 있고 그리드 일 수도 있습니다

또는 [INAUDIBLE] 그리드 일 수 있습니다 그것은 무엇이든 수 있습니다 RecyclerView는 알지 못합니다 항목이 배치 된 방법에 대해주의하십시오 레이아웃 관리자의 책임입니다

또는 RecyclerView가 상호 작용을 처리합니다 와 더불어 [? 손가락?]하지만 레이아웃 관리자에게 알려줍니다 레이아웃 관리자 만이 알기 때문에 스크롤 보기가있는 곳 그래서 그것은 내용을 저장합니다 또는 포커스를 순회하는 경우 RecyclerView 기본 포커스 횡단을 처리합니다

왜냐하면 사실, [? V?] 프레임 워크가 처리합니다 그러나 초점을 맞추고 있고 아이템을 하나 더 필요로한다면, 레이아웃 매니저는 새 항목을 초점 영역으로 가져오고, 그것은 전에 존재하지 않았기 때문입니다 또는 접근성, [INAUDIBLE] 해당 항목에 대한 기본 정보를 제공하며, 하지만 레이아웃 관리자 [INAUDIBLE]은 (는) 알고있는 사람, 알겠습니다

이것은 섹션 제목입니다 또는 사용자 정의 대리인을 첨부 할 수 있습니다 이봐, 좋아, 이것에 집중하지 마라 또는 추가 정보 당신 만 제공 할 수 있습니다 [INAUDIBLE] 대리자가 액세스 할 수있는 RecyclerView 이를위한 API

알았어 좋아 ListView와 유사하므로 RecyclerView는 여전히 어댑터를 사용합니다 이제 RecyclerView 어댑터의 책임 다시보기를 만들뿐 아니라 ViewHolder를 생성합니다 그리고 ViewHolder는 우리가 실제로하는 것입니다

재활용을위한 추적 요소로 사용하십시오 따라서 항목을 바인딩 할 때 보기에 바인딩하지 않고 바인딩합니다 ViewHolder 전체에 적용됩니다 그리고 이것은 여러분이 할 수있는 것입니다 다른 정보를 숨길 장소로 사용하십시오

물론 어댑터의 책임입니다 변경 사항에 대해 RecyclerView에 알리기 데이터 세트에 발생하거나 데이터가 동기화되지 않은 경우 따라서 ListView와는 대조적으로 당신은이 항목을 사용할 수 있습니다 모델의 클릭 리스너 유형 사물의 경우 어댑터가 이제 구성을 담당합니다 아이템 상호 작용 처리 따라서 이들은 모두 클릭 리스너, 터치 리스너, 등등 어댑터는 또한 여러 View 유형을 처리합니다

다른 ViewHolders를 추적 할 수있는 일종의 당신이 추적 할 수 있습니다 – 그리고 나는 – 팁에 관한 한가지 팁을? weave?] 유형 ListView 세계에서 우리에게 줄 필요가있다 얼마나 많은 [? weave?] 유형, 재활용보기, 그들은 무제한입니다 그래서 나는 단지 [? r 점?] 레이아웃 [? 뭐라 구요?] [INAUDIBLE] 유형으로, 너 끝났어

맞아 따라서 귀하의보기 유형 ID는 더 이상 존재하지 않습니다 ListView를 사용하는 방식과 연속적이어야했습니다 어떤 종류의 고유 한 식별자가있는 한 보기 유형을 식별 한 다음 계속 사용하고, RecyclerView는 신경 쓰지 않습니다 즉,이 편리한 트릭을 사용할 수 있다는 것을 의미합니다

레이아웃 리소스 ID 자체 그리고 AEPT는 이미 그 ID는 유일 할 거라고 그 식별자에 꽤 잘 어울립니다 아, 너무 빨리지나 갔다 따라서 어댑터는 리사이클 리커버리 (recoverler recovery) 같은 것을 처리합니다 그래서 우리는 onFailedToRecycleView 개념을 가지고 있습니다

그러면 왜 무언가가보기를 재활용하지 못할 수 있습니까? 다시 한번, 우리는 명심하고 있습니다 사람들은 점점 더 복잡해지고있다 UI가있는 것들 그런 경우에는 당신의 견해에 많은 변화를 일으킨다 그것은 뒤집기가 매우 어렵습니다

따라서보기가 남아 있다는 것을 알고있는 경우 일종의 일관성없는 상태 어댑터와 앞뒤로 통신 할 수 있습니다 어댑터가 케이스로부터 복구를 정렬 할 수 있도록 보기가 일종의 엉망으로 된 곳 기대 이상으로 그리고 우리는 세분화 된 데이터 변경 이벤트를 가지고 있습니다 추가적으로, 핸들 효율을 정렬하고, MALE SPEAKER 2 : 성능 전 비어 있습니다 공연

그것은 효율성입니다 애니메이션 2 : 애니메이션 애니메이션 네 괜찮아

알았어 ViewHolder에 대해 자세히 살펴 보도록하겠습니다 왜냐하면 대부분의 사람들이 ViewHolder를 작성해야하기 때문입니다 RecyclerView를 사용하면 대부분의 시간을 그 곳에서 보내 게됩니다 ViewHolder의 라이프 사이클을 아는 것은 중요합니다

그래서 우리는 그것을 통과 할 것입니다 우리가 그것을 창조 할 때 무엇이 ​​일어나고, 무엇이 단계입니까? 따라서 레이아웃 관리자가 레이아웃을 계산하는 동안, 그것은 RecyclerView에게 알립니다 위치 5에 대한 뷰 그래서 그 위치에 대한 뷰를 얻고 싶습니다 RecyclerView는 캐시를 검사합니다

왜냐하면 캐시를보기 때문입니다 이제 캐시에 이미 가지고 있다면, 우리는 그것을 레이아웃 관리자에게 돌려 보낼 것입니다 그렇지 않다면, 우리는 그것을 가지고 있습니다 그것을 돌려 줄 필요가있다 ?] 우리가 그걸 가지고 있지 않다면, 그 사건은 안된다고, RecyclerView는 다음과 같이 말할 것입니다 – 어댑터에 물어보십시오, OK, 이 견해의 유형은 무엇입니까? 어댑터가이를 리턴합니다

다음 우리는 풀을 확인하러 간다 이것은 공유 풀일 수 있습니다 RecyclerView에서 사용하는 유일한 풀과 같을 수도 있습니다 이것에 대한 ViewHolder가 있습니까? 보기?]를 입력하십시오 No라고하면 어댑터에 어댑터를 생성하라고 지시합니다

이것이 실제로 ViewHolder를 만들 때입니다 또는 풀에서 이미 존재하는 항목을 반환했을 수도 있습니다 그런 다음 어댑터에게 알립니다 OK,이 위치를 바인딩합니다 이 ViewHolder에

반환하고 레이아웃 관리자에게 돌려줍니다 결국 레이아웃 관리자가이를 다시 RecyclerView에 추가합니다 같이 [? a?] [? 진짜?] 아이, 그리고 우리는 어댑터, 헤이, 이거 [? 보기?]가 레이아웃에 추가되었습니다 이것은 당신의 어댑터에 대한 아주 좋은 힌트입니다 그것을 알기 위해, OK, 사용자는이보기를 보려고합니다

레이아웃 관리자가 말할 수있는 다른 경우, 좋아, 나는이 견해를 끝내고 그것을 제거하고 재활용한다 RecyclerView는 어댑터에 알립니다 이보기를 삭제 했으므로 알려주세요 만약 당신이 [? 비싼?] 것들 그보기 안에, 당신은 그들을 uncache 수 있습니다 메모리에서 제거 할 수 있습니다

그런 다음 확인합니다 확인을 클릭합니다 이 위치에 유효합니다 이 위치에 유효하다면 캐시 할 것입니다 아이디어는 레이아웃 관리자가 다시 그 위치에 대해, 우리는 그것을 줄 수있다

어댑터와 대화하지 않고 이것은 성능상의 이유로 다시입니다 그리고 캐시는 가장 오래된 캐시를 제거합니다 그리고 나는 어댑터에게 말할 것입니다, 이봐, 우리는이 견해를 없앴습니다 이제 당신은 그것이 그 위치에서 재사용되지 않을 것이라는 것을 알고 있습니다 그래서 당신은 더 많은 메모리 정리를 할 수 있습니다

맞아 이것은 교훈이었던 중요한 단계입니다 ListView에서 ListView가 결국 이것을 추가했습니다 보기가 실제로 언제인지를 추적하는 데 사용할 수있는보기 리스너 더 이상 사용하지 않습니다 그리고 다시, 사람들은 훨씬 더 복잡한 UI를 만들기 때문에 이런 종류의 재활용 용기에서 요즘,이 단계를 통해 좋아요, 글쎄, 떠나는 대신에 이 거대하고 값 비싼 비트 맵은 이러한 견해에 화면 밖에서 캐시에 보관되고 있습니다

그 일을 깨끗이하지만 여전히 우리가 전에 가지고 있었던 핵심 시야 구조를 유지하라 나중에 다시 바인딩 할 수 있습니다 보기가 유효하지 않은 경우 – 어쩌면 아이템이 제거되었을 수도 있습니다 어댑터가 우리에게 말했거나 항목이 변경 되었기 때문에 보기의 내용이 표시되지 않습니다 더 이상 그 위치

[INAUDIBLE]이 (가) 더 이상 유효하지 않은 경우 풀에 보내면됩니다 어댑터에 대해 알려줍니다 레이아웃 관리자가 다시 계산하는 또 다른 사용 사례가 있습니다 일부 어댑터가 변경된 후 레이아웃, 일부 조회수는 사용하지 않습니다 그래서 [? 그것?] [? 있었습니까?] 모든 조회수 1에서 5, 그 다음 하나를 만든다

그것들은 단지 8 개만 사용한다 나머지 두 개가 누락되었습니다 RecyclerView가하는 일은 OK입니다 레이아웃 관리자가 더 이상이 뷰를 원하지만 ItemAnimator 그들을 원할지도 모른다 맞다

사라지지 않고 퇴색 시키길 원할 수도 있습니다 곧 따라서 RecyclerView가하는 일은, 사라지는 아이들마다, 아이들을 다시 자식으로 만들고 숨길 것입니다 레이아웃 관리자에서 나중에 자세히 설명하겠다

기본적으로 레이아웃의 하위 항목 목록 관리자의 관점은 아이들과 같지 않습니다 보기 그룹의 ItemAnimator가 OK라고 말하면, 우리는 ItemAnimator에게 말할 것입니다 이 아이들을 움직이십시오 그리고 ItemAnimator가 말했을 때, OK, 나는이 Views들로 끝났습니다 너는 우리가 원하는대로 할 수있다

RecyclerView가이를 제거합니다 그것은 그들이 사라지는 어댑터에게 말할 것이며, 우리는 그것을 재활용 할 것입니다 그렇다면 ViewHolder를 어떻게 잃을까요? 이것은 매우 중요합니다 왜냐하면 ViewHolder를 잃어버린다면, 성능 문제가 발생할 것입니다 [INAUDIBLE] 동일한 일이 발생하여 Recycler Layout Manager 고맙다

나는이 견해를 제거하고 싶다 RecyclerView는이보기가 유효한지 확인합니다 아니, 좋아, 이걸 수영장에 넣고 싶다 그리고 수영장 [INAUDIBLE] [? 그?] [? 이보기?] [? transisted?] 이것은 아담이 앞서 언급 한 것입니다 [? transisted?]는 [? 처럼 ?] [? ?] 내용을 애니메이션으로 만들거나, 우리는 약간의 애니메이션을하는 버튼을 가지고 있습니다

즉, [? 보기?]가 움직입니다 우리는 다른 ViewHolder를 위해 그것을 재사용 할 수 없습니다 왜냐하면 그것이 사라지고 나서 사라져 가고 있다고 상상해보십시오 우리는 그것을 다른 것으로 묶고 UI에 온다 퇴색 한 것처럼

그것은 마치 당신이 원하는 것이 아닙니다 당신은 신선한 전망을 원합니다 다른 몇 가지 사례가 있습니다 뷰가 일시적인 상태가 될 수도 있습니다 이것은 프레임 워크의 일부인 컨셉으로, RecyclerView 자체 만이 아닙니다

예를 들어, editText 위젯이있는 경우 사용자가 입력 한 텍스트를 가지고, 그리고 그들은 앞으로 나아가고 창조했습니다 여러 단어에 걸쳐 선택되었지만 다른 단어에는 없을 수도 있습니다 그것은이 복잡한 상호 작용의 종류입니다 사용자가 우리가 실제로 만든 것을 개발자의 책임으로 만들고 싶지 않았다 트랙을 정렬하고 해당 특정 항목이 다른 컨텍스트에서 리바운드 그럼 우리가 할 수있는 일은 없을거야

이 뷰를 다시 사용하면 RecyclerView에서 제거됩니다 [? 처럼 ?] [? 마지막?] 우리가 그 견해에 대한 참조 우리는 어댑터를 마지막 기회로 사용합니다 이봐, 나는이 견해를 재활용 할 수 없었다 재활용 할 수 있습니까? 대부분의 시간 때문에, 그것은 애니메이션 때문입니다 [? 선택시

?] 실제로 할 수 있습니다 그 상태에서 회복하십시오 유일한 문제는 우리가 궁극적으로 그것을 할 수 없다는 것입니다 우리는 무슨 일이 일어나고 있는지 모르기 때문에 따라서 어댑터는 [INAUDIBLE]이 (가) 재활용에 실패했거나, 당신은 그 애니메이션들을 끝내거나 [? 선택된?] 상태, 또는 아무 말도하지 않아도됩니다

나는 [INAUDIBLE] [? 이 ?] [? 암호 ?] 재활용처럼, 나는 그것을 사용할 것이다 그러나 어댑터가이 메소드를 구현하지 않으면, 기본적으로 false를 반환합니다 그래서 우리는 ViewHolder를 파괴해야합니다 그래서 그것은 죽은 웅덩이로갑니다

너는 이것을 원하지 않는다 이야기의 도덕은 아이템을 움직이는 경우, 계속해서 [INAUDIBLE] 애니메이션을 만들지 마십시오 우리는 ItemAnimator API를 사용하여 이러한 작업을 올바르게 수행합니다 따라서 Animate하려는 경우 ItemAnimator를 사용하십시오 ItemAnimator는 올바른 라이프 사이클 이벤트를 수신합니다

우리가 재활용 할 수 있도록 애니메이션 재생이 완료되면 해당 뷰를 재활용합니다 맞아 근본적으로, 당신은 모든 것을 잊을 수 있습니다 당신 앞에서 그 슬라이드에서 방금 일어난 일입니다 ItemAnimator 인터페이스를 구현하는 한

그래, [INAUDIBLE] 네가 스스로하고 있다면, 너 혼자 야 너가는거야 이 모든 문제를 직접 처리해야합니다 그래

그래 그리고 중요한 것은 [INAUDIBLE]입니다 [? 재활용,?] 당신 정말 ListView에서 배운 모든 것을 잊어 버려야합니다 대부분 유효하지만 [부적절] 유효하지 않은 비트가 실제로 여기에 상처를 줄 것입니다 따라서 다른 사용 사례가 있습니다

우리는 RecyclerView가보기 좋아, 좋아, 나는이 견해로 끝났습니다 우리는 그것을 수영장에 넣으려고했습니다 풀은 항목 유형 당 크기 당 제한됩니다 따라서 수영장에있는 뷰 유형이 너무 많으면 이미 우리는 우리가 좋아하는 것입니다 우리는 그것을위한 공간이 없습니다

그것을 버려라 그런데 왜 이런 일이 일어 났을까요? 왜 우리는 이미 우리가 만든 견해를 수영장에서 사용되지 않는 것들을 [미심쩍은] 것으로 보았습니까? 글쎄요, 이것은 대개가 진행될 경우에 발생합니다 ViewHolder 유형이 너무 많아서 왜 그것은 주로 애니메이션 때문입니다 당신이 우리에게 말했듯이, [부적절한] [INAUDIBLE]에 전화하는 대신 [INAUDIBLE] 0에서 모두로 변경하십시오 그래서 당신이 이런 말을한다면, RecyclerView는 [? 좋아,?] [INAUDIBLE] 보이는 모든 자식에 대해, 기본 동작에 의해, 나는 다른 ViewHolder를 만들어서 표현해야한다

그 아이는 내가 그들을 교차 – 퇴색시킬 수 있기 때문에, 기본 동작은 크로스 페이드이기 때문입니다 즉, ViewHolders의 수를 복제한다는 의미입니다 물론, 그 애니메이션이 끝나면, 우리는 모두 다시 수영장에 넣으려고합니다 수영장은 마치 많은 아이템이 필요 없어요 있잖아, 그냥 버려

그러지 마라 항목이 변경되면 실제로 변경된 사항을 알려주십시오 정말로, 정말로 중요합니다 [비 일치] 올바른 애니메이션, 또는 당신이보기를 보았던 다른 경우가 있다면 길을 잃어 버리고 타입을 바꿀 수 있습니다 풀의 사이즈마다의 사이즈 사건이있을 때 이런 일이 생깁니다

다시 한번, 사회적 흐름은 이것에 대한 정말로 큰 유스 케이스입니다 게다가 매우 긴 게시물이있을 수 있습니다 전체 화면을 모두 채우고, 또는 매우 짧은 여러 게시물을 가질 수 있습니다 크게 다른 크기의 항목이있는 경우 그런 다음 항목 수 한 번에 붙일 수있는 꽤 많이 바뀔 것입니다

그래서 그것들은 당신이 정말로 앱의 자체 동작이 무엇인지 측정하고 싶습니다 이러한 유스 케이스의 일부와 튜닝 그에 따라 RecycledView 풀의 크기 괜찮아 남성 스피커 2 : ItemAnimator 그럼, ItemAnimators

항목이오고 항목은 시간이 지남에 따라 이동합니다 다시 한 번 더 똑똑한 방법을 사용하여 정확히 무엇이 바뀌 었는가 H 사이에 새 항목을 추가한다고 가정 해 봅시다 이 다이어그램에서 나는 여기에있다 이제 중간에 P가 생겨 더 이상 정렬되지 않습니다

그것을 무시하십시오 뭔가가 사라지면 어떻게 될까요? 음, 이제 목록의 또 다른 이미지가 생겼습니다 흥미로운 것은 여기 있습니다 오, 그리고 나서 물론 항목이 단순히 변경되는 경우가 있습니다

그 내용이 제자리에서 바뀝니다 이 경우 흥미로운 점은 항상 몇 가지 부작용이 있다는 것입니다 보기를 추가하고 제거 할 때 그래서 뷰 ​​P를 여기에 추가했습니다 I와 J는 아래로 내려 갔고 K는 완전히 사라졌습니다 우리가 제거 할 때, 정말 비슷한 것이 발생합니다

그래서 우리는 아이템 H를 제거합니다 I, J, K는 움직이지만, L은 스크린에서 새로운 것입니다 우리는 그것을 보여주기 위해 새로운 시각을 얻어야했습니다 그래서 여분의 정보없이 오, 죄송합니다 먼저 변경하십시오 그리고 물론 이것은 쉬운 경우 중 하나입니다 우린 그냥 가서 이들 사이를 교차 – 페이드 (cross-fade) 할 수 있습니다

따라서 우리가 이런 식으로 물건을 다루는 경우, 물건이 제거되면, 우리는 그것을 퇴색시킬 수 있습니다 항목이 추가되면 사라집니다 항목이 화면에서 움직이는 것일 경우, 우리는 그것을 번역 할 수 있습니다 그리고 우리의 기본 아이템 애니메이션 핸들러 문제를 처리 할 수 ​​있습니다 변경, 우리는 단지 장소에서 간단한 크로스 페이드 않습니다

사건이없는 한 해당 항목의 크기가 변경된 곳 우리는 아주 쉬운 사건입니다 하지만 그렇지 않으면 주변의 다른 항목을 의미합니다 움직이고 있고, 우리는 전에 그러나 우리는 이것보다 더 잘 할 수 있을까요? 이 경우 중요한 문제가 있습니다 그게, 만약 우리가 아는 전부가 어댑터에서 ListView와 같은 새로운 상태가 나타납니다

그러면 우리가 실제로 그 아이템의 차이점을 이 항목 이후에 어댑터에서 제거되었습니다 방금 화면에서 떨어졌고 더 이상 존재하지 않습니다 우리가 이런 종류의 애니메이션을 만들 때, 이것은 갑자기 정말로 중요합니다 마찬가지로 화면에 무엇이 있는지 어떻게 알 수 있습니까? 다른 것들이 그것 주위에 움직 였기 때문에, 또는 실제로 어댑터 자체의 새 항목 인 경우 다시, 대표가없는 처음부터 부모에게 첨부 된 견해 중 우리는 반드시 알 필요가 없습니다

그래서 우리는 이것을 잘 알고 있기 때문에 더 잘할 수 있습니다 우리는 개념적으로 – 다시, 이 연기로 돌아와 비유를 비유한다 비록 우리가 단지 특정 수의 항목을 가지고 있음에도 불구하고 한 번에 뷰 그룹에 첨부되고, 개념적으로 우리는 전에 온 아이템을 많이 가지고있다 화면에 표시되는 내용을 확인한 후 그래서 우리는 이것에 대해 약간 예측할 수 있습니다 우리가 어댑터에 기꺼이 질문한다면 몇 가지 추가 질문 및 구체적으로 레이아웃 관리자로 여기에이 항목을 추가하면 이 경우 K를 삭제해야합니다

어댑터가 우리에게 말하지 않았다면 K가 여전히 존재한다는 것을 알아라 이제 사라 졌어요 그래서 우리는 단지 스크린 대신에 미끄러지는 것을 알고 있습니다 마찬가지로 제거를하면 같은 트릭을 사용할 수 있습니다 우리는 레이아웃 매니저 (Layout Manager), 헤이, 내가하고있는 일에 대해 몇 가지 보여줘

그래서 내가 추가 된 컨텍스트를 가질 수 있도록 전후의 상태를 비교할 수있다 정확하게 애니메이션을 적용하십시오 좋아 [INAUDIBLE] 조금 더 빨라요 그래

그래 MALE SPEAKER 2 : ItemAnimator에 대한 작업 방식 예측 애니메이션은 RecyclerView입니다 과거에 어댑터보기를 표시 할 수 있습니다 그럼 우리가 어떻게 할 수 있죠, 아시다시피, 새 항목을 어댑터에 추가 한 경우, 우리는 레이아웃 매니저에게 그들에 대해 말하지 않고, 왜냐하면 그것은 항상 그 사이에 앉아있는 것과 같기 때문입니다 우리가하는 일은 다른 견해를 보여주는 것입니다

예를 들어, 우리가 그것을 구현하기 전에, ItemAnimator에 레이아웃 관리자가 있습니다 그리고 거기에 대한 견해가 있습니다 그리고 그들은 항상 싸울 것입니다 아니,이 견해는 내 꺼야 아니, 아니야,이 견해는 내 꺼야

마찬가지로, 나는 그것을 움직이기 원한다 그러나 잠깐, 잠깐, 나는 그것을 제거하고 재활용하고 싶다 따라서이 상충되는 사례는 항상 발생합니다 우리가 해결 한 방법은 ChildHelper였습니다 레이아웃 관리자가 헤이 (Hey)라고 할 때, 나 위치에 아이를 갖기를 원한다

또는 그것을 제거하거나 내가 원하는대로해라 RecyclerView는 View 그룹을 호출하지 않습니다 마찬가지로, 우리는 즉시 아이들을 변화시키지 않습니다 대신 우리는 [불충분] ChildHelper, 이 항목을 만드는 책임이있는 구성 요소입니다 [부적절한] 내용에 대해

그런 다음 ChildHelper가 결정합니다 OK, 레이아웃 관리자가 제거하라고했습니다 그러나 ItemAnimator가 나에게 애니메이션을 적용하라고 말했고, ItemAnimator가 완료 될 때까지 계속 사용하겠습니다 그러나 레이아웃 관리자가 더 복잡 해지는 것을 원하지 않습니다 애니메이션, 레이아웃 관리자는 사라진 것처럼 보입니다

실제로 View 그룹의 실제 하위 항목입니다 그래서 ChildHelper는 가상 목록을 제공 할 책임이 있습니다 레이아웃 관리자에게 보냅니다 예를 들어,이보기에는 스 와이프되었습니다 – 제거되었습니다 그래서 당신이 그 애니메이션 200을 제거 할 때 밀리 세컨드 (레이아웃 매니저가 시도한 경우) 세 번째 위치에있는 아이를 얻으려면, 그것은 바르셀로나를 돌려 보낼거야

그리고 만약 RecyclerView가 – 당신이 RecyclerView를 얻으려고한다면 [INAUDIBLE] 아이, [INAUDIBLE]입니다 그래서 이들 구성 요소들 사이의 [INAUDIBLE] 우리가 이러한 종류의 트릭을 만들지 않고도 이러한 구성 요소는 복잡합니다 그리고 애니메이션이 완료되면, 같은 값을 반환하기 시작합니다 AdapterHelper는 동일한 것이지만 동일한 추상화를 수행합니다 어댑터쪽으로

그래서 당신이 좋아, 어댑터 [INAUDIBLE] 이 모든 [부주의 한] 모든 것을 보내라 목록에서 발생합니다 그리고 Recycler는 마치 무슨 일 이죠 나는 거기에서 무슨 일이 일어나고 있는지 전혀 모른다 레이아웃 관리자가 이러한 사항을 추적하는 것은 매우 어렵습니다

이미 UI를 추적하는 중입니다 따라서 AdapterHelper가 구조되었습니다 그래서 당신이 말할 때 notifyItemInserted 어댑터에서 우리는 그것을 기록하고 레이아웃을 요청합니다 우리는 무언가가 일어난 것을 압니다 다시 그려야 해

그게 전부 야 우리가하는 일은 우리가 그것에 관한 정보를 유지하는 것뿐입니다 그리고 지금, 당신이 [INAUDIBLE]을 더 추가함에 따라, 우리는 단지 그것들을 목록에 보관합니다 예를 들어,이 순간에 우리가 다시 계산하기 전에 레이아웃하지만 어댑터 내용이 변경된 것을 알고 있지만, 사용자가 버튼을 클릭했습니다 그리고 당신은 물건을 얻고 싶었습니다

항목에 대해 getAdapterPosition을 호출했습니다 클릭시 59 번 그러나 색인 55에 추가 된 새로운 항목이 있다는 것을 알고 있습니다 그래서 우리는 어댑터에서, 실제로 위치 60에 그래서 우리는 당신에게 60을 돌려 준다

[INAUDIBLE]은 (는) 재 계산되지 않으므로, 어댑터 항목을 액세스 할 수 있도록 어댑터를 배치해야합니다 우리는 당신에게 올바른 위치를 제공 할 수 있습니다 따라서이 작업은 전에 우리에게 말했던 것 그리고 더 많은 업데이트를 보내라고 가정 해 봅시다 그리고 나서 우리는 그들을 지나갈 것입니다

RequestLayout은 시스템에 의해 승인 될 것이다 새 레이아웃을 준비하기 시작합니다 그리고이 시점에서 어댑터가 사용 중입니다 [INAUDIBLE] 위치에 레이아웃 관리자를 제공하십시오 어떻게 작동합니까? 우리가하는 일은, 내가 이야기 할 때, 좋아할 때, 어댑터 내용을 위조하면 업데이트 순서가 변경됩니다

그래서 아이디어는 우리가 먼저 레이아웃 관리자에게 알려야합니다 우리는 그들에 대해 이야기합니다 우리는 그것이 예측 레이아웃을하도록했습니다 그리고 나중에 우리가 그들에 대해 이야기하는 다른 모든 것들을 말입니다 따라서 당신이 61에서 2 개의 아이템을 제거한 것을 본다면, 우리는 그것이 재 순서화 된 61임을 압니다

[? ?] 우리가 이것을 보았을 때, 좋아, 나는 실제로 60에 해당하는 항목이 있습니다 따라서 레이아웃 관리자가 제거 된 경우에도 이전 상태를 다시 계산합니다 예측 애니메이션의 일부입니다 항목 60을 묻는다면 그것을 제공 할 수 있습니다 그래서 레이아웃을 말할 필요가 없습니다

해당 항목이 어댑터에서 삭제 된 관리자 그러나 항목 61, 나는 그것을 가지고 있지 않습니다 그래서 내가하는 일은 그것을 나눕니다 [? 제거 하시겠습니까?] [? 작동?] 2로 나는 레이아웃 매니저에게 이봐, 레이아웃을 계산하기 전에 항목 61이 사라지고, 당신에게 알려주기 위해서 요 사전 레이아웃을 수행하고 레이아웃 후 단계로 이동합니다

그런 다음이 세밀한 어댑터와 같은 이러한 것들에 대해 이야기합니다 업데이트는 마치 우리가 어댑터 내용을 위장 할 수있게 해준다 소스 레이아웃 관리자가해야 할 모든 일 우리는 그것을 두 번 반복해서 레이아웃 해달라고 부탁합니다 그런 다음 우리는 나머지 모든 애니메이션을 예측하십시오 따라서 레이아웃 관리자는 거의 필요하지 않습니다

그것에 대해 아는 것 승인 알았어 좋아 우리는 몇 가지를 시도하고 움직일 것입니다

여기 다른 기능 중 일부는 더 빨리 그래서, ItemDecorations ListView에는 다른 많은 일회용 기능과 마찬가지로 기능이 있습니다 ListView에서 항목 사이에 구분선을 그립니다 그래서 우리는 이러한 종류의 기능을 확실히 할 필요가있었습니다 여전히 보존되었다

그래서 ItemDecorations는 당신이 할 수있게 해줍니다 RecyclerView의 캔버스 자체에 대한 사용자 지정 그리기 이것은 RecyclerView의 컨텍스트에 있습니다 부모 모든 자녀 항목 중 반드시 필요한 것은 아닙니다 그 안에있는 개별 항목

우리는 경계를보기 위해 오프셋을 추가 할 수도 있습니다 다시, 분배기의 간단한 테스트 케이스를 사용하여, 당신은 그 부부가 있는지 확인해야합니다 분할자가 소비하는 공간의 픽셀, 필연적으로 항목보기 위나 아래에 그리기보다는 또한 ItemDecorations를 여러 개 가질 수 있습니다 그들은 겹쳐 쌓인다 따라서 이러한 ItemDecorations는 다시 뷰에 영향을 줄 수 있습니다

스택과 비슷한 방식으로 ItemDecorations 그래서 우리는 목록 항목 위에 여기에 항목을 그릴 수 있습니다 제발요 괜찮아

그래서 중요한 또 다른 종류의 여기에 getItemOffsets가 있습니다 이것은 실제로 우리가 특정 항목 주위에 공간을 추가 할 수있게 해주는 것입니다 이렇게하면 일종의 카드를하는 경우에 좋을 수 있습니다 한 번에 여러 항목 주변 배경, 그래서 어떤 종류의 분류처럼 그러나 당신은 또한 단 하나 품목에 다만 그것을 할 수있다

그래서 우리는 특정 항목 주위의 공간을 확장 할 수 있습니다 어쩌면 그것이 우리가 끌어들일 영역이기 때문입니다 그래서 우리는 onDraw를 얻습니다, 우리는 아이템 뷰 밑에 그릴 것입니다 실제로 항목보기를 그리기 전에 그 다음에 항목 자체가옵니다 그리고 우리는 onDrawOver를 얻습니다

항목보기 위에 그릴 수있는 기회를 제공합니다 귀하의 특정 상황과 관련이있는 경우 그래서이 경우에는, 우리는 단지 다르게 꾸미고 있습니다 이런 일 따라서 ItemDecorations에 대해 신중해야합니다

하지만,이 드로잉 단계가 여기에 있기 때문에 다른 여러 작업의 중간에있을 수 있습니다 RecyclerView보기가 수행 중입니다 그리고 [INAUDIBLE]이 자세히 설명했듯이, RecyclerView에는 많은 것들이 있습니다 세계를 일관성있게 보여주기 위해 노력하겠습니다 레이아웃 관리자와 어댑터 비교 애니메이션 등을하고있는 사람들

그래서 어댑터의 세계관 바로 그때 당신이 화면에서보고있는 것이 아닐 수도 있습니다 그래서 너는 네가 ItemDecorations를 사용하여 어댑터에 액세스하지 마십시오 사물에 대한 필요한 정보를 유지하십시오 ViewHolder 자체를 그려야합니다 ItemDecoration은 원하는대로 ViewHolder에 액세스 할 수 있습니다

ViewHolder는 표시되는 항목에 대한 데이터이므로 지금 화면에 그리고 다시 그리기에 대한 일반적인 규칙이 적용됩니다 이것은 꽤 뜨거운 코드 경로입니다 이상적으로 이것은 초당 60 프레임이라고 불리며, 모든 것이 올바르게 진행되면 그러니 메모리를 할당하지 말고 너무 비싸게하십시오

등등 언제든지 계속해서 recyclerViewgetChildViewHolder 메소드 특정 ChildView의 ViewHolder를 가져 오려면 당시 RecyclerView에 첨부되었습니다 따라서 RecycledViewPool은 또 다른 구성 요소입니다 그 점을 아는 것이 중요합니다

단지 당신이 꽤 깔끔한 트릭을 가져올 수 있기 때문에, 만들고있는 UI 유형에 따라 다릅니다 따라서 재활용 된보기 풀은 일반적으로 내부 구현 세부 사항이다 추가 ViewHolders를 보유하고있는 곳 이전에 언급 한 것처럼 여러 유형의 그러나 RecycledViewPool에 대한 멋진 점 여러 개의 RecyclerView간에 공유 할 수 있다는 것입니다 또는 심지어 다른 사용자 정의보기 그룹 그 비슷한 작업을 수행해야하는 작성한 이 유형의 균일 한 뷰가 필요합니다 다시 말하지만, 항상이 범위를 유지해야합니다

하나의 활동으로 이러한 것들은 견해를 가지고 있습니다 뷰는 컨텍스트를 유지합니다 귀하의 활동으로 인해 컨텍스트가 비정상적으로 증가했습니다 너는 곤경에 빠질 수있다 우연히 그 활동 상황을 누설하게되면 그래서 이들이 범위를 지니고 있는지 확인하십시오

최대 하나의 활동으로 하지만 Android Leanback 측면에서 이와 같은 UI가 표시됩니다 Android TV 용 라이브러리 실제로 RecyclerViews 인 행이 여러 개 있습니다 RecyclerViews 내에서 개최됩니다 그러나 가장 안쪽에있는 하위 항목은 모두 통일 된 유형입니다 그래서 우리는 RecycledViewPool을 공유 할 수 있습니다

이 모든 개별 행에 걸쳐 그리고 이것으로 우리는 많이, 많이 될 수 있습니다 우리가 그것들을 어떻게 할당하는지에 관해서는 더 효율적입니다 해당 풀을 관리 할 수 ​​있습니다 좋아 그래서 우리는 더 많은 함수를 추가하기 시작합니다

RecyclerView에 우리가 구현하려고했던 것 구성 요소로 그래서 [INAUDIBLE] Drag & Drop, ListView를 보면, 한 무리의 도서관이 있습니다 예제를 봐야합니다 그리고 일부만 유스 케이스에 사용할 수 있습니다 그래서 우리는 실수로부터 배우기를 원했습니다

우리가 ItemTouchHelper를 디자인 할 때, 우리는 그것을 레이아웃과 무관하게 원했습니다 그래서 ItemTouchHelper를 사용하고 싶다면 Drag & Drop, 스 와이프하여 닫을 수 있습니다 그리고이 콜백 클래스를 제공하면됩니다 콜백 클래스에서 [INAUDIBLE] getMovementFlags 이것이 바로 아이디어입니다

ViewHolder 있습니다 이 뷰 홀더 [INAUDIBLE] 위아래 또는 왼쪽 및 오른쪽 그리고 물품을 옮길 때 내가 어떻게해야하는지 말할 수 있습니다 사용자가 다른 곳으로 이동했다고 가정 해 봅시다 이제 어댑터를 변경해야합니다

비슷한 스 와이프 사용자가 오른쪽으로 스 와이프하고 있습니다 끝나면 알려 드리겠습니다 ViewHolder를 움직일 수있는 방법을 알려주면됩니다 사실, 어댑터에서 변경해야 할 작업을 수행하십시오

이동되거나 스 와이프 될 때 따라서 드래그 앤 드롭과 스 와이프를 동시에 실행할 수 있습니다 동일한 레이아웃 관리자에서 그냥 작동합니다 그래서 이것은 getMovementFlags입니다 우리는 [INAUDIBLE] Flags를 제공합니다

따라서이 예에서는 각 항목 이동할 수 있습니다 – 위아래로 끌고, 그리고 당신은 그 다음으로 끝까지 강타 할 수 있습니다 그래서 그것은 또한 RTF를 지원합니다 [INAUDIBLE]라고하면 [? 및?] 콜백은 왼쪽을 사용하는 경우 RTL 매개 변수와 같은 항목 수신 및 [? 오른쪽,?] 콜백은 왼쪽과 오른쪽으로 수신됩니다 따라서 그리는 방법을 사용자 정의 할 수도 있습니다 [알아들을 수 없는] [? 데모,?] 우리는 당신처럼 샘플을 사라지게 할 수 있습니다

당신이 스 와이프 할 때 방금 [? 재정의?] [INAUDIBLE] 콜백에 드래그 앤 드롭 또는 스 와이프를 시작할 수도 있습니다 어쩌면 당신은 커스텀 버튼을 가지고있을 것입니다 조금 더 빨리가보십시오

승인 우리는 몇 가지 팁과 트릭을 살펴 보겠습니다 그래 그래 정말로 여기에서 빠르다

그래서 다시, 우리가 전에 이야기했던 것처럼, 우리는 RecyclerView 어댑터를보다 효율적으로 사용하고자했습니다 우리가 ListView 어댑터를 사용하는 것보다 따라서 특정 항목을 업데이트하지 않는 경우, 너는 그 물건을 더 이상 찾지 못한다 우리는 바로 그 견해를 그대로 재사용 할 수 있습니다 따라서 작업을 이동하더라도 우리는 해당 데이터를 다시 요청하려면 어댑터로 돌아 가야합니다

헤이, 그것은 변하지 않았기 때문에 왜 우리는 여분의 일을해야합니까? 그래서 우리는 그 견해에 대해 무효화되지 않습니다 우리는 캐시가 작동하는지 확인합니다 우리에게는 행복한 새끼 고양이가 있습니다 그리고 그것이 의미하는 바는, 부작용은 항목을 추가하거나 제거 할 수 있기 때문에 주변 및 항목을 이동할 수 있습니다, 당신이 당신의 견해를 묶을 때, 당신의 위치가 처음에는 항상 바운드되었습니다

해당 데이터에 해당하는 위치가 될 것입니다 목 다시 말하지만, 이것은 잘못 될 수있는 일의 완벽한 예입니다 라이브 입장에 액세스하고 있는지 확인하려고합니다 ViewHolder 자체에서

ViewHolder는 무슨 일이 일어나고 있는지 알고 있습니다 이 경우 네, 거기에 우리가 간다 ViewHolder는 현재 어댑터 위치가 무엇인지 알고 있습니다 그래서 우리는 당신을 위해 그것을 최신 상태로 유지하도록합니다 그래서 당신 스스로 그것을 추적 할 필요가 없습니다

하지만 우연히 우연히 어댑터 위치 값을 닫습니다 MALE SPEAKER 2 : 그런데 Android Studio [INAUDIBLE]이 (가) 있으므로, 그렇게하지 못하게됩니다 하지만 itemChangeWithPayload를 사용하십시오 시간 변경이나 사용자와 같이 항목이 변경되면 좋아, 페이로드와 함께 사용하십시오 그것은 당신의 onBind 훨씬 더 효율적으로 만들 것입니다

더 나은 애니메이션을 실행할 수 있습니다 따라서 onBind 메서드에서 [INAUDIBLE] 페이로드 따라서 페이로드가 없으면 ViewHolder를 [INAUDIBLE]로 설정하십시오 페이로드가있는 경우 ViewHolder 그 위치를 위해 재사용되고있다 그래서 모든 것을 설정할 필요는 없습니다

변경된 내용 만 설정하면 해당 정보를 알 수 있습니다 페이로드에서 매우 효율적입니다 애니메이션에 적합합니다 헤더보기가있는 것처럼 일반적으로 볼 수있는 또 다른 실수입니다

헤더보기를 요청하면 동일한 헤더가 반환됩니다 하지 마 onCreate를 호출하면 새로운 ViewHolder가 작성됩니다 네가 가진 것과 같은 것을 돌려 보내려고하지 마라 왜냐하면 당신은 벌레를 가질 것이기 때문입니다

[? 우리가 필요하지 않으면 우리는 그 방법을 부르지 않을 것입니다 [INAUDIBLE] 이와 비슷한 것 당신이 창조 할 것을 요구하면, 새로운 것을 창조하십시오 어댑터 대 레이아웃 위치는 무언가입니다 우리는 이전에 언급했다 하지만 [? a?] [? 보기 -?] 당신이 항목을 이동했다고 가정 해 봅시다

이 시점에서 어댑터 위치를 볼 수 있습니다 일부 항목의 배치 위치 다음 레이아웃이 나올 때까지 다릅니다 또한 비동기 적으로 계산되기 때문에 계산됩니다 그래서 한번 [? 보기?] [? 시스템?], [INAUDIBLE] [? 새로 고침?] [? 그것,?] 지금 모두 항목 중 동일한 레이아웃 위치와 어댑터가 있음 위치 그래서 어댑터의 위치는 아주 좋습니다 귀하의 데이터에 액세스해야합니다, 레이아웃 위치가 매우 좋다면 그 지점에서 위와 아래에 무엇이 있는지 알고 싶다

[? ?] 사용자가 무언가를 클릭 할 때 알았어 좋아 그리고 나는 그것이라고 생각한다 고맙습니다

예 [박수 갈채] [음악 재생]

ListView 和 ArrayAdapter

메뉴 사이의 고급 인터페이스 인터페이스에 대해 이야기 해 봅시다 그리고 매트릭스 어댑터

그런 다음 다음 비디오에서 코드를 자세히 살펴 보겠습니다 메뉴 인터페이스를 생각할 수있는 이유는 그것이 매트릭스 어댑터에 의해 제어되기 때문입니다 따라서 어댑터가 없으면 목록의 인터페이스는 단지 빈 내용 일뿐입니다 내가 작동한다고 말하면 매트릭스 어댑터가 세트를 제어한다는 의미입니다 화면에 표시된 데이터입니다

예를 들어 매트릭스 또는 데이터 목록을 제어 할 수 있습니다 따라서 행렬 어댑터는 데이터 변환 방법을 잘 알고 있습니다 인터페이스 메뉴에 표시 될 메뉴 항목의 인터페이스에서 해당 항목과 정렬됩니다 이제 어떻게 작동하는지 자세히 살펴 보겠습니다 인터페이스 목록에 처음 연결되면, 표시 할 항목의 수는 몇 개입니까? 행렬 어댑터는이 정보를 알고 있습니다

따라서 인터페이스 목록은 행렬 어댑터의 함수를 호출합니다 이 기능으로 입구를 통과 할 것이고, 사용자가 현재보고있는 목록의 현재 상태입니다 이 경우 모드 0으로 전달하지만 사용자는 계속 사용할 수 있습니다 첫 번째 위치 또는 목록의 100입니다 그래서이 정보를 알고, 매트릭스 어댑터는 데이터의 내부 소스를 확인합니다

그래서 행렬을 선택합니다 데이터 원본 인 경우 목록을 선택할 수도 있습니다 정보를 출력합니다 그것을 만드는 방법을 알려주는 지침이 있습니다 메뉴의 항목 인터페이스는 인터페이스 메뉴로 돌아갑니다

화면이 완료되었으므로 인터페이스가 매트릭스 어댑터의 더 많은 메뉴 항목 따라서 메뉴 항목 인터페이스는 필요할 때 요청에 의해서만 작성됩니다 따라서 인터페이스가 화면에서 사라지면, 스크랩 더미에 추가 된 것을 기억하십니까? 그래서이 특별한 예에서 제인과 칼, 목록의 처음 두 항목은 더 이상 볼 수 없습니다 그래서 그들은 스크랩 더미에서 끝납니다 따라서 우리는 이러한 인터페이스를 다시 사용하여 반환 할 수 있습니다

목록에서 새 항목을 요청할 때 배열을 정렬합니다 인터페이스 메뉴는 메뉴의 항목 인터페이스가 특정 장소를 차지하도록 요청합니다 메뉴 및 스캐너를 사전 사용 된 인터페이스를 통해 제공합니다 따라서이 예에서 인터페이스 메뉴는 모드 6에서 항목을 요청하고, 그리고 이전에서 행렬로 재사용 된 인터페이스를 통해 이제 매트릭스 어댑터는 인터페이스를 재사용 할 수 있습니다

그들 안에 데이터를 넣는 것만으로 예를 들어 텍스트 인터페이스를 호출하면 텍스트 모드 기능을 사용하여 여기에서 이름을 변경할 수 있습니다 이제 우리는 첫 페이지로 돌아갈 수있는 새로운 메뉴 아이템처럼 보입니다 새 계층 구조에 추가되고 화면에 표시됩니다

Android 中文教學 基礎/ 7-2 ListView – 2

당장 샘플 운동을 해보 죠 나는 그것을 더 빨리 설명 할 것이다

나중에 디자인 할 패턴 잠깐, 전화가 왔어 아래쪽은 우리가 디자인하고 싶은 ListView입니다 그리고 위에 나는 두 개의 버튼을 배치했다 새로운 데이터를 동적으로 추가하게하십시오 새로운 정보 그런 다음 어떤 조치를 취할 지 기다려 봅시다

이것은 새로운 것이다 또는 그 중 하나를 삭제하도록 수정되었습니다 둘 중 하나를 삭제하도록 수정 됨 상황은 여기에있다 여기의 개념은 이전 단원에서 언급되었습니다 나는이 부분을 별도로 디자인 할 것이다

내 레이아웃 중 하나가 되십시오 내 데이터가 여기 프로그램에 있습니다 이것을 정보라고 부릅니다 어떻게 제시 될 것인가? 개념 변조기가있을 것입니다 다음은 어댑터입니다

변조기로의 데이터 ListView 대리자 변조기 이러한 자료를 처리하려면 이것이 우리 프로그래밍의 개념입니다 데이터 전송 그것을 알고 난 후에? 레이아웃을 매우 빨리 처리해 보겠습니다 레이아웃의 일부가 매우 빠릅니다 LinearLayout을 여기에서 사용하고 있습니다 여기에 LinearLayout 사용 LinearLayout이 방금 본 개념은 수직입니다

그래서 나는 여기서 수직적 인 입장을 취하고있다 그룹을 형성하기 위해 위에 두 개의 버튼이 있습니다 LinearLayout과 같습니다 Match_parent, wrap_content는 괜찮습니다 여기에는 비례적인 원칙이 없습니다

즉, 위쪽 행을 차지합니다 다음은 ListView에 모두 주어진다 여기 방향은 수평입니다 두 개의 버튼 정렬 버튼 여기 너비 때문에 버튼 폭 그래서 나는 그것을 1 : 1로 다루고있다 높이 match_parent wrap_content와 동일 함 Wrap_content 무게는 1입니다

여기에 버튼이있을 것입니다 나는이 버튼을 새로운 것으로 생각한다 추가 텍스트 추가 버튼 함수를 기다리는 분 여기에 두 개 중 하나가 병치되어 있습니다 Ctrl + C 붙여 넣기 복사 이 하나 삭제 삭제 그래서 두 가지 간단한 모양 문제 없어요 전체 모양이 세로이므로 주인공 데뷔작에 직접 쓰세요

ListView 호출 너비 match_parent 너 밑에 아무것도 없다하더라도 match_parent를 주어도 상관 없습니다 나머지 공간에 남겨주세요 이 요소의 내용 때문에 요소 하지만 여기 없어요 그래서 우리는 여기에 있습니다 자체 포함 된 쓰기는 Button과 동일합니다

나는 여기있다 그래서 한번 보자 나머지 공간이 남을 때까지 기다리십시오 이것은 디자인입니다 알았어

디자인이 완료되었습니다 함수는 프로그램이 처리 될 때까지 기다리는 것입니다 그래서 이드에게 그것을주는 것을 잊지 마라 나는 그것에게 명부를 준다 이 두 버튼 기다리기 우리는 또한 그것에게 기능을 줄 것이다

그렇다면 먼저 onClick을 할 것입니다 add라고 직접적으로 불린다 여기서 onClick은 Del이라고합니다 이제는 프로그램이 작성되지 않았기 때문에 빨간색 단어가 나타납니다 그것은 중요하지 않습니다

자동적으로 일어나도록합시다 또는 프로그램에서 수동으로 우리는 여기에서도 그것을 볼 수 있습니다 나는 직접 매뉴얼이다 Del을 클릭하면 레이아웃을 되돌아 볼 수 있습니다 여기에서도 제거됩니다

문제 없음 좋아, 방금 언급했다 이 레이아웃 이 레이아웃을 위해 디자인하고 싶습니다 이 레이아웃은 어떻게 설계 되었습니까? 우리는 여기에있다 喔 이 레이아웃에도 동일합니다 레이아웃이라고 부르기 때문에 배치하는 것입니다 레이아웃 레이아웃 우리 그래픽 자료는 드로어 블을 넣습니다 다른 부대의 다른 부분을 소개하겠습니다

현재는 이쪽 만 터치하십시오 우리는 여기에 추가 할 것입니다 레이아웃 리소스 파일 이 옵션에서 안쪽을 클릭하고 내 물건 중 하나라고 말하십시오 물론, 당신 스스로 그것을 명명해야합니다 좋아, 여기서 우리는 한 가지를 본다

우리는 리소스 영역에 처음으로 파일을 추가했습니다 여기에 파일 이름에 대한 규칙이 있습니다 규칙이 있습니다 너 중국어에오고 싶지 않아 우선 먼저 처음 전체적으로 영어 문서 이름을 사용하십시오

이 파일 이름에는 공백이 없습니다 결론을 원한다면, 이 특별한 기호는 없어 첫 번째 문자 영어 문자가 있어야 함 item1을 one one으로 말할 수 있습니다 하지만 그것은 첫 번째 편지가 아닙니다 중요하지 않습니다

무시할 것이 한 가지 더 있습니다 모두 소문자 매우 중요해, 그래서 나는 두 번 말하고있다 모두 소문자 모두 소문자 3 번 말할 때 매우 중요합니다 모두 소문자 좋은 아이템, 디자인하자 직접 디자인 가장 기본적인 간단한 디자인 우리는 여기 있습니다, 나는 여기 있습니다

LinearLayout이 제공합니다 LinearLayout LinearLayout이기 때문에, 당신은 알 것이다 우리는 무엇을 주어야합니까? 오리엔테이션 그래서 우리는 또한 여기에 방향을 제시합니다 하지만 이미 자동으로 볼 수 있습니까? 아무 것도 없다면 우리는 스스로 와야합니다 오리엔테이션 너비가 꽉 차면, 나는 그것이 단지 아이템이기 때문에 그것이 가득해야한다고 생각한다

그래서 여기에 wrap_content를 주겠다 위장 바로 먼저 TextView를 디자인 해 보겠습니다 그리 많지 않다 잠깐, 재량에 따라 늘려 보자 좋은 TextView 너비 match_parent 높이 wrap_content 이것은 우리가 제시하고자하는 텍스트를 기다리고 있습니다

그렇지 않으면 나는 그것이 괜찮다고 가정합니다 잠깐, 우리가 제시하는 것은 음악의 제목은 좋습니다 그래서 저는 item_title에 왔습니다 이런 변수 이름 좋아, 여기 써라

나는 레이아웃에 대한 통제로 그것을했다 프로그램의 일부분을 작성하는 데 잠깐 기다려주십시오

Android 中文教學 基礎 / 7-1 ListView – 1

우리는이 부대에서 여러분 중 한 명을 알게 될 것입니다 Android의 앱 매우 일반적인 인터페이스 호출 된 ListView 이 일은 어떻게 생겼는지 이야기 해 봅시다

예를 들어, 먼저 모든 사람의 휴대 전화가 음악을 재생하는 프로그램이있을 수 있습니다 반드시 나와 같은 것은 아닙니다 그러나이 음악 프로그램은, 나는 그것을 넣었다 나는 그것을 주문할 것이다 내 음악은 모든 노래를 본다

이런 식으로 목록을 만들 때 여기에 정보가 있는지를 알 수 있습니다 여기에있는 정보는 하나의 항목입니다 거기에 항목이 있습니다 좋습니다,이 전체는 ListView입니다 ListView 내부 하나씩 렌더링하는 항목이 있습니다

하나의 항목 그래서 우리 부서가 당신에게 소개하려고합니다 물론이 단위의 내용 우리는 정보를 기다린다 왜냐하면 먼저 ListView를 소개해야하기 때문입니다 따라서 데이터의 내용은 사전에 프로그램에 기록 될 수 있습니다 그리고 언제 그것을 어떻게 사용합니까? 여러 가지 방법으로 사용할 수 있습니다

원격 인터넷의 데이터가있을 수 있습니다 그것을 내려라 아마 휴대 전화 측의 SQLite 데이터베이스의 데이터 가능하다 그러한 정보의 근원은 우리가 지금 논의하고 있지 않은 것입니다 레이아웃이 어떻게 처리하는지 이야기 해보자

레이아웃은 데이터의 출처와 상관없이 처리합니다 원칙은 동일합니다 우리가이 물건을 여기서 보았을 때, 나는 너에게 먼저 한 가지를 보러 올 것이다 레이아웃이 위에 있습니다 레이아웃의 상기 구성의 원리 여기서 원칙은 프로젝트를 만드는 것입니다

여기 한 프로젝트 잠깐,이 프로젝트를 별도로 진행할 것입니다 레이아웃으로 설계됨 전체는 소위 변조기 어댑터를 통해 이루어집니다 행동을 통합하는 것을 돕기 위해 그래서 당신이 원리를 이해한다면 이 부분은 아주 간단합니다 원칙을 이해하는 것을 잊지 마세요 좋아, 구현 해보자

나처럼되어주세요 먼저 프로젝트를 열 준비가되었습니다 해보자

Android基礎 / 7-3 ListView – 3

방금 레이아웃 처리가 완료되었습니다 다음으로 우리는 프로그램의 일부로 돌아가서 처리해야합니다

프로그램의 일부는 우리 레이아웃의 최상위를 압니다 하나의 ListView에만 id가 부여됩니다 항목이 그 아래에 매달려 있습니다 잠시 기다려주세요 그래서 나는 처음에 발표하기 위해 왔습니다

비공개 선언은 ListView를가집니다 이러한 ListView는 직접 제공됩니다 listView 세미콜론 이 장소에서 레이아웃을 얻은 후에 listView는 같을 것이다 조회수를 찾는 방법 찾으려는 R 포인트 ID 포인트 목록 이제 사람들이 이미 내 손에 들어 있습니다 그럼 내가 너에게 제안을 해줄거야

우리의 프로그램 코드는 그렇게 지저분하지 않습니다 잠깐,이 listView를 처리 할 수있는 것들이있을 것입니다 관련 설정 그럼 내가 여기 쓰면 지저분해질거야 다른 기능이 있다면 점점 더 혼란 스러울 것입니다 그래서 나는 여기서 하나의 방법을 개발할 수도 있습니다

private void initListView 이름에서 알 수 있듯이 이 listView를 초기화하는 액션 그러나 초기화하기 전에 listView를 가져야한다는 것을 기억하십시오 전화하는 것을 잊지 마세요 나는 전화 할께 그래서 저는 지금 매우 세심합니다 여기에서 listView를 초기화하려면이 함수를 작성하십시오

앞으로도 당신에게 편리합니다 ListView에서 처리 할 프런트 엔드 작업을 알고 있습니까? 내 방법으로는 괜찮을거야 내가해야 할 첫 번째 일은 이것입니다 잠깐, 정보가 전달 될 것입니다 이 정보를 전달하는 방법에 대해 먼저 소스를 살펴 봅니다

그건 그렇고, 나는이 단원에서 너를 가르친다 학습 방법 우리는 see을 본다 우리가 setAdapter 모듈레이터를 전달하고자하는 listView 당신은 그것이 우리의 매개 변수에있는 것임을 알 수 있습니다 ListAdapter를 원한다 하지만 지금 내 손에 달렸어? 나는 그것을 가지지 않았다

그래서 나는 여기에 갇힐 것이다 즉, 나보다 내러티브 문장에 있습니다 그런 어댑터를 원한다 이 변조기는 어떻습니까? 가장 단순한 시리즈는 Simple SimpleAdapter ListAdapter의 구현입니다 이 어댑터는 어떻게 생겼습니까? 새로운 SimpleAdapter 나중에 매개 변수 열이 화면에 표시됩니다

꽤 많이, 하나씩 천천히 와서 잠깐, 우리는 먼저 기억할 것이다 첫 번째 컨텍스트, 모든 컨텍스트를 본다 나는 커서를 움직이지 않고 여기에있다 이 노란 조각을보기 위해 나를 따라 갔다

컨텍스트는 거기에있다 안드로이드에서이게 누구야? 활동, 이러한 서비스는 다음과 같습니다 그리고 우리는 현재 활동입니다 그게 바로 당신이 첫 번째 매개 변수에있는 이유입니다 이 객체 만 채울 필요가 있습니다

이 카테고리의 개체 엔터티 그가 대담하다는 것을 계속해서 보게되는 만화 필요한 정보는 List를 사용하는 것입니다 이 Java 데이터 구조 위장은 무엇입니까? 지도 이 Map의 키는 될 문자열입니다 이것을 기억해 두십시오, 우리가 정보를하기를 기다립니다 이제는 null을 먼저 쓰지 않습니다 나는 이것을 기억해야한다

세 번째 매개 변수 그렇다면 귀하의 레이아웃은 어떻습니까? 위대한, 우리는 방금 그것을 썼다 R 포인트 레이아웃 포인트 항목 이미 작성되었습니다 두 가지 매개 변수가 더 있습니다 이 사람에게 전화 한 사람이 우리는 아직 쉼표 두 명은 아직 실종됐다 그래서 지금 나는이 일들을 생각해 내야한다

내가 처음 보았던 한가지 데이터 구조 나는 LinkedList를 사용한다 이 것을 구현하려면 그리고 그것은 단지 말했다 우리는 위장 안에지도가 있습니다 나는 이것을하기 위해 HashMap을 사용한다 다시 말했어

이 Map의 키는 캐릭터 라인입니다 다음 문자열 내 레이아웃이 TextView이기 때문에 그냥 내용의 문자열 일이 그래서 나는 또한 여기에 발표 할 것이다 값 문자열 이러한 데이터 데이터는 직접 출력합니다 LinkedList 그래서 이미이 객체 엔티티가 있습니다 그래서 이것을 null에 넣을 수 있습니까? 데이터로 변경됨 ~에서 또 다른 것이 있습니다

매우 단순한 개념에서부터 아주 간단한 개념, 한번 보자 그것의 첫 번째는 문자열 배열입니다 나는에서 직접 쓴다 내용을 비워두면 다시 볼 수 있습니다 정수 배열은 과거와 같습니다

나는 그것을 비워두고 잠깐 기다려야한다 이 두 매개 변수를 직접 입력하십시오 에서까지 우리가 그 개념을 볼 때까지 기다린다 하지만 먼저 코드에 오류가 없도록하겠습니다 이제이 모듈레이터를이 모듈에 연결해야합니다

이것은 모두 완료되었습니다 이것은 우리의 구조이지만 당신은 알고 있습니다 데이터 구조에는 배꼽이 없습니다 시작부터 끝까지 그래서 지금 나는이 장소에서 비어있는 구조를 방금 떠났다 잠깐, 다음 프로그램을 보자

아이디어가있는 곳 이 단락은 여기서 내가 준비하도록 도와 줄 것입니다

Android基礎 / 7-4 ListView – 4

그럼 보자 우리는 무엇인가보아야합니다

그럼 데이터를 봅시다 이 정보를 먼저 다루는 것 정보 방금이 콘텐츠가 HashMap 인 것을 보았습니다 그래서 저는 먼저 일련의 정보를 선언 할 것입니다 HashMap 그런 다음 String 문자열 키, 값 이것은 내 d0 데이터입니다 새로운 HashMap과 같습니다

아무것도, 뭔가를 던져 보자 D0 점 넣기 좋아, 이제 개념을 보자 첫 번째는 키입니다 이 키 즉, 데이터 링크의 연관 문자열로 처리됩니다 이 문자열은 喔입니다

이 문자열을 통해 문자열 그것의 내용은 뒤에 그것의 가치가있을 것이다 먼저와 봅시다 Test1 그래서 Test1은 제가 제시하고자하는 것입니다 그러나 열쇠는이 문자열입니다 확인을 위해이 문자열이 기다립니다 정보 출처가 있습니까? 여기에서이 열쇠가 다가옵니다

여기에 소개되었습니다 나는이 문장을 한 번 읽었다 이 Test1을 기다리십시오 문자열 배열에서이 것이 될 것입니다 똑같이 봐라

equals 메서드를 사용하여이 문제를 처리합니다 따라서 정보가 동일하면 똑같은 내용 우리는 제목을 부르는 것처럼 보입니다 나는 제목을 쓸 것입니다 제목이나 원하는 것을 쓸 지 여부는 여기에 쓰는 것은 제목입니다 엄격한 경우 실수를 피하는 방법? 매우 단순하며 전면에 모두 정의 됨 올린 사람 : [0] 제로 요소 좋아, 우리는 한 번 읽고있다

이 Test1 그냥 그것을 체크 아웃합니다 쌍과 쌍 사이의 통신은 어디에 있습니까? 바로 여기에 레이아웃이 있습니다 R 점 ID 포인트 방금 본 item_title 거기 있니? 그래서 이것은 이미 형성되었습니다 매우 표준적인 행동 일대일 데이터 컨텐츠 이 프로젝트의 꼭대기에 오르십시오 좋아, 이건 그룹이야

그러나 당신은 당신이 지금 무엇인지 알 필요가 있습니다 아무도 그것이 단지 독립 변수가 아님을 아무도 모른다 우리는 데이터에 있어야합니다 데이터 포인트 추가로 이동 D0 올라간다 좋습니다

이것은 내 정보 집합입니다 자, 우리의 현재 프로그램을 살펴 보겠습니다 첫 번째 실행 상태는 어떻습니까? 잠깐, 이걸로 실행됩니다 구현 중 하나를 살펴 보겠습니다 따라서 첫 번째 실행은 동일합니다

조금 더 시간을 할애 할거야 지금 건물입니다 빌드가 완료되었습니다 설치가 설치됩니다 직접 성공적으로 설치 좋은 이미 구현 됨 모두 여기 그것을 봅니다

우리는 그림을 다룰 필요가 없으므로 작습니다 먼저 더 많은 정보를 얻으십시오 더 많은 포인트 따라서 복사 방법을 사용하십시오 기타 D0, d1 Test2, Test3 D2 여기서 실수하지 마라 이것은 d1이다

순서대로 d1 추가 D2가 추가됨 LinkedList 때문에 순차적으로 그래서 나는 나중에 1, 2, 3을 볼 것입니다 다시 해보자 보기 아주 좋은 정보가 올라 갔다 정보는이 모델을 통해 최대로 올라갔습니다 하나씩 이동 좋아, 그러면 우리는 모두 하나씩 하나이다

좋아, 그것을 탭할 수 있습니다 ListView의 효과 아직 조치를 취하지 않았다 우리는 먼저 데이터를 충분히 제시해야합니다 동적으로 수정할 수 있습니다 그래서 나는이면을 추가하거나 삭제할 것이다

이제 한 가지만 보자 내가 추가 할 때 그러한 정보를 추가해야합니까? 그래서 여기에서 디자인을 시작했습니다 이 항목을 넣으십시오 메소드에서 지역 변수가됩니다 그래서 잠깐, 나는 문제에 접근 할 수 없다

이들은 작은 것들이다 우리는 발표를하기 위해 그것을 밖으로 가져 갔다 나는 그것을 위로 옮겼다 선언의 행위는 우리의 과정에있다 이 때 그것을 가져 가라

나는이 모든 것을 소위 개인 프라이빗이라고 선언한다 개인적으로하는 것이 좋습니다 정보는 중요하지 않습니다 LinkedList 아래에 추가되기 때문에 변조기 또한 매우 중요합니다 그래서 여기에서 나는 그것을 조정하고 기른다

Ctrl + c 가져 가라 비공개로 붙여 넣기 OK, 세미콜론을 채 웁니다 선언 된 행동 그래서 지금 다시하고 있습니다 사실, 정확히 동일합니다 중요하지 않으므로 잠시만 기다려 봅시다

새로운 액션을 보자 잠깐, 우리는 喔을 추가해야한다 이 데이터 항목 이상으로 등호 추가 구조가 이렇게 동일하게 합쳐질 것입니다 그래서 나는 다시 쓸거야 새 버튼을 누르면 추가 정보 지역 변수는 d2입니다

중요하지 않습니다 지역 변수 그래서 나를 위해, 당신은 볼 것입니다 이 데이터 구조에 익숙하지 않음 좋은 그러나 변조기는 어떻게 알 수 있습니까? ListView는 어떻게 알 수 있습니까? 나는 당신이 방금 그것을 안으로 추가했기 때문에 전혀 모른다 매우 중요한 움직임을 기억하십시오 우리에게이 변조기 어댑터를 제공해주세요

그것을 알리는 알림을 만드십시오 당신은이 방법의 이름이 아주 좋은 것을 보았습니다 喔 데이터 세트가 변경되었습니다 그래서 그것은 그것을 촉발시킨 정보를 바꿀 것입니다 기타, 우리는 걱정할 필요가 없습니다 그런 다음 방금 게시했습니다

반복 발표 그래서 여기서 벗어 버려라 외부 참조 네가 올 때 우리를 만나라 이제이 새로운 버튼이 있습니다 우리가 그것을 설치 한 후에, 와서 그 상태를보기 위해 달려라 보기 자, 처음에는 세 개가 있습니다

추가, 추가, 추가 ADD ~ 끊임없이 증가하고있는 것이 분명합니다 선한 것이 계속 증가하고 있습니다 미끄럼을 사용할 수도 있습니다 나는 그것을 지금 미끄러지고있다 어떤 미끄러짐이 있습니까? 그래서 똑같은 원칙 같은 원리를하는 법 정보를 꺼내십시오

예를 들어 여기에서 판단하겠습니다 데이터 및 데이터의 크기 그럼 나는 항상 그것을자를 수 있습니다 우리의 데이터를 부탁드립니다 제거 정보를 잘라내십시오 내가 모두 0 번째라고 가정 해보자

0 번째는 모두 잘라 버렸어 동일한 정보가 변경되었습니다 어댑터를 조정하십시오 알림을 알리려면 그게 전부 야 이 기능은 다시 쓰기 쉽습니다

추가 및 삭제 실험을 잘 해보 죠 와서 바로 시험해보십시오 나는 새로운 기능의 영향을 받기 싫어 수 이제 DEL을 누르면 0 번째를 자르고 싶습니다 0 번째 컷, 컷 오프 ~ 빛을 자르는 것도 괜찮습니다

다시 누르십시오 if의 판단을 사용했기 때문에 ~을 추가하는 것이 좋습니다 아주 간단하다 확인