Урок 10. Работа с RecyclerView на примере TweetsRecyclerView – Devcolibri – Android для начинающих

Урок 10. Работа с RecyclerView на примере TweetsRecyclerView

Добавление разделителя информации о пользователе и списка твитов

Вначале вспомним, как должен выглядеть блок информации о пользователе.

 

Delimeter.png

 

Видим, что нам необходимо добавить View серого цвета после информации о пользователе и разместить под ней список RecyclerView. Мы бы могли поместить эту Viewпросто под последним TextView, но View должна занимать всю ширину. Это трудно сделать потому что у RelativeLayout установлено свойтво padding, которое делает отступ перед всеми вложенными элементами. Поэтому сделаем LinearLayout корневым элементом нашего layout, в свою очередь у него будет 3 вложенных элемента:

  • RelativeLayout с информацией о пользователе. Тот контейнер, который до этого момента являлся корневым.
  • View – разделитель информации.
  • RecyclerView – список твитов, который мы добавим чуть позже в этом уроке.

Наш layout после этих преобразований выглядит так:

 

activity_user_info.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?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="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/user_image_view"
            android:layout_width="96dp"
            android:layout_height="96dp"
            android:src="@mipmap/ic_launcher"/>

        <TextView
            android:id="@+id/user_name_text_view"
            style="@style/TextView.Primary.Header"
            android:layout_below="@id/user_image_view"
            android:layout_marginTop="@dimen/text_small_margin"
            android:text="Имя"/>

        <TextView
            android:id="@+id/user_nick_text_view"
            style="@style/TextView.Secondary"
            android:layout_below="@id/user_name_text_view"
            android:layout_marginTop="@dimen/text_small_margin"
            android:text="Ник"/>

        <TextView
            android:id="@+id/user_description_text_view"
            style="@style/TextView.Primary"
            android:layout_below="@id/user_nick_text_view"
            android:layout_marginTop="@dimen/text_small_margin"
            android:text="Описание"/>

        <TextView
            android:id="@+id/user_location_icon_text_view"
            style="@style/TextIcon"
            android:layout_alignBaseline="@id/user_location_text_view"
            android:layout_below="@id/user_description_text_view"
            android:layout_marginTop="@dimen/text_small_margin"
            android:text="@string/fa_map_marker"/>

        <TextView
            android:id="@+id/user_location_text_view"
            style="@style/TextView.Secondary"
            android:layout_below="@id/user_description_text_view"
            android:layout_marginStart="10dp"
            android:layout_marginTop="@dimen/text_small_margin"
            android:layout_toEndOf="@id/user_location_icon_text_view"
            android:text="Местоположение"/>

        <TextView
            android:id="@+id/following_count_text_view"
            style="@style/TextView.Primary.Bold"
            android:layout_below="@id/user_location_text_view"
            android:layout_marginTop="@dimen/text_small_margin"
            android:text="4"/>

        <TextView
            android:id="@+id/following_text_view"
            style="@style/TextView.Secondary"
            android:layout_below="@id/user_location_text_view"
            android:layout_marginStart="5dp"
            android:layout_marginTop="@dimen/text_small_margin"
            android:layout_toEndOf="@+id/following_count_text_view"
            android:text="@string/following_hint"/>

        <TextView
            android:id="@+id/followers_count_text_view"
            style="@style/TextView.Primary.Bold"
            android:layout_below="@id/user_location_text_view"
            android:layout_marginStart="20dp"
            android:layout_marginTop="@dimen/text_small_margin"
            android:layout_toEndOf="@+id/following_text_view"
            android:text="4"/>

        <TextView
            android:id="@+id/followers_text_view"
            style="@style/TextView.Secondary"
            android:layout_below="@id/user_location_text_view"
            android:layout_marginStart="10dp"
            android:layout_marginTop="@dimen/text_small_margin"
            android:layout_toEndOf="@+id/followers_count_text_view"
            android:text="@string/followers_hint"/>

    </RelativeLayout>

    <View
        android:id="@+id/delimeter_view"
        android:layout_width="match_parent"
        android:layout_height="6dp"
        android:layout_marginTop="@dimen/text_small_margin"
        android:background="@color/gray_mercury"/>
</LinearLayout>

 

