AndroidAnnotations @EBean Class 实例化问题
AndroidAnnotations @EBean Class Instantiation Issue
我正在实现我自己的适配器 class 使用 AA 扩展 BaseAdapter,但我需要构造函数中的多个参数才能正确实例化它。请问有什么办法吗?
@EBean
public class MomentViewAdapter extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected List<FavoriteInfo> mDatas;
protected int mItemLayoutId;
public MomentViewAdapter(Context context) {
this.mContext = context;
// this.mInflater = LayoutInflater.from(mContext);
// this.mDatas = mDatas;
// this.mItemLayoutId = itemLayoutId;
}
public void setUp(List<FavoriteInfo> mDatas, int itemLayoutId) {
this.mInflater = LayoutInflater.from(mContext);
this.mDatas = mDatas;
this.mItemLayoutId = itemLayoutId;
}
@Override
public int getCount()
{
return mDatas.size();
}
@Override
public FavoriteInfo getItem(int position)
{
return mDatas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(mItemLayoutId, parent, false);
}
ImageView img = (ImageView) convertView.findViewById(R.id.detail_moment_camera_picture);
if (mDatas.get(position).isVideoFavorite()) {
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(mDatas.get(position).getVideoURL(), MediaStore.Video.Thumbnails.MINI_KIND);
img.setImageBitmap(bitmap);
} else {
getBitmapFromURL(mDatas.get(position).getImageURL(), img);
// img.setImageBitmap(getBitmapFromURL(mDatas.get(position).getImageURL()));
}
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, GeneratedClassUtils.get(MomentDetailActivity.class));
Bundle mBundle = new Bundle();
mBundle.putSerializable(FavoriteInfo.KEY, mDatas.get(position));
mBundle.putBoolean(CollectionInfo.KEY_WATCH_FLAG, false);
intent.putExtras(mBundle);
mContext.startActivity(intent);
}
});
return convertView;
}
@Background
protected void getBitmapFromURL(String src, ImageView img) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
updateImageView(BitmapFactory.decodeStream(input), img);
return;
} catch (IOException e) {
System.out.println("************** network exception: download image failed");
return;
}
}
@UiThread
protected void updateImageView(Bitmap bitmap, ImageView img) {
img.setImageBitmap(bitmap);
return;
}
}
目前我正在使用 setUp 方法来启动其他参数。但这似乎有问题。我在 activity 中这样使用它:
@EActivity
public class DeviceDetailActivity extends BaseActivity {
@Bean
MomentViewAdapter mGridViewAdapter;
/* some other code like @ViewById */
@Afterviews
public void afterViews(){
init();
}
void init(){
afterInject();
}
@AfterInject // injected beans are only available from here
public void afterInject() {
mGridViewAdapter.setUp(mMomentDatas, R.layout.device_detail_moment_listitem_simple);
mGridView.setAdapter(mGridViewAdapter);
}
}
当我 运行 它在我的 phone 上时,我得到了空指针异常:
unable to start activity ComponentInfo{com.bloomsky.bloomsky/com.bloomsky.android.activities.common.DeviceDetailActivity_}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
它是在调用 setUp() 方法之后出现的,这让我很困惑。所以我想也许对象没有正确实例化。
mGridView
为空,因为 @AfterInject
在 @AfterViews
之前调用。您的视图还不受 Android 注释的约束。因此,请改用 @AfterViews
。
我正在实现我自己的适配器 class 使用 AA 扩展 BaseAdapter,但我需要构造函数中的多个参数才能正确实例化它。请问有什么办法吗?
@EBean
public class MomentViewAdapter extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected List<FavoriteInfo> mDatas;
protected int mItemLayoutId;
public MomentViewAdapter(Context context) {
this.mContext = context;
// this.mInflater = LayoutInflater.from(mContext);
// this.mDatas = mDatas;
// this.mItemLayoutId = itemLayoutId;
}
public void setUp(List<FavoriteInfo> mDatas, int itemLayoutId) {
this.mInflater = LayoutInflater.from(mContext);
this.mDatas = mDatas;
this.mItemLayoutId = itemLayoutId;
}
@Override
public int getCount()
{
return mDatas.size();
}
@Override
public FavoriteInfo getItem(int position)
{
return mDatas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(mItemLayoutId, parent, false);
}
ImageView img = (ImageView) convertView.findViewById(R.id.detail_moment_camera_picture);
if (mDatas.get(position).isVideoFavorite()) {
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(mDatas.get(position).getVideoURL(), MediaStore.Video.Thumbnails.MINI_KIND);
img.setImageBitmap(bitmap);
} else {
getBitmapFromURL(mDatas.get(position).getImageURL(), img);
// img.setImageBitmap(getBitmapFromURL(mDatas.get(position).getImageURL()));
}
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, GeneratedClassUtils.get(MomentDetailActivity.class));
Bundle mBundle = new Bundle();
mBundle.putSerializable(FavoriteInfo.KEY, mDatas.get(position));
mBundle.putBoolean(CollectionInfo.KEY_WATCH_FLAG, false);
intent.putExtras(mBundle);
mContext.startActivity(intent);
}
});
return convertView;
}
@Background
protected void getBitmapFromURL(String src, ImageView img) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
updateImageView(BitmapFactory.decodeStream(input), img);
return;
} catch (IOException e) {
System.out.println("************** network exception: download image failed");
return;
}
}
@UiThread
protected void updateImageView(Bitmap bitmap, ImageView img) {
img.setImageBitmap(bitmap);
return;
}
}
目前我正在使用 setUp 方法来启动其他参数。但这似乎有问题。我在 activity 中这样使用它:
@EActivity
public class DeviceDetailActivity extends BaseActivity {
@Bean
MomentViewAdapter mGridViewAdapter;
/* some other code like @ViewById */
@Afterviews
public void afterViews(){
init();
}
void init(){
afterInject();
}
@AfterInject // injected beans are only available from here
public void afterInject() {
mGridViewAdapter.setUp(mMomentDatas, R.layout.device_detail_moment_listitem_simple);
mGridView.setAdapter(mGridViewAdapter);
}
}
当我 运行 它在我的 phone 上时,我得到了空指针异常:
unable to start activity ComponentInfo{com.bloomsky.bloomsky/com.bloomsky.android.activities.common.DeviceDetailActivity_}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.GridView.setAdapter(android.widget.ListAdapter)' on a null object reference
它是在调用 setUp() 方法之后出现的,这让我很困惑。所以我想也许对象没有正确实例化。
mGridView
为空,因为 @AfterInject
在 @AfterViews
之前调用。您的视图还不受 Android 注释的约束。因此,请改用 @AfterViews
。