我有一个包含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();
}
如何为List创建绑定?我目前收到错误:
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.
我的模块如下: 公共类MyCustomModule实现了模块{
@Override
public void configure(Binder binder) {
binder.bind(ITweet.class).to(Tweet.class);
}
}
答案 0 :(得分:1)
您的代码示例存在两个主要问题:
1)您告诉注射器如何创建ITweet
实例,而不是List<ITweet>
。
另外,您如何期望RoboGuice知道您希望在该列表中发送哪些推文?
你可以实现一个Provider
来做类似的事情,但这似乎有点过于IMO。一种更简单的方法是在适配器中添加一个setter,并在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更适合注视视图。