ListViewの動的更新(再描画)について

1,899 views
Skip to first unread message

Bulltas

unread,
Nov 11, 2013, 12:57:34 PM11/11/13
to twitt...@googlegroups.com
Twitter4JのUserstreamAPIなどを使ったTwitterアプリケーションを作成しようと思っています。


上記などを参考に、UserstreamAdapterからonStatus()を通じてmAdapter(ListActivity)にデータを渡すことが出来ました。

ですが、端末にタッチ、スワイプをしないとListViewが更新が反映されず、せっかくのUserstreamも全く意味を成していません。

class MyStreamAdapter extends UserStreamAdapter
    {
    @Override
        public void onStatus(Status status) {
        mAdapter.insert(status,0);
          mAdapter.notifyDataSetChanged();
        }

このようにAdapterにStatusをinsertして、常に上部へ来るように指定し、notifyDataSetChanged()で更新をさせているはずなのですが、放っておいても全く反映されません。
内部的には反映されていることは確かなのですが…。
Twitter4Jとは直接関係の無い問題かもしれませんが、どなたか優しく教えて頂けると幸いです。

以下、関係のありそうなソースコードを貼り付けておきます。

    private TweetAdapter mAdapter;
    private Twitter mTwitter;
    private class TweetAdapter extends ArrayAdapter<Status> {

        private LayoutInflater mInflater;

        public TweetAdapter(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) {
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item_tweet, null);
            }
            Status item = getItem(position);
            TextView name = (TextView) convertView.findViewById(R.id.name);
            name.setText(item.getUser().getName());
            TextView screenName = (TextView) convertView.findViewById(R.id.screen_name);
            screenName.setText("@" + item.getUser().getScreenName());
            TextView text = (TextView) convertView.findViewById(R.id.text);
            text.setText(item.getText());
            SmartImageView icon = (SmartImageView) convertView.findViewById(R.id.icon);
            icon.setImageUrl(item.getUser().getProfileImageURL());
            return convertView;
        }
    }

宜しくお願い致します。

Hiroaki TAKEUCHI

unread,
Nov 11, 2013, 9:34:19 PM11/11/13
to twitt...@googlegroups.com
TwitPane作者の竹内です。

> このようにAdapterにStatusをinsertして、常に上部へ来るように指定し、notifyDataSetChanged()で更新をさせているはずなのですが、放っておいても全く反映されません。
> 内部的には反映されていることは確かなのですが…。
> Twitter4Jとは直接関係の無い問題かもしれませんが、どなたか優しく教えて頂けると幸いです。

UserStreamAdapter#onStatus はUIスレッドではないので Adapter への insert や
notifyDataSetChanged() を行うことはできません(端末によっては謎の挙動を起こしてしまい実はけっこう危険です・・・)。

Handler や Activity#runOnUiThread 経由で実行すると反映されると思いますよ。

以上です。

----------------------------------------------------------------------
たっけ / 竹内裕昭 / tak...@gmail.com
http://www.takke.jp/
Twitter: @takke
Facebook: http://www.facebook.com/takke30
----------------------------------------------------------------------


2013年11月12日 2:57 Bulltas <mobura.at...@gmail.com>:
> --
> Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
> 現在のバージョン - 安定: 3.0.3, 開発中: 3.0.4-SNAPSHOT
> http://jira.twitter4j.org/issues/?filter=10030
> バグトラッキング: http://twitter4j.org/jira/browse/TFJ
>
> このメールは次の Google グループの参加者に送られています: Twitter4J J
> このグループにメールで投稿: twitt...@googlegroups.com
> このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja
> ---
> このメールは Google グループのグループ「Twitter4J J」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、twitter4j-j...@googlegroups.com
> にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

Bulltas

