Help us understand the problem. What is going on with this article?

第二回 AndroidでTwitterクライアントの作成(タイムラインの取得)

More than 1 year has passed since last update.

第一回 AndroidでTwitterクライアントの作成(認証まで)

第二回です。

第三回 AndroidでTwitterクライアントの作成(リプライ機能)

Twitter kitを利用してタイムラインの取得と、表示まで行なってみます。

ソースコードです(追記)
https://github.com/fungiy/MyTwitterApp

Activityの作成

新しくActivityを作成します。
Activityの種類は、今回はBasic Activityを選択しました。

TimelineActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class TimelineActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

}
activity_timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.my_twitter_client_app.www.mytwitterapp.TimelineActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_timeline" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

content_timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.my_twitter_client_app.www.mytwitterapp.TimelineActivity"
    tools:showIn="@layout/activity_timeline">

</android.support.constraint.ConstraintLayout>

TimelineActivityを呼ぶ

TimelineActivityを起動します。

Intent intent = new Intent(this, TimelineActivity.class);
startActivity(intent);

前回のMainActivityを編集しました。
ログインに成功していたら、TimelineActivityを起動するようにしています。

MainActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.twitter.sdk.android.core.TwitterCore;

public class MainActivity extends AppCompatActivity {

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

        if (TwitterCore.getInstance().getSessionManager().getActiveSession() == null) {
            Intent intent = new Intent(this, LoginActivity.class);
            startActivity(intent);
        } else {
            Toast toast = Toast.makeText(MainActivity.this, "ログイン中", Toast.LENGTH_LONG);
            toast.show();

            Intent intent = new Intent(MainActivity.this, TimelineActivity.class);
            startActivity(intent);
        }
    }
}

ListViewの追加

続いて、タイムラインを表示するListViewを追加していきます。
参考:https://qiita.com/Tsumugi/items/47f31bb7351979a45653

レイアウトの編集

以下のようにcontent_timeline.xmlを編集します。

content_timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.my_twitter_client_app.www.mytwitterapp.TimelineActivity"
    tools:showIn="@layout/activity_timeline"
    android:orientation="vertical"
    >

    <ListView
        android:id="@+id/my_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

次に、ListViewの表示用のレイアウトを追加していきます。
content_timeline.xmlと同じフォルダに、新しくtweet_row.xmlを作成。

tweetrow.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/screen_name"
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:text="名前"
         />

    <TextView
        android:id="@+id/tweet_text"
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:text="ツイート本文"
         />

</LinearLayout>

tweet_row.xmlにツイートひとつが表示されるイメージ

独自アダプターの作成

TimelineActivityと同じフォルダに、Adapter用のJavaクラスを作成します。
TweetAdapter.javaを作成

TweetAdapter
package com.my_twitter_client_app.www.mytwitterapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.twitter.sdk.android.core.models.Tweet;

import java.util.List;

public class TweetAdapter extends BaseAdapter {

    private Context context;
    private LayoutInflater layoutInflater = null;
    private List<Tweet> tweetList;

    public TweetAdapter(Context context, List<Tweet> tweetList) {
        this.context = context;
        this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.tweetList = tweetList;
    }

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

    @Override
    public Object getItem(int position) {
        return tweetList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return tweetList.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = layoutInflater.inflate(R.layout.tweet_row, parent, false);

        TextView screenNameTextView = (TextView)convertView.findViewById(R.id.screen_name);
        TextView TweetTextTextView = (TextView)convertView.findViewById(R.id.tweet_text);

        screenNameTextView.setText(tweetList.get(position).user.name);
        TweetTextTextView.setText(tweetList.get(position).text);

        return convertView;
    }
}

ViewHolderパターンを使うべきですが、簡単のため割愛

ActivityにListLiewとアダプターを追加

以下のように、ListViewとアダプターをActivityに追加します。
ここまででListViewについては終わりです。

TimelineActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ListView;

import com.twitter.sdk.android.core.models.Tweet;

import java.util.ArrayList;
import java.util.List;

public class TimelineActivity extends AppCompatActivity {

    ListView listView;
    List<Tweet> tweetList = new ArrayList<>();
    TweetAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        listView = (ListView) findViewById(R.id.my_list_view);
        adapter = new TweetAdapter(this, tweetList);

        listView.setAdapter(adapter);
    }
}

Twitter kitを使ってタイムラインを取得

TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();

StatusesService statusesService = twitterApiClient.getStatusesService();

Call<List<Tweet>> call = statusesService.homeTimeline(20, null, null, false, false, false, false);
call.enqueue(new Callback<List<Tweet>>() {
    @Override
    public void success(Result<List<Tweet>> result) {
        // 成功時の処理
    }

    @Override
    public void failure(TwitterException exception) {
        // 失敗時の処理
    }
});

続いて、ListViewに表示するツイートをネットワークから取得する部分を実装します。

TimelineActivity.java
package com.my_twitter_client_app.www.mytwitterapp;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterApiClient;
import com.twitter.sdk.android.core.TwitterCore;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.models.Tweet;
import com.twitter.sdk.android.core.services.StatusesService;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;

public class TimelineActivity extends AppCompatActivity {

    ListView listView;
    TweetAdapter adapter;
    List<Tweet> tweetList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        listView = (ListView) findViewById(R.id.my_list_view);
        adapter = new TweetAdapter(this, tweetList);

        listView.setAdapter(adapter);

        getHomeTimeline();
    }

    private void getHomeTimeline() {
        TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient();

        StatusesService statusesService = twitterApiClient.getStatusesService();

        Call<List<Tweet>> call = statusesService.homeTimeline(20, null, null, false, false, false, false);
        call.enqueue(new Callback<List<Tweet>>() {
            @Override
            public void success(Result<List<Tweet>> result) {
                // ListViewのListに取得したツイートのリストを追加
                tweetList.addAll(result.data);
                // ListViewの表示を更新
                adapter.notifyDataSetChanged();

                Toast toast = Toast.makeText(TimelineActivity.this, "タイムライン取得成功", Toast.LENGTH_LONG);
                toast.show();
            }

            @Override
            public void failure(TwitterException exception) {
                Toast toast = Toast.makeText(TimelineActivity.this, "タイムライン取得エラー", Toast.LENGTH_LONG);
                toast.show();
            }
        });
    }
}

非同期処理でタイムラインのデータを取得し、取得できたらListViewにデータを入れてListViewを更新しています。

ここまででうまくいけばタイムラインが表示されるはずです。

次回はタイムラインの更新について書きたいと思います

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした