2017-04-06 57 views
0

请看看,我有一个片段,设置一个适配器,从Firebase数据库中获取字符串url值,但没有图像加载。firebase加载图像在listview中使用picasso

我的片段:

public class PromoFragment extends Fragment { 


private DatabaseReference mDatabase; 

List<Promo> promoList = new ArrayList<>(); 
ListView listViewPromo; 

public PromoFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mDatabase = FirebaseDatabase.getInstance().getReference(); 

} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View view = inflater.inflate(R.layout.fragment_promo, container, false); 
    listViewPromo = (ListView) view.findViewById(R.id.listViewPromo); 
    listenPromo(); //here i load my data, i currently have 3 childs, each child has imageUrl 
    PromoAdapter promoAdapter = new PromoAdapter(getActivity().getApplicationContext(), R.layout.list_promo, promoList); 
    listViewPromo.setAdapter(promoAdapter); 
    return view; 
} 


private void listenPromo() { 

    mDatabase.child("Promo").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Get Post object and use the values to update the UI 
      // MainActivity.currUser = dataSnapshot.getValue(User.class); 

      for (DataSnapshot dsp : dataSnapshot.getChildren()) { 
       promoList.add(dsp.getValue(Promo.class)); //add result into array list 

      } 

      // ... 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Getting User Class data failed... 
      Log.w("Canceled", "loadUserData:onCancelled", databaseError.toException()); 
      // ... 

     } 


    }); 
} 

}

我fragment_promo.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".PromoFragment"> 

    <ListView 
     android:id="@+id/listViewPromo" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent"> 
    </ListView> 

</RelativeLayout> 

list_promo.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/imageViewPromo" /> 

</LinearLayout> 

promo.java类

我有3个变量为每个对象,但我只会使用durl(网址下载)为这种情况。

public class Promo { 
private String durl; 
private Boolean active; 
private String timestamp; 


public Promo() { //default constructor 

} 

public Promo(String durl, Boolean active, String timestamp) { 
    this.durl = durl; 
    this.active = active; 
    this.timestamp = timestamp; 
} 

public String getDurl() { 
    return durl; 
} 

public void setDurl(String durl) { 
    this.durl = durl; 
} 

public Boolean getActive() { 
    return active; 
} 

public void setActive(Boolean active) { 
    this.active = active; 
} 

public String getTimestamp() { 
    return timestamp; 
} 

public void setTimestamp(String timestamp) { 
    this.timestamp = timestamp; 
} 

}

PromoAdapter.java类

public class PromoAdapter extends ArrayAdapter<Promo> { 

Context context; 
List<Promo> myList; 

public PromoAdapter(Context context, int resource, List<Promo> objects) { 
    super(context, resource, objects); 

    this.context = context; 
    this.myList = objects; 
} 


@Override 
public int getCount() { 
    if(myList != null) 
     return myList.size(); 
    return 0; 
} 

@Override 
public Promo getItem(int position) { 
    if(myList != null) 
     return myList.get(position); 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    if(myList != null) 
     return myList.get(position).hashCode(); 
    return 0; 

} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    Holder holder; 


    if (convertView == null){ 

     //we need a new holder to hold the structure of the cell 
     holder = new Holder(); 

     //get the XML inflation service 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = inflater.inflate(R.layout.list_promo, null); 

     holder.imageView = (ImageView)convertView.findViewById(R.id.imageViewPromo); 

     convertView.setTag(holder); 

    }else{ 
     holder = (Holder)convertView.getTag(); 

    }  
    Promo promo = getItem(position); 
    Picasso.with(context) 
      .load(promo.getDurl()) 
      .placeholder(R.drawable.coin25) 
      .error(R.drawable.hnbspic) 
      .into(holder.imageView); 

    return convertView; 
} 


private class Holder{ 

    ImageView imageView; 

} 

我曾尝试:

  1. 检查浏览器中的图像网址有效

  2. 的listenPr大面也让所有与IMAGEURL孩子成功(我测试过它之前使用之前毕加索得到数据库中的数据)

  3. 变化load(promo.getDurl())load(uri.parse(promo.getDurl()))

  4. 添加占位符和错误的形象,也没有图像出现。我的片段是空白的。

请帮忙..如果代码工作,那么它应该显示3张图片。

感谢您的任何关注。

+0

问题是刷新适配器,它先设置适配器,然后得到图像url.just通知适配器后,在onDataChange – 9spl

+0

得到sussess响应imageurl应该在数组之前,我将它设置为适配器。 –

+0

addValueEventListener在后台工作,因此代码将其设置在背景中并首先移动到setAdapter。你可以显示完整的代码,你用Piccaso设置图像。 – 9spl

回答

0

添加promoAdapter.notifyDataSetChanged();在onDataChange中,它会为你工作。

mDatabase.child("Promo").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     // Get Post object and use the values to update the UI 
     // MainActivity.currUser = dataSnapshot.getValue(User.class); 

     for (DataSnapshot dsp : dataSnapshot.getChildren()) { 
      promoList.add(dsp.getValue(Promo.class)); //add result into array list 

     } 
     promoAdapter.notifyDataSetChanged(); 

     // ... 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     // Getting User Class data failed... 
     Log.w("Canceled", "loadUserData:onCancelled", databaseError.toException()); 
     // ... 

    } 




}); 

addValueEventListener在backgound工作,因此将setAdater第一,然后你会得到你的response.so只是通知适配器会为你工作。

+1

对不起,它不是listviewPromo.notifyDataSetChanged(),而是promoAdapter.notifyDataSetChanged(); , 谢谢 –

0

请使用此代码:

Transformation blurTransformation = new Transformation() { 
      @Override 
      public Bitmap transform(Bitmap source) { 
       Bitmap blurred = Blur.fastblur(context, source, 15); 
       source.recycle(); 
       return blurred; 
      } 

      @Override 
      public String key() { 
       return "blur()"; 
      } 
     }; 

    Picasso.with(context) 

        .load(R.drawable.coin25) 
        // thumbnail url goes here 
        .placeholder(R.drawable.coin25) 
        .transform(blurTransformation) 
        .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) 
        .into(holder.imageView, new Callback() { 
         @Override 
         public void onSuccess() { 
          Picasso.with(context) 
            .load(promo.getDurl()) // image url goes here 
            .fit() 
            .centerCrop() 

            .error(R.drawable.hnbspic) 
            .placeholder(holder.imageView.getDrawable()) 
            .fit() 
            .into(holder.imageView); 

         } 

         @Override 
         public void onError() { 
         } 
        }); 

尝试用这个。如果这对you.then不工作,请让我知道

0

根据您的代码,适配器不一定会传递列表项。我强烈建议您将适配器全局声明为并添加adapter.notifyDataSetChanged()当在onDataChange上检测到任何更改时。

相关问题