Twitter4J 非同期処理は、常に TwitterListener を作成して、AsyncTwitter からの実行を リスナー側で受けるという形になります。( 今回の場合、searched(QueryResult queryResult) で受けて、search(Query query) で呼び出す ) 関連する記事 Android Studio で Twitter4J で画像付きツイート 注意する事1) トークンの保存場所が、app\src\main\resources の twitter4j.properties 2) TwitterListener で受けたところから画面にアクセスするには、UI スレッドに対する考慮が必要 ( runOnUiThread メソッドが簡単 ) 3) ライブラリは twitter4j-core-4.0.4.jar と twitter4j-async-4.0.4.jar をコピーして core のみ Gradle に登録MainActivity
public class MainActivity extends AppCompatActivity { // リストビュー private MyArrayAdapter adapter; private ListView listview; // 日付データ用 private Calendar cal; private SimpleDateFormat sf; // Twitter 用 private TwitterListener listener; private AsyncTwitter asyncTwitter; private ArrayList<TwitterData> twitterData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // アダプタを作成 adapter = new MyArrayAdapter(MainActivity.this,R.layout.list_item); // リストビューの取得 listview = (ListView) MainActivity.this.findViewById(R.id.listView); // リストビューにデータを表示 listview.setAdapter(adapter); Button buttonSearch = (Button) MainActivity.this.findViewById(R.id.buttonSearch); buttonSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.clear(); loadDataList(); } }); cal = Calendar.getInstance(); sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // リスナーを作成する listener = new TwitterAdapter() { @Override public void searched(QueryResult queryResult) { twitterData = new ArrayList<TwitterData>(); List<Status> list = queryResult.getTweets(); Iterator<Status> it = list.iterator(); while( it.hasNext() ) { Status statudData = it.next(); twitterData.add(new TwitterData( // ScreenName と Name String.format("%s : %s", statudData.getUser().getScreenName(), statudData.getUser().getName()), sf.format(statudData.getCreatedAt()), statudData.getText())); } // UI スレッドで アダプタにデータをセット MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { adapter.addAll(twitterData); } }); } @Override public void onException(TwitterException te, TwitterMethod method) { Log.i("lightbox", "onException"); te.printStackTrace(); } }; // リスナーを登録する AsyncTwitterFactory factory = new AsyncTwitterFactory(); asyncTwitter = factory.getInstance(); asyncTwitter.addListener(listener); } // ***************************************** // Twitter から リストビューにデータを表示 // ***************************************** public void loadDataList() { EditText editSearch = (EditText) MainActivity.this.findViewById(R.id.editSearch); String searchString = editSearch.getText().toString(); Query query = new Query(searchString); asyncTwitter.search(query); } }
MyArrayAdapter
public class MyArrayAdapter extends ArrayAdapter<TwitterData> { // コンストラクタで渡された画面の保存 private int mResource; // 画面作成用 LayoutInflater mInflater; public MyArrayAdapter(Context context, int resource) { super(context, resource); // ArrayAdapter でも、このようにして保存して利用してます mResource = resource; mInflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(mResource, parent, false); } // アダプターより行データを取得 TwitterData twitterData = MyArrayAdapter.this.getItem(position); // 画面にデータをセット TextView tv; // キー tv = (TextView) convertView.findViewById(R.id.textKey); tv.setText(twitterData.getScreenName()); tv = (TextView) convertView.findViewById(R.id.textItem1); tv.setText(twitterData.getStringDate()); tv = (TextView) convertView.findViewById(R.id.textItem2); tv.setText(twitterData.getText()); // 行の画面をシステムに返す return convertView; } }
TwitterData
public class TwitterData { private String stringDate; private String screenName; private String text; public TwitterData(String screenName, String stringDate, String text) { this.screenName = screenName; this.stringDate = stringDate; this.text = text; } public String getScreenName() { return screenName; } public void setScreenName(String screenName) { this.screenName = screenName; } public String getStringDate() { return stringDate; } public void setStringDate(String stringDate) { this.stringDate = stringDate; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
|
【2016 Android Studioの最新記事】
- Android Studio で Twitter4J で画像付きツイート
- 内部ストレージを起点とした画像データの処理 / Android
- カメラを起点とした画像データの処理 / Android
- バグ : Android Studio 2.2.2 で、spinnerMode を dialog に設定すると app:spinnerMode となってしまいます
- ListView + カスタム ArrayAdapter + ViewSwitcher + Firebase API + Data Binding : 更新処理 / Android Studio
- Firebase storage に画像をアップロードする。1) ギャラリーから、2) 実行中の画面 / Android
- Android : 画像関連のテスト用カメラアプリ
- Firebase storage の画像を ファイルとしてダウンロードして ギャラリーに保存する( ImageView にも表示する ) / Android
- Firebase storage の画像の URL を取得して、通常と同様に Stream でダウンロードして ImageView に表示する / Android
- Firebase storage の画像をメモリに直接ダウンロードして ImageView に表示する / Android
- Android : Firebase の データを REST API の PUT コマンドで更新する
- Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。(orderByChild 使う場合は、getChildren ..
- Android : Data Binding + Firebase API で ListView にデータを表示する
- Firebase API + Android Studio : Database 処理の基本設定
- Android Studio 2.2 で新規プロジェクトを作成すると『Could not reserve enough space for 1572864KB object heap』というエラーが出..
- Firebase API + Android Studio : Database にデータを保存は単純で、DatabaseReference の setValue メソッドを使用します