Twitterクライアント製作記その3

ふぁぼった時に星を付けれるようになった.

どうやら,公式RTされてきたものに対してのtwitter4j.Status#isFavorited()はなんかちょっと特殊だった.

Twitter#createFavorite(long id)で指定されたIDのツイートをふぁぼるんだけど,いくらふぁぼっても公式RTの場合は

getHomeTimeline()でそのツイートを取得しなおしても,status,retweetedStatusどちらもisFavorited()でfalseが返ってくるので,どうやって公式RTをふぁぼったときに星を付けられるのかわからなかったけど解決できたのでメモ.

Twitter#createFavorite(long id)は戻り値としてtwitter4j.Statusが返ってくるので,返ってきたstatusを使って処理すれば良い.

ふぁぼに成功した場合,返ってきたstatusと,retweetedStatusはisFavorited()でどちらもtrueを返す.

ArrayAdapterの中にある元のツイートの場所を,mAdapter.position(oldStatus);でもして引っ張ってきて,remove(oldStatus)して,insert(position,newStatus);とすればよい.

星をつける部分は,ArrayAdapter的な自前クラスの部分で,isFavorited()がtrueを返すときに星のvisibilityをView.VISIBLEに,falseのときはView.GONEにすればおk

抜粋

twitter4j.Status oldStatus, newStatus;
twitter4j.Twitter mTwitter;

//oldStatusはなんとかして持ってくる
//mTwitterはなんとかしてfactoryからインスタンスを作る

try {
	newStatus = mTwitter.createFavorite(status.getId());
} catch (TwitterException e) {
	e.printStackTrace();
}
if (newStatus != null) {
	int pos = mAdapter.getPosition(oldStatus);//元のツイートの位置を得る
	mAdapter.remove(oldStatus);//消す
	mAdapter.insert(newStatus, pos);//挿入する
	mAdapter.notifyDatasetChanged();//ListViewに通知してViewの更新
}

カスタムArrayAdapter(抜粋)

public class TweetStatusAdapter extends ArrayAdapter<twitter4j.Status> {
	private static LayoutInflater mInflater;

	public TweetStatusAdapter(Context context) {
		super(context, android.R.layout.simple_list_item_1);
		mInflater = (LayoutInflater) context
				.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Status item = getItem(position);

		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.list_item_tweet, null);
		}

		//他にも色々やるけどね.

		ImageView favIcon = (ImageView)convertView.findViewById(R.id.fav_icon);

		if (item.isFavorited()){
			favicon.setVisibility(View.VISIBLE);
		} else {
			favicon.setVisibility(View.GONE);
		}

		return convertView;
	}
}

 

それにしても,公式RTをふぁぼってもgetHomeTimeline()やgetMentionsTimeline()で得られるstatusがisFavorited()でfalse返すってTwitterさんなんでなのよ…

今日できたこと

  • リストの情報(id, name)を保存して,毎回起動時にリスト情報を取得するために通信しないようにした.
  • 通信する必要が有るときは出来る限りAsyncTaskを使用するようにした(Android3.0以上だと,メインスレッドから通信するとNetworkOnMainThreadExceptionという例外を投げる)
  • Android4.2でもOAuthコールバック時にちゃんと起動するようになった
すぐ出来そうなこと
  • リストを選択して表示
早く実装したいこと
  • 会話を表示
出来れば実装したいこと
  • ユーザー詳細画面
    • フォロー,フォロー解除,R4Sとか
    • ツイート,フォロー/フォロワー表示とか
  • 複数アカウント対応
    • 切り替えはシームレスに行いたい.
    • 別アカウントのリストがずらっと並んだら面白いかなって.
    • ツイート時にアカウントを選択,リプライ時は自動で,みたいな.
    • 複数アカウントのタイムラインを混ぜて表示できたら面白いかも
  • カラーテーマ
    • 最低限白いのと黒いのは用意したいよね