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
抜粋
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コールバック時にちゃんと起動するようになった
- リストを選択して表示
- 会話を表示