5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-26

第一回 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を更新しています。

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

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

5
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?