Видим, что наш RelativeLayout практически не изменился. Единственное что мы изменили – поменяли значения атрибута android:layout_height c match_parent на wrap_content. Это необходимо, чтобы нашему разделителю хватило места на экране.

Мы просто сделали корневым элементом LinearLayout и добавили нашу View в качестве элемента, который находится под RelativeLayout.

Знакомство с элементом RecyclerView

RecyclerView представляет из себя элемент для отображения списка элементов. Как раз он и нужен нам для того, чтобы отобразить список твитов пользователя.

Напомним, что в одном из предыдущих практических занятий мы уже создали с вами tweet_item_view файл. В этом занятии мы просто свяжем его с java кодом, чтобы динамически добавлять в View информацию.

Подробный разбор возможностей RecyclerView уже был переведён в нашем блоге, поэтому рекомендую ознакомиться здесь.

Вначале надо добавить строку implementation 'com.android.support:recyclerview-v7:26.1.0' в наш build.gradle файле, чтобы иметь доступ в коде к RecyclerView.

 

build.gradle(Module:app)

1
2
3
4
dependencies {
    // остальные элементы выше не изменились
    implementation 'com.android.support:recyclerview-v7:26.1.0'
}

 

Далее добавим наш RecyclerView в layout файл. Не будем добавлять никаких зависимостей от соседних элементов, т.к. его родителем является LinearLayout. Просто поместим его после нашей View разделителя. И свяжем его с элементом в java коде.

 

activity_user_info.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<LinearLayout>
    <!-- Остальные элементы сверху не изменились-->    
    <View
        android:id="@+id/delimeter_view"
        android:layout_width="match_parent"
        android:layout_height="6dp"
        android:layout_marginTop="@dimen/text_small_margin"
        android:background="@color/gray_mercury"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/tweets_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

 

UserInfoActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class UserInfoActivity extends AppCompatActivity {
    // остальные поля не изменились
    private RecyclerView tweetsRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // остальной код выше не изменился
        initRecyclerView();

        loadUserInfo();
    }

    private void initRecyclerView() {
        tweetsRecyclerView = findViewById(R.id.tweets_recycler_view);
        tweetsRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}

 

В Activity мы создали отдельный метод initRecyclerView(), который вызываем в методе onCreate()LayoutManager отвечает за форму отображения элементов. В данном случае нам нужен обычный список, поэтому используем LinearLayoutManager(this).

Если вы сейчас запустите приложение, то увидите, что ничего визуально не изменилось. Это потому что список пуст. Чтобы в нём была какая-то информация его надо заполнить элементами. Для этого нам понадобится класс Adapter (переходник) – класс, который отвечает за связь элементов java кода с View-компонентами. Т.е. получая набор javaобъектов, мы должны подать его на вход в адаптер, который преобразует его уже в набор View-компонентов, которые и использует в дальнейшем RecyclerView.

Давайте создадим новый пакет adapter, где и разместим класс TweetAdapter. Вспоминаем, что надо нажать по пакету colibri.dev.com.colibritweet правой кнопкой и выбрать New -> Package. После этого вводим имя adapter.

После этого в этом пакете создаём новый java класс (New -> Java class), который называем TweetAdapter. Выглядеть резульат должен так:

 

TweetAdapter.png

Работа с TweetAdapter

 

TweetAdapter.java

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
package colibri.dev.com.colibritweet.adapter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import colibri.dev.com.colibritweet.R;
import colibri.dev.com.colibritweet.pojo.Tweet;

public class TweetAdapter extends RecyclerView.Adapter<TweetAdapter.TweetViewHolder> {
    private static final String TWITTER_RESPONSE_FORMAT="EEE MMM dd HH:mm:ss ZZZZZ yyyy"; // Thu Oct 26 07:31:08 +0000 2017
    private static final String MONTH_DAY_FORMAT = "MMM d"; // Oct 26

    private List<Tweet> tweetList = new ArrayList<>();

