Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2017 수원 안드로이드 라이브러리 스터디 - 안드기초 3/4

2017 수원 안드로이드 라이브러리 스터디 - 안드기초 3/4

시간 : 2017.06.23 (금) 20시 ~ 22시 (2시간)
장소 : 수원역 유앤아이 스터디룸 O룸
참여자 : 7명

Avatar for jwk1014

jwk1014

June 27, 2017
Tweet

More Decks by jwk1014

Other Decks in Programming

Transcript

  1. 03 - Library & RecyclerView build.gradle (Project) о਍ؘ ࠁ੉ח repositories

    উী ਤ৬ э੉ mavenCentral()ਸ ୶о೤פ׮.
  2. 03 - Library & RecyclerView build.gradle (Module: app) build.gradle(Module:app)౵ੌ۽ ੉زೞৈ

    ઺рী extۄח ৔৉ਸ ٜ݅Ҋ ਤ৬ э੉ ੘ࢿೞৈ ߡ੹ ं੗ܳ ҙܻೞѷणפ׮. dependenciesب ਤ৬ э਷ ղਊਵ۽ ٮۄ೧઱ࣁਃ. (׮਺ ੢ী ࠂࢎೡ ࣻ ੓ח ఫझ౟о ੓णפ׮.)
  3. 03 - Library & RecyclerView build.gradle (Module: app) ext {


    androidSupport = "25.3.1"
 
 gson = "2.8.1"
 okhttp = "3.8.1"
 retrofit = "2.3.0"
 
 glide = "3.8.0"
 glideOkhttp = "1.5.0"
 } compile "com.android.support:appcompat-v7:${androidSupport}"
 compile "com.android.support.constraint:constraint-layout:1.0.2"
 compile "com.android.support:recyclerview-v7:${androidSupport}"
 
 compile "com.google.code.gson:gson:${gson}"
 compile "com.squareup.okhttp3:okhttp:${okhttp}"
 compile "com.squareup.okhttp3:okhttp-urlconnection:${okhttp}"
 compile "com.squareup.retrofit2:retrofit:${retrofit}"
 compile "com.squareup.retrofit2:converter-gson:${retrofit}"
 
 compile "com.github.bumptech.glide:glide:${glide}"
 compile "com.github.bumptech.glide:okhttp3-integration:${glideOkhttp}" ${੉ܴ} ޙߨਸ ࢎਊೞӝ ਤ೧ࢲח Ӓր ٮ১಴(‘)о ইצ हٮ১಴(“)উীࢲ оמ೤פ׮. ৽ଃ ߡ੹ ं੗ٜ਷ 2017-06-22ী ഛੋೠ ୭नߡ੹ं੗ੑפ׮.
  4. 03 - Library & RecyclerView Application manifestsܳ ৌҊࢲ <application> కӒী

    android:name ࣘࢿਸ ਤ৬ э਷ ղਊਵ۽ ୶о೤פ׮.
  5. 03 - Library & RecyclerView Application Application ௿ېझܳ ࢚ࣘ߉Ҋ, manifests੄

    <application>కӒ੄ android:nameী ୶оػ ௿ېझח জ੉ ԁઉ੓׮о ெ૕ ٸ о੢ ୊਺ प೯غח ௿ېझੑפ׮. Glide੄ ݫݽܻ ୭؀ࢎਊ ࢸ੿ਸ ਤ೧ ਤ৬ э਷ ղਊਸ ੘ࢿ೧઱ࣁਃ.
  6. 03 - Library & RecyclerView RecyclerView BDUJWJUZ@NBJOYNM <RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"


    android:layout_height="match_parent">
 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:layout_width="match_parent"
 android:layout_height="match_parent"/>
 </RelativeLayout>
  7. 03 - Library & RecyclerView RecyclerView MJTU@DPOUFOUYNM <RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"


    android:layout_height="100dp">
 <TextView
 android:id="@+id/list_content_textview_rank"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_centerVertical="true"
 android:layout_marginLeft="5dp"
 android:layout_marginStart="5dp"
 android:text="ࣽਤ"/>
 <ImageView
 android:id="@+id/list_content_imageview"
 android:layout_width="100dp"
 android:layout_height="100dp"
 android:layout_toRightOf="@+id/list_content_textview_rank"
 android:layout_toEndOf="@+id/list_content_textview_rank"
 android:src="@mipmap/ic_launcher"/>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_toEndOf="@+id/list_content_imageview"
 android:layout_toRightOf="@+id/list_content_imageview"
 android:layout_marginRight="10dp"
 android:layout_marginEnd="10dp"
 android:layout_marginBottom="5dp"
 android:orientation="vertical"> <TextView
 android:id="@+id/list_content_textview_title"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="2"
 android:gravity="center_vertical"
 android:ellipsize="end"
 android:textSize="20sp"
 android:textStyle="bold"
 android:text="ઁݾ"/>
 <TextView
 android:id="@+id/list_content_textview_title_en"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 android:gravity="center_vertical"
 android:text="৔ޙઁݾ"/>
 <TextView
 android:id="@+id/list_content_textview_title_admission"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 android:gravity="center_vertical"
 android:text="ҙۈо"/>
 <TextView
 android:id="@+id/list_content_textview_title_releaseDate"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1"
 android:gravity="center_vertical"
 android:text="ѐࠉੌ"/>
 </LinearLayout>
 </RelativeLayout>
  8. 03 - Library & RecyclerView RecyclerView 7JFX)PMEFS public class ExRecyclerViewHolder

    extends RecyclerView.ViewHolder {
 private TextView tvRank, tvTitle, tvTitleEn, tvAdmission, tvReleaseDate;
 private ImageView imageView;
 
 public ExRecyclerViewHolder(View v){
 super(v);
 tvRank = (TextView)v.findViewById(R.id.list_content_textview_rank);
 imageView = (ImageView)v.findViewById(R.id.list_content_imageview);
 tvTitle = (TextView)v.findViewById(R.id.list_content_textview_title);
 tvTitleEn = (TextView)v.findViewById(R.id.list_content_textview_title_en);
 tvAdmission = (TextView)v.findViewById(R.id.list_content_textview_title_admission);
 tvReleaseDate = (TextView)v.findViewById(R.id.list_content_textview_title_releaseDate);
 }
 
 public void setData(MovieData item){
 //TODO
 }
 }
  9. 03 - Library & RecyclerView RecyclerView "EBQUFS public class ExRecyclerViewAdapter

    extends RecyclerView.Adapter<ExRecyclerViewHolder> {
 private List<MovieData> list;
 //ڸ਎ ղਊٜ੉ ٜয੓ח List
 
 public ExRecyclerViewAdapter(List<MovieData> list){
 this.list = list;
 }
 
 @Override
 public ExRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 //parent = ೠ஢ೠ஢੄ Viewٜਸ ੗धਵ۽ о૑ח ࠗݽView
 View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_content,parent,false);
 //R.layout.list_content੄ ݽনਸ View۽ ࢤࢿ
 return new ExRecyclerViewHolder(v);
 //ViewHolder ࢤࢿ റ ܻఢ
 //ViewHolderۆ ೠ஢ী ؀ೠ Viewܳ ҙܻೞח ௿ېझ
 }
 
 @Override
 public void onBindViewHolder(ExRecyclerViewHolder holder, int position) {
 //holder = onCreateViewHolderীࢲ ࢤࢿ೧ળ ViewHolder // position = അ੤ ݻߣ૩ ஢ੋ૑
 MovieData item = list.get(position);
 //listীࢲ ೧׼ ߣ૩ itemਸ оઉয়ӝ
 holder.setData(item);
 //ViewHolderীѱ itemਸ Ѥ֎઱য ೧׼ ߣ૩ী ݏח ղਊਸ ੜ಴दೞب۾ ೣ
 }
 
 @Override
 public int getItemCount() {
 return list.size(); // ୨ ݻѐ੄ ஢ਸ ڸਕঠೞח૑
 }
 }
  10. 03 - Library & RecyclerView RecyclerView .BJO"DUJWJUZ public class MainActivity

    extends AppCompatActivity{
 private LinearLayoutManager linearLayoutManager;
 private ExRecyclerViewAdapter viewAdapter;
 private List<MovieData> list;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 setContentView(R.layout.activity_main);
 
 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
 linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
 recyclerView.setLayoutManager(linearLayoutManager);
 recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
 list = new ArrayList<>();
 for(int i=0;i<10;i++)
 list.add(new MovieData());
 recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list));
 }
 }
  11. 03 - Library & RecyclerView public class RetrofitManager {
 private

    static RetrofitManager manager;
 private RetrofitUrl url;
 
 public static RetrofitManager getInstance(){
 if(manager == null)
 manager = new RetrofitManager();
 return manager;
 }
 
 public static void clearInstance(){
 manager = null;
 }
 
 private RetrofitManager(){
 OkHttpClient client = new OkHttpClient.Builder().build();
 Retrofit retrofit = new Retrofit.Builder()
 .baseUrl(RetrofitUrl.BASE_URL)
 .addConverterFactory(GsonConverterFactory.create(new Gson()))
 .client(client)
 .build();
 url = retrofit.create(RetrofitUrl.class);
 }
 
 public RetrofitUrl getUrls(){
 return url;
 }
 
 public interface RetrofitUrl{
 String BASE_URL = "http://movie.daum.net";
 
 @GET("/data/movie/movie_info/ticket_rank_no_mid.json")
 Call<MovieResponse> rankList(
 @Query("pageNo") int pageNo,
 @Query("pageSize") int pageSize
 );
 }
 } RecyclerView 3FUSPGJU.BOBHFS
  12. 03 - Library & RecyclerView RecyclerView 7JFX)PMEFS public class ExRecyclerViewHolder

    extends RecyclerView.ViewHolder {
 private TextView tvRank, tvTitle, tvTitleEn, tvAdmission, tvReleaseDate;
 private ImageView imageView;
 
 public ExRecyclerViewHolder(View v){
 super(v);
 tvRank = (TextView)v.findViewById(R.id.list_content_textview_rank);
 imageView = (ImageView)v.findViewById(R.id.list_content_imageview);
 tvTitle = (TextView)v.findViewById(R.id.list_content_textview_title);
 tvTitleEn = (TextView)v.findViewById(R.id.list_content_textview_title_en);
 tvAdmission = (TextView)v.findViewById(R.id.list_content_textview_title_admission);
 tvReleaseDate = (TextView)v.findViewById(R.id.list_content_textview_title_releaseDate);
 }
 
 public void setData(MovieData item){
 tvRank.setText(""+item.getRank().getRanking());
 if(item.getPhoto() != null && item.getPhoto().getFullname() != null)
 Glide.with(itemView.getContext()).load(item.getPhoto().getFullname()).into(imageView);
 tvTitle.setText(item.getTitleKo());
 if(item.getTitleEn() != null)
 tvTitleEn.setText(item.getTitleEn());
 if(item.getAdmissionDesc() != null)
 tvAdmission.setText(item.getAdmissionDesc());
 if(item.getReleaseDateStr() != null)
 tvReleaseDate.setText(item.getReleaseDateStr());
 }
 }
  13. 03 - Library & RecyclerView public class MainActivity extends AppCompatActivity

    implements Callback<MovieResponse>{
 private LinearLayoutManager linearLayoutManager;
 private ExRecyclerViewAdapter viewAdapter;
 private List<MovieData> list;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 setContentView(R.layout.activity_main);
 
 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
 linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
 recyclerView.setLayoutManager(linearLayoutManager);
 recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
 recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>()));
 
 RetrofitManager.getInstance().getUrls().rankList(1,10).enqueue(this);
 }
 
 @Override
 public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
 MovieResponse movieResponse = response.body();
 if(movieResponse != null){
 for(MovieData movieData:movieResponse.getData()){
 String rd = movieData.getReleaseDate();
 if(rd != null)
 movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ”, rd.substring(0,4),rd.substring(4,6),rd.substring(6,8)));
 }
 list.addAll(movieResponse.getData());
 viewAdapter.notifyDataSetChanged();
 }else
 Toast.makeText(MainActivity.this,"ؘ੉ఠ য়ܨ",Toast.LENGTH_SHORT).show();
 }
 
 @Override
 public void onFailure(Call<MovieResponse> call, Throwable t) {
 Toast.makeText(MainActivity.this,"֎౟ਕ௼ য়ܨ",Toast.LENGTH_SHORT).show();
 Log.e("Retrofit","rankList",t);
 }
 } RecyclerView .BJO"DUJWJUZ
  14. 03 - Library & RecyclerView SwipeRefreshLayout BDUJWJUZ@NBJOYNM <android.support.v4.widget.SwipeRefreshLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"


    android:layout_height="match_parent"
 android:id="@+id/swipeRefreshLayout">
 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerview"
 android:layout_width="match_parent"
 android:layout_height="match_parent"/>
 </android.support.v4.widget.SwipeRefreshLayout>
  15. 03 - Library & RecyclerView SwipeRefreshLayout .BJO"DUJWJUZ public class MainActivity

    extends AppCompatActivity implements Callback<MovieResponse>, SwipeRefreshLayout.OnRefreshListener{
 private SwipeRefreshLayout swipeRefreshLayout;
 private LinearLayoutManager linearLayoutManager;
 private ExRecyclerViewAdapter viewAdapter;
 private List<MovieData> list;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 setContentView(R.layout.activity_main);
 
 swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout);
 swipeRefreshLayout.setOnRefreshListener(this);
 
 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
 linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
 recyclerView.setLayoutManager(linearLayoutManager);
 recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
 recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>()));
 
 swipeRefreshLayout.setRefreshing(true);
 onRefresh();
 }
 
 @Override
 public void onRefresh() {
 list.clear();
 viewAdapter.notifyDataSetChanged();
 RetrofitManager.getInstance().getUrls().rankList(1,10).enqueue(this);
 }
  16. 03 - Library & RecyclerView SwipeRefreshLayout .BJO"DUJWJUZ @Override
 public void

    onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
 MovieResponse movieResponse = response.body();
 if(movieResponse != null){
 for(MovieData movieData:movieResponse.getData()){
 String rd = movieData.getReleaseDate();
 if(rd != null)
 movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ",
 rd.substring(0,4),rd.substring(4,6),rd.substring(6,8)));
 }
 list.addAll(movieResponse.getData());
 viewAdapter.notifyDataSetChanged();
 }else{
 Toast.makeText(MainActivity.this,"ؘ੉ఠ য়ܨ",Toast.LENGTH_SHORT).show();
 }
 swipeRefreshLayout.setRefreshing(false);
 }
 
 @Override
 public void onFailure(Call<MovieResponse> call, Throwable t) {
 Toast.makeText(MainActivity.this,"֎౟ਕ௼ য়ܨ",Toast.LENGTH_SHORT).show();
 Log.e("Retrofit","rankList",t);
 swipeRefreshLayout.setRefreshing(false);
 }
 }
  17. 03 - Library & RecyclerView 마지막 칸 도달 여부 Listener

    .BJO"DUJWJUZ public class MainActivity extends AppCompatActivity implements Callback<MovieResponse>, SwipeRefreshLayout.OnRefreshListener{
 private SwipeRefreshLayout swipeRefreshLayout;
 private LinearLayoutManager linearLayoutManager;
 private ExRecyclerViewAdapter viewAdapter;
 private List<MovieData> list;
 private int page = 1;
 private boolean loading = false;
 private boolean more = true;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 setContentView(R.layout.activity_main);
 
 swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout);
 swipeRefreshLayout.setOnRefreshListener(this);
 
 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
 linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
 recyclerView.setLayoutManager(linearLayoutManager);
 recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
 recyclerView.setAdapter(viewAdapter = new ExRecyclerViewAdapter(list = new ArrayList<>()));
 
 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
 @Override
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 super.onScrolled(recyclerView, dx, dy);
 if(more && !loading) {
 int visibleItemCount = recyclerView.getChildCount();
 int totalItemCount = linearLayoutManager.getItemCount();
 int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
 if((totalItemCount - visibleItemCount) <= (firstVisibleItem + 3)) {
 dataLoad();
 }
 }
 }
 });
 
 swipeRefreshLayout.setRefreshing(true);
 onRefresh();

  18. 03 - Library & RecyclerView 마지막 칸 도달 여부 Listener

    3FDZDMFS7JFX0O4DSPMM-JTUFOFS recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
 @Override
 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
 super.onScrolled(recyclerView, dx, dy);
 if(more && !loading) {
 int visibleItemCount = recyclerView.getChildCount();
 int totalItemCount = linearLayoutManager.getItemCount();
 int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
 if((totalItemCount - visibleItemCount) <= (firstVisibleItem + 3)) {
 dataLoad();
 }
 }
 }
 });
  19. 03 - Library & RecyclerView 마지막 칸 도달 여부 Listener

    .BJO"DUJWJUZ private void dataLoad(){
 loading = true;
 RetrofitManager.getInstance().getUrls().rankList(page,10).enqueue(this);
 }
 
 @Override
 public void onRefresh() {
 list.clear();
 viewAdapter.notifyDataSetChanged();
 page = 1;
 more = true;
 dataLoad();
 }

  20. 03 - Library & RecyclerView 
 @Override
 public void onResponse(Call<MovieResponse>

    call, Response<MovieResponse> response) {
 Log.i("MainActivity","onResponse");
 MovieResponse movieResponse = response.body();
 if(movieResponse != null){
 for(MovieData movieData:movieResponse.getData()){
 String rd = movieData.getReleaseDate();
 if(rd != null)
 movieData.setReleaseDateStr(String.format("%s֙ %sਘ %sੌ ѐࠉ”, rd.substring(0,4),rd.substring(4,6),rd.substring(6,8)));
 }
 list.addAll(movieResponse.getData());
 viewAdapter.notifyDataSetChanged();
 page++;
 if(list.size() >= movieResponse.getCount())
 more = false;
 }else{
 Toast.makeText(MainActivity.this,"ؘ੉ఠ য়ܨ",Toast.LENGTH_SHORT).show();
 }
 swipeRefreshLayout.setRefreshing(false);
 loading = false;
 }
 
 @Override
 public void onFailure(Call<MovieResponse> call, Throwable t) {
 Toast.makeText(MainActivity.this,"֎౟ਕ௼ য়ܨ",Toast.LENGTH_SHORT).show();
 Log.e("Retrofit","rankList",t);
 swipeRefreshLayout.setRefreshing(false);
 loading = false;
 } 마지막 칸 도달 여부 Listener .BJO"DUJWJUZ
  21. 03 - Library & RecyclerView 다음시간에는 *OUFOU TUBSU"DUJWJUZ &YUSB TUBSU"DUJWJUZ'PS3FTVMU

    PWFSSJEF1FOEJOH5SBOTJUJPO ׮ܲজৌӝ  PWFSSJEF1FOEJOH5SBOTJUJPOࢎਊೞӝਤ೧SFTBOJNীগפݫ੉࣌YNM୶о )BOEMFS 5ISFBE ٍ۽оӝ־ܰݶজઙܐ TVQQPSUFE"DUJPO#BS UJUMF IPNF"T6Q  "MFSU%JBMPH DBODFM QPTJUJWF  42-JUF 42-JUF0QFO)FMQFS  42-ޙߨ઺DSFBUFUBCMF TFMFDU JOTFSU VQEBUF EFMFUFܳݽܰदח࠙਷׮਺झఠ٣੹ө૑ҕࠗ೧઱ࣁਃ  ׮਺઱ਘਃੌਸ՘ਵ۽উ٘۽੉٘ӝୡઙܐറ%BHHFSࠗఠۄ੉࠳۞ܻझఠ٣द੘೤פ׮