unread,
Nov 12, 2013, 4:29:07 AM11/12/13
to twitt...@googlegroups.com
返信ありがとうございます。
Adapterに直接のInsertは危険なのですね、把握致しました。
HandlerでonStatusからStatusを受取り、それをinsertしようと思ったのですが、OnCreate内で同じようなコードを書くとstatus cannot be resolved or is not a fieldとなっていまいます…。原因はなんとなくはわかっているのですが、どうやったらUIスレッドに対してHandlerやrunOnUiThreadを通してinsertのような事ができるのか、そこから先に進みません…。
初歩的な質問で本当に申し訳ないです、ここまでヒントを出してもらってるのに…。

2013年11月12日火曜日 11時34分19秒 UTC+9 Hiroaki TAKEUCHI:
> このグループから退会し、メールの受信を停止するには、twitter4j-j+unsubscribe@googlegroups.com

Hiroaki TAKEUCHI

unread,
Nov 12, 2013, 5:07:51 AM11/12/13
to twitt...@googlegroups.com
竹内です。

> Adapterに直接のInsertは危険なのですね、把握致しました。

うーん、正確には「非UIスレッドからUIを触ると危険」なので、
AndroidのUIスレッドについて参考書などで学んでみるといいかと思います。

> ... どうやったらUIスレッドに対してHandlerやrunOnUiThreadを通して
> insertのような事ができるのか、そこから先に進みません…。

既に先ほど Twitter でやり取りしたとおりですが、下記を参考にしてください。

https://gist.github.com/takke/c050c93e57e976385d8b

ツイートを受け取るたびに new Runnable してたり若干ツッコミどころがありますので
色々工夫してみてください。

以上です。

----------------------------------------------------------------------
たっけ / 竹内裕昭 / tak...@gmail.com
http://www.takke.jp/
Twitter: @takke
Facebook: http://www.facebook.com/takke30
----------------------------------------------------------------------


2013年11月12日 18:29 Bulltas <mobura.at...@gmail.com>:
>> > このグループから退会し、メールの受信を停止するには、twitter4j-j...@googlegroups.com
>> > にメールを送信します。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
> --
> Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
> 現在のバージョン - 安定: 3.0.3, 開発中: 3.0.4-SNAPSHOT
> http://jira.twitter4j.org/issues/?filter=10030
> バグトラッキング: http://twitter4j.org/jira/browse/TFJ
>
> このメールは次の Google グループの参加者に送られています: Twitter4J J
> このグループにメールで投稿: twitt...@googlegroups.com
> このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja
> ---
> このメールは Google グループのグループ「Twitter4J J」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、twitter4j-j...@googlegroups.com

Bulltas

unread,
Nov 12, 2013, 5:43:11 AM11/12/13
to twitt...@googlegroups.com
先ほどのTwitterのやりとりのおかげもありまして、無事動きました。ありがとうございました。
私も似たようなコードを書いていたみたいなのですが、Status statusにfinalをつけていないことが問題だったようでした。現在は上手く動いています。

先ほど非UIスレッドからUIスレッドを触ってみましたが、しっかりエラー吐いて落ちました。
危険、という意味が分かった気がします。new Runnableに関してはパフォーマンスに関しても問題無さそうなのでこのまま様子見で行こうかと思います…笑。
上手く動いたので、次はリプライ機能の実装に取り掛かりたいと思います。
本当にありがとうございました。

2013年11月12日火曜日 19時07分51秒 UTC+9 Hiroaki TAKEUCHI:
>> > このグループから退会し、メールの受信を停止するには、twitter4j-j+unsubscribe@googlegroups.com
>> > にメールを送信します。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
> --
> Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
> 現在のバージョン - 安定: 3.0.3, 開発中: 3.0.4-SNAPSHOT
> http://jira.twitter4j.org/issues/?filter=10030
> バグトラッキング: http://twitter4j.org/jira/browse/TFJ
>
> このメールは次の Google グループの参加者に送られています: Twitter4J J
> このグループにメールで投稿: twitt...@googlegroups.com
> このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja
> ---
> このメールは Google グループのグループ「Twitter4J J」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、twitter4j-j+unsubscribe@googlegroups.com
Reply all
Reply to author
Forward
Message has been deleted
0 new messages