0

我有一个包含 listView 的片段。该片段扩展了 roboFragment。listView 有一个自定义适配器,可以在 getView 方法中设置不同的 UI 元素。我想使用 @InjectView 来获取 ui 元素。我知道为了做到这一点,我还需要使用 guice 而不是 new 运算符创建适配器。所以这就是我的片段所做的:

@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

您的代码示例有两个主要问题:

1)你告诉注入器如何创建一个ITweet实例,而不是一个List<ITweet>.
此外,您如何期望 RoboGuice 知道您想要在该列表中包含哪些推文?

您可以实现 aProvider来做类似的事情,但这似乎有点太多了 IMO。一种更简单的方法是向您的适配器添加一个设置器,并在 RoboGuice 实例化数据后将数据设置到您的适配器。


2) 你不能@InjectView在一个ArrayAdapter

如果您查看 的代码RoboActivity,您将在onContentChanged()处理程序中看到以下代码:

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

方法是在injectViewMembers()背后施展魔法@InjectView
可悲的是,这种方法只接受一个Activity或一个Fragment

你可以看看Butterknife(Jake Wharton 写的),它比 RoboGuice 更适合视图注入。

于 2013-10-14T22:41:46.617 回答