    @Override
    public TweetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.tweet_item_view, parent, false);
        return new TweetViewHolder(view);
    }

    @Override
    public void onBindViewHolder(TweetViewHolder holder, int position) {
        holder.bind(tweetList.get(position));
    }

    @Override
    public int getItemCount() {
        return tweetList.size();
    }

    public void setItems(Collection<Tweet> tweets) {
        tweetList.addAll(tweets);
        notifyDataSetChanged();
    }

    public void clearItems() {
        tweetList.clear();
        notifyDataSetChanged();
    }

    class TweetViewHolder extends RecyclerView.ViewHolder {
        private ImageView mUserImageView;
        private TextView mNameTextView;
        private TextView mNickTextView;
        private TextView mCreationDateTextView;
        private TextView mContentTextView;
        private ImageView mTweetImageView;
        private TextView mRetweetsTextView;
        private TextView mLikesTextView;

        public TweetViewHolder(View itemView) {
            super(itemView);
            mUserImageView = itemView.findViewById(R.id.profile_image_view);
            mNameTextView = itemView.findViewById(R.id.author_name_text_view);
            mNickTextView = itemView.findViewById(R.id.author_nick_text_view);
            mCreationDateTextView = itemView.findViewById(R.id.creation_date_text_view);
            mContentTextView = itemView.findViewById(R.id.tweet_content_text_view);
            mTweetImageView = itemView.findViewById(R.id.tweet_image_view);
            mRetweetsTextView = itemView.findViewById(R.id.retweets_text_view);
            mLikesTextView = itemView.findViewById(R.id.likes_text_view);
        }

        public void bind(Tweet tweet) {
            mNameTextView.setText(tweet.getUser().getName());
            mNickTextView.setText(tweet.getUser().getNick());
            mContentTextView.setText(tweet.getText());
            mRetweetsTextView.setText(String.valueOf(tweet.getRetweetCount()));
            mLikesTextView.setText(String.valueOf(tweet.getFavouriteCount()));

            String creationDateFormatted = getFormattedDate(tweet.getCreationDate());
            mCreationDateTextView.setText(creationDateFormatted);

            Picasso.with(itemView.getContext()).load(tweet.getUser().getImageUrl()).into(mUserImageView);

            String tweetPhotoUrl = tweet.getImageUrl();
            Picasso.with(itemView.getContext()).load(tweetPhotoUrl).into(mTweetImageView);

            mTweetImageView.setVisibility(tweetPhotoUrl != null ? View.VISIBLE : View.GONE);
        }

        private String getFormattedDate(String rawDate) {
            SimpleDateFormat utcFormat = new SimpleDateFormat(TWITTER_RESPONSE_FORMAT, Locale.ROOT);
            SimpleDateFormat displayedFormat = new SimpleDateFormat(MONTH_DAY_FORMAT, Locale.getDefault());
            try {
                Date date = utcFormat.parse(rawDate);
                return displayedFormat.format(date);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 

А теперь подробно рассмотрим, что в этом классе и для чего предназначено.

Класс адаптера содержит поле tweetList – коллекцию java объектов, которые необходимо отобразить в списке. Для управления содержанием данной коллекции служат два метода:

  • setItems(Collection<Tweet> tweets) – для наполения коллекции необходимым содержимым;
  • clearItems() – для очистки коллекции (при необходимости обновить данные на экране).

Оба этих метода сожержат в себе вызов одного и того же метода notifyDataSetChanged(). Он преднозначен для того, чтобы дать адаптеру знать, что список элементов изменился и ему нужно позаботиться о том, чтобы перерисовать элементы на экране.

Главным связующим звеном между java объектами и View вляется внутренний класс TweetViewHolder. Имея доступ к View-компоненту, он принимает на вход java объект Tweet и непосредственно связывает их друг с другом, сопоставляя поля объекта с отображаемыми пользователю полями в методе bind(Tweet tweet).

Главным интерфейсом адаптеров, связываемых с RecyclerView, являюются два метода:

  • onCreateViewHolder(ViewGroup parent, int viewType) – метод вызывается для создания объекта ViewHolder, в конструктор которого необходимо передать View, с которой в дальнейщем будут связываться java объекты. Метод вызывается без нашего личного вмешательства, т.к. RecyclerView в себе инкапсулирует логику переиспользования элементов;
  • onBindViewHolder(TweetViewHolder holder, int position) – этот метод отвечает за связь java объекта и View. Метод также вызывается без нашего участия. Он будет вызываться чаще, чем метод onCreateViewHolder из-за того, что View компоненты будут переиспользоваться и в один и тот же визуальный элемент в процессе жизнедеятельности списка будут устанавливаться разные данные. Именно с этим связана следующая строка кода метода bind нашего TweetViewHolder:

 

TweetAdapter.java

1
mTweetImageView.setVisibility(tweetPhotoUrl != null ? View.VISIBLE : GONE);

 

Если бы переиспользования элементов не было, то достаточно было бы написать:

 

1
2
3
if (tweetPhotoUrl == null) {
    mTweetImageView.setVisibility(GONE);
}

 

Но из-за того, что наши элементы переиспользуются, то один раз скрыв изображение на одном элементе, оно будет скрыто на нём и при повторном использовании. Даже в том случае, если оно должно быть показано. Это нас не устраивает.

Также подробно необходимо остановиться на методе форматирования даты, использующегося при заполнении данными нашего компонента.

 

TweetAdapter.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class TweetAdapter extends RecyclerView.Adapter<TweetAdapter.TweetViewHolder> {
    private static final String TWITTER_RESPONSE_FORMAT="EEE MMM dd HH:mm:ss ZZZZZ yyyy"; // Thu Oct 26 07:31:08 +0000 2017
    private static final String MONTH_DAY_FORMAT = "MMM d"; // Oct 26

        // остальной код выше не изменился

        private String getFormattedDate(String rawDate) {
            SimpleDateFormat utcFormat = new SimpleDateFormat(TWITTER_RESPONSE_FORMAT, Locale.ROOT);
            SimpleDateFormat displayedFormat = new SimpleDateFormat(MONTH_DAY_FORMAT, Locale.getDefault());
            try {
                Date date = utcFormat.parse(rawDate);
                return displayedFormat.format(date);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
}

 

Т.к. различные сервисы предоставляют дату в самых различных форматах, то возникает необходимость создавать механизмы, которые бы преобразовывали дату одного формата в формат необходимый нам. Для этих целей у нас служит класс utils/DateFormatter:

Константа TWITTER_RESPONSE_FORMAT представляет собой формат, в котором мы получим дату от Twitter-сервиса. Такую дату отображать пользователю было бы странно. Нас больше устроил бы более простой вариант MONTH_DAY_FORMAT, когда мы отображаем только месяц и день.

Метод String getFormattedDate(String rawDate) принимает на вход дату в формате, в котором мы получим её от сервиса. На выходе же мы получаем готовую к использованию строку даты.

Для начала нам необходимо из строк шаблонов создать java объекты SimpleDateFormat, при помощи которых мы и будем производить преобразования. Т.к. напрямую строку даты одного формата в строку другого формата преобразовать мы не можем, то нам нужен переходный элемент:

 

TweetAdapter.java

1
Date date = utcFormat.parse(rawDate);

 

Данной операцией мы преобразовали строку, пришедшую нам от сервиса Twitter, в соответствии с шаблоном к обычном java объекту Date, которым теперь можно манипулировать каким угодно образом. Нам остаётся просто отформатировать вновь созданный объект даты в соответствии с необходимым нам шаблоном:

 

TweetAdapter.java

1
return clientFormat.format(date);

Добавление TweetAdapter к списку RecyclerView

Вот и всё, теперь осталось только сказать нашему RecyclerView, что за наполнение элементов в нём отвечает созданный нами адаптер. Достаточно добавить следующий код в UserInfoActivity:

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class UserInfoActivity extends AppCompatActivity {
    // остальной код выше не изменился
    private TweetAdapter tweetAdapter;

    private void initRecyclerView() {
        // остальной код выше не изменился
        tweetAdapter = new TweetAdapter();
        mRecyclerView.setAdapter(tweetAdapter);
    }

    private void displayTweets(Collection<Tweet> tweets) {
        mTweetAdapter.setItems(tweets);
    }
}

 

Теперь давайте убедимся, что наш список действительно работает. Для этого:

  • создадим метод Collection<Tweet> getTweets, который будет возвращать нам коллекцию объектов заглушек.
  • создадим метод loadTweets(), где вызовём метод getTweets() и отобразим результат в экзмпляре TweetAdapter.

 

TweetAdapter

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class UserInfoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // остальной код выше не изменился    
        loadTweets();
    }

    private void loadTweets() {
        Collection<Tweet> tweets = getTweets();
        tweetAdapter.setItems(tweets);
    }

    private Collection<Tweet> getTweets() {
        return Arrays.asList(
                new Tweet(getUser(), 1L, "Thu Dec 13 07:31:08 +0000 2017", "Очень длинное описание твита 1",
                        4L, 4L, "https://www.w3schools.com/w3css/img_fjords.jpg"),

                new Tweet(getUser(), 2L, "Thu Dec 12 07:31:08 +0000 2017", "Очень длинное описание твита 2",
                        5L, 5L, "https://www.w3schools.com/w3images/lights.jpg"),

                new Tweet(getUser(), 3L, "Thu Dec 11 07:31:08 +0000 2017", "Очень длинное описание твита 3",
                        6L, 6L, "https://www.w3schools.com/css/img_mountains.jpg")
        );
    }    
}

 

Теперь давайте запустим наше приложение и посмотрим, что получилось.

 

Result.png

 

Поздравляю! Сегодня мы прошли с вами непростую тему.

По иогу этого урока мы полностью подготовили наш экран списка твитов для их просмотра. Осталось только получить их.

На всякий случай отобразим полный листинг кода UserInfoActivity.

 

UserInfoActivity.java

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
package colibri.dev.com.colibritweet;

import java.util.Arrays;
import java.util.Collection;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import colibri.dev.com.colibritweet.adapter.TweetAdapter;
import colibri.dev.com.colibritweet.pojo.Tweet;
import colibri.dev.com.colibritweet.pojo.User;

public class UserInfoActivity extends AppCompatActivity {
    private ImageView userImageView;
    private TextView nameTextView;
    private TextView nickTextView;
    private TextView descriptionTextView;
    private TextView locationTextView;
    private TextView followingCountTextView;
    private TextView followersCountTextView;

    private RecyclerView tweetsRecyclerView;
    private TweetAdapter tweetAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info);

        userImageView = findViewById(R.id.user_image_view);
        nameTextView = findViewById(R.id.user_name_text_view);
        nickTextView = findViewById(R.id.user_nick_text_view);
        descriptionTextView = findViewById(R.id.user_description_text_view);
        locationTextView = findViewById(R.id.user_location_text_view);
        followingCountTextView = findViewById(R.id.following_count_text_view);
        followersCountTextView = findViewById(R.id.followers_count_text_view);

        initRecyclerView();

        loadUserInfo();
        loadTweets();
    }

    private void loadTweets() {
        Collection<Tweet> tweets = getTweets();
        tweetAdapter.setItems(tweets);
    }

    private Collection<Tweet> getTweets() {
        return Arrays.asList(
                new Tweet(getUser(), 1L, "Thu Dec 13 07:31:08 +0000 2017", "Очень длинное описание твита 1",
                        4L, 4L, "https://www.w3schools.com/w3css/img_fjords.jpg"),

                new Tweet(getUser(), 2L, "Thu Dec 12 07:31:08 +0000 2017", "Очень длинное описание твита 2",
                        5L, 5L, "https://www.w3schools.com/w3images/lights.jpg"),

                new Tweet(getUser(), 3L, "Thu Dec 11 07:31:08 +0000 2017", "Очень длинное описание твита 3",
                        6L, 6L, "https://www.w3schools.com/css/img_mountains.jpg")
        );
    }

    private void initRecyclerView() {
        tweetsRecyclerView = findViewById(R.id.tweets_recycler_view);
        tweetsRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        tweetAdapter = new TweetAdapter();
        tweetsRecyclerView.setAdapter(tweetAdapter);
    }

    private void loadUserInfo() {
        User user = getUser();
        displayUserInfo(user);
    }

    private void displayUserInfo(User user) {
        Picasso.with(this).load(user.getImageUrl()).into(userImageView);
        nameTextView.setText(user.getName());
        nickTextView.setText(user.getNick());
        descriptionTextView.setText(user.getDescription());
        locationTextView.setText(user.getLocation());

        String followingCount = String.valueOf(user.getFollowingCount());
        followingCountTextView.setText(followingCount);

        String followersCount = String.valueOf(user.getFollowersCount());
        followersCountTextView.setText(followersCount);
    }

    private User getUser() {
        return new User(
                1L,
                "http://i.imgur.com/DvpvklR.png",
                "DevColibri",
                "devcolibri",
                "Sample description",
                "USA",
                42,
                42
        );
    }
}
УВИДЕТЬ ВСЕ Добавить заметку
Вы
Добавить ваш комментарий
 

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)