0

listView を含むフラグメントがあります。フラグメントは roboFragment を拡張します。listView には、getView メソッドでさまざまな UI 要素を設定するカスタム アダプターがあります。@InjectView を使用して ui 要素を取得したいと考えています。これを行うには、new オペレーターではなく、guice を使用してアダプターも作成する必要があることを理解しています。だから、これは私のフラグメントが行うことです:

@Inject
TweetsActivityAdapter tweetsAdapter;

アダプタは次のようになります。

public class TweetsActivityAdapter extends ArrayAdapter<ITweet> {

    @InjectView(R.id.ivProfilePic)
    ImageView ivProfilePic;

    @InjectView(R.id.tvUserName)
    TextView tvUserName;

    @InjectView(R.id.tvTweet)
    TextView tvTweet;

    private final static String tag = 
        "Debug - com.codepath.upkar.twitterapp.TweetsActivityAdapter";

    @Inject
    public TweetsActivityAdapter(Context context, List<ITweet> tweets) {
        super(context, 0, tweets);
    }

Guice を構成して、ITweet の入手先を指定する必要があることを読みました。ITweet は、Tweet モデル クラスの単なるインターフェイスです。

public interface ITweet {

    public User getUser();

    public void setUser(User user);

    public String getBody();

    public long getId();

    public long getStrId();

    public boolean isFavorited();

    public boolean isRetweeted();
}

リストのバインディングを作成するにはどうすればよいですか? 現在、エラーが発生しています:

FATAL EXCEPTION: main
E/AndroidRuntime(18753): java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.bindaas.twitterapp/com.bindaas.twitterapp.activities
  .TwitterAppActivity}: com.google.inject.ConfigurationException: 
Guice configuration errors:
E/AndroidRuntime(18753): 1) No implementation for 
   java.util.List<com.bindaas.twitterapp.models.ITweet> was bound.

私のモジュールは次のとおりです。 public class MyCustomModule implements Module {

    @Override
    public void configure(Binder binder) {
        binder.bind(ITweet.class).to(Tweet.class);
    }
}
4

1 に答える 1

1

コード サンプルには 2 つの主な問題があります。

ITweet1)ではなく、インスタンスの作成方法をインジェクターに伝えましたList<ITweet>
また、RoboGuice はどのツイートをそのリストに入れたいかをどのように知ることができると思いますか?

そのようなことをするために a を実装することもできますがProvider、それはちょっと多すぎるように思えます。より簡単な方法は、セッターをアダプターに追加し、RoboGuice によってインスタンス化された後にアダプターにデータを設定することです。


@InjectView2) で使用する ことはできませんArrayAdapter

のコードを見ると、ハンドラーに次のコードが表示されRoboActivityます。onContentChanged()

@Override
public void onContentChanged() {
    super.onContentChanged();
    RoboGuice.getInjector(this).injectViewMembers(this);
    eventManager.fire(new OnContentChangedEvent());
}

メソッドは、injectViewMembers()背後で魔法を行うもの@InjectViewです。
残念ながら、このメソッドはActivityまたはのみを受け入れFragmentます。

ビュー インジェクションに関しては、RoboGuice よりも無駄のないButterknife (Jake Wharton 著)を見たことがあるかもしれません。

于 2013-10-14T22:41:46.617 に答える