Android 如何从非活动的类调用getLoaderManager()?
我有一个带有Listview的片段,里面有一个ImageView和一个Textview。因此,当片段创建时,我调用AsyncTaskLoader来填充它。在onLoadFinished方法中,我为列表设置了适配器。问题是我无法访问getLoadedManager:S 代码如下: 这是第一个任务中的onLoadFinishedMethodAndroid 如何从非活动的类调用getLoaderManager()?,android,asynctaskloader,Android,Asynctaskloader,我有一个带有Listview的片段,里面有一个ImageView和一个Textview。因此,当片段创建时,我调用AsyncTaskLoader来填充它。在onLoadFinished方法中,我为列表设置了适配器。问题是我无法访问getLoadedManager:S 代码如下: 这是第一个任务中的onLoadFinishedMethod public void onLoadFinished(Loader<ArrayList<Entrada>> loader, ArrayL
public void onLoadFinished(Loader<ArrayList<Entrada>> loader, ArrayList<Entrada> entradas) {
//progress.setVisibility(View.GONE);
entradaAdapter adapter = new entradaAdapter(getActivity(), entradas);
ListView entradas_list = (ListView)rootView.findViewById(R.id.entries_list);
entradas_list.setAdapter(adapter);
for (Entrada e : entradas) {
e.loadImagen(adapter);
}
}
public void onLoadFinished(加载程序,ArrayList entradas){
//progress.setVisibility(View.GONE);
entradadapter=新的entradadapter(getActivity(),entradas);
ListView entradas_list=(ListView)rootView.findViewById(R.id.entries_list);
entradas_list.setAdapter(适配器);
对于(Entrada e:entradas){
e、 loadImagen(适配器);
}
}
适配器:
class entradaAdapter extends ArrayAdapter<Entrada> {
private final ArrayList<Entrada> lista;
LayoutInflater inflater;
public entradaAdapter(Context context, ArrayList<Entrada> lista) {
super(context, 0, lista);
this.lista = lista;
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final Entrada e = getItem(position);
if (convertView == null) {
convertView = inflater.inflate(R.layout.entrada, null);
}
holder = new ViewHolder();
holder.nombre = (TextView) convertView.findViewById(R.id.text_entryTitle);
holder.imagen = (ImageView) convertView.findViewById(R.id.imageEntry);
holder.nombre.setText(e.getNombre());
if (e.getImage() != null) {
Drawable d = new BitmapDrawable(getContext().getResources(),e.getImage());
holder.imagen.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.imagen.setImageDrawable(d);
}
return convertView;
}
class ViewHolder {
TextView nombre;
ImageView imagen;
}
public int getCount() {
return lista.size();
}
public Entrada getItem(int arg0) {
return lista.get(arg0);
}
public long getItemId(int position) {
return position;
}
}
class EntradAdapter扩展了ArrayAdapter{
私人最终ArrayList lista;
充气机;
公共数据适配器(上下文,ArrayList lista){
super(context,0,lista);
this.lista=lista;
充气器=充气器。从(上下文);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终持票人;
最终进入e=获取项目(位置);
if(convertView==null){
convertView=充气机充气(R.layout.entrada,空);
}
holder=新的ViewHolder();
holder.nombre=(TextView)convertView.findViewById(R.id.text\u entryTitle);
holder.imagen=(ImageView)convertView.findViewById(R.id.imageEntry);
holder.nombre.setText(e.getNombre());
如果(如getImage()!=null){
Drawable d=新的BitmapDrawable(getContext().getResources(),e.getImage());
holder.imagen.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
图像可设置图像绘制的支架(d);
}
返回视图;
}
类视图持有者{
文本视图名称;
ImageView imagen;
}
public int getCount(){
返回lista.size();
}
公共Entrada getItem(int arg0){
返回lista.get(arg0);
}
公共长getItemId(int位置){
返回位置;
}
}
“Entrada”类
class Entrada implements android.support.v4.app.LoaderManager.LoaderCallbacks<Bitmap> {
private String imgUrl, nombre,categoria;
private Bitmap image;
private entradaAdapter adapter;
Context context;
public Entrada(Context context, String nombre, String categoria, String imgFile) {
this.context = context;
this.nombre = nombre;
this.categoria = categoria;
this.imgUrl = "http://erasmusapp.byethost13.com/images/entries/"+imgFile;
}
@Override
public Loader<Bitmap> onCreateLoader(int id, Bundle args) {
return new ImageLoadTask(context,imgUrl);
}
@Override
public void onLoadFinished(Loader<Bitmap> loader, Bitmap bitmap) {
if (bitmap != null) {
image = bitmap;
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}
@Override
public void onLoaderReset(Loader<Bitmap> loader) {
}
public String getImgUrl() {
return imgUrl;
}
public String getNombre() {
return nombre;
}
public String getCategoria(){return categoria;}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public Bitmap getImage() {
return image;
}
public entradaAdapter getAdapter() {
return adapter;
}
public void setAdapter(entradaAdapter adapter) {
this.adapter = adapter;
}
public void loadImagen(entradaAdapter adapter){
this.adapter = adapter;
if (imgUrl != null && !imgUrl.equals("")) {
getLoaderManager().initLoader(0, null, this);
}
}
}
class Entrada实现了android.support.v4.app.LoaderManager.LoaderCallbacks{
私有字符串imgUrl、nombre、categoria;
私有位图图像;
专用适配器;
语境;
公共Entrada(上下文上下文、字符串名称、字符串分类、字符串imgFile){
this.context=上下文;
this.nombre=nombre;
this.categoria=categoria;
this.imgUrl=”http://erasmusapp.byethost13.com/images/entries/“+imgFile;
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的ImageLoadTask(上下文,imgUrl);
}
@凌驾
public void onLoadFinished(加载程序、位图){
if(位图!=null){
图像=位图;
if(适配器!=null){
adapter.notifyDataSetChanged();
}
}
}
@凌驾
公共void onLoaderReset(加载器){
}
公共字符串getImgUrl(){
返回图像;
}
公共字符串getNombre(){
返回nombre;
}
公共字符串getCategoria(){return categoria;}
公共void setImgUrl(字符串imgUrl){
this.imgUrl=imgUrl;
}
公共位图getImage(){
返回图像;
}
公共适配器getAdapter(){
返回适配器;
}
公共void setAdapter(entradadapter适配器){
this.adapter=适配器;
}
public void loadImagen(entradadapter适配器){
this.adapter=适配器;
if(imgUrl!=null&!imgUrl.equals(“”){
getLoaderManager().initLoader(0,null,this);
}
}
}
第二项任务是:
class ImageLoadTask extends AsyncTaskLoader<Bitmap> {
String imgUrl;
Bitmap mBitmap;
public ImageLoadTask(Context context, String imgUrl){
super(context);
this.imgUrl = imgUrl;
}
@Override
protected void onStartLoading() {
if (mBitmap != null) {
deliverResult(mBitmap);
}else {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
public Bitmap loadInBackground() {
Bitmap b = null;
try {
try {
URL url = new URL(imgUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
b = BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
}
return b;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void deliverResult(Bitmap bitmap) {
mBitmap = bitmap; // Caching
super.deliverResult(mBitmap);
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
mBitmap = null;
}
类ImageLoadTask扩展了AsyncTaskLoader{
字符串imgUrl;
位图mBitmap;
公共ImageLoadTask(上下文,字符串imgUrl){
超级(上下文);
this.imgUrl=imgUrl;
}
@凌驾
开始加载时受保护的void(){
如果(mBitmap!=null){
交付结果(mBitmap);
}否则{
力载荷();
}
}
@凌驾
受保护的无效onStopLoading(){
取消加载();
}
公共位图加载背景(){
位图b=null;
试一试{
试一试{
URL=新URL(imgUrl);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream输入=连接。getInputStream();
b=位图工厂.解码流(输入);
}捕获(IOE异常){
e、 printStackTrace();
}
返回b;
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
@凌驾
公共void deliverResult(位图){
mBitmap=bitmap;//缓存
超级交付结果(mBitmap);
}
@凌驾
受保护的void onReset(){
super.onReset();
onStopLoading();
mBitmap=null;
}
}其中是对
getLoaderManager().initLoader(LOADER_ID,null,callback)的调用代码>?1<代码>新ImageLoadTask(上下文,imgUrl)代码>将不会开始加载。。。2. <代码>异步任务加载器
用于加载器
。。。对于像这样的作业,应使用AsyncTask
。仍然加载所有图像迟早会导致内存溢出。。。请使用一些(已经编写的)图像加载程序…@njzk2查看loadImagen
方法。。。问题是他想用AsyncTaskLoader来完成错误的任务哦,这是一个没有loader的AsyncTask,我忘了更改那一行,对不起。所以我的问题是其他,现在,我会更新后Entrada
应该是一个POJO类。。。你在混合原则。。。如果它是一个简单的数据容器,它不应该负责加载。。。