0

我試圖在Android studio中的回收站視圖中顯示Firebase數據庫中的圖像,但圖像未顯示。我不確定我出錯的地方或問題所在。使用Picasso圖像未在Recycler視圖中顯示

主要Activity.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     tools:context="com.test.test.AddBrandPage" 
     android:weightSum="1"> 


    <TextView 
     android:id="@+id/editText" 
     android:layout_width="383dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="17dp" 
     android:ems="10" 
     android:inputType="textPersonName" 
     android:text="Select your favourite stores..." 
     android:textAlignment="center" 
     android:textSize="22sp" /> 

    <LinearLayout 
     android:id="@+id/alphaindex" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:orientation="horizontal"></LinearLayout> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recylView" 
     android:layout_width="337dp" 
     android:layout_height="370dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/editText2" 
     android:layout_marginLeft="14dp" 
     android:layout_marginRight="14dp" 
     android:layout_marginStart="14dp" 
     android:layout_marginTop="24dp" 
     android:layout_weight="0.23" 
     android:scrollbars="vertical">    
     </android.support.v7.widget.RecyclerView> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.11" 
     android:layout_marginTop="20dp" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/btn_skip" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="25dp" 
      android:layout_marginTop="15dp" 
      android:layout_marginRight="15dp" 
      android:background="@color/colorPrimary" 
      android:text="Skip" 
      android:textAllCaps="true" 
      android:textColor="@android:color/background_light" 
      android:textSize="20sp" 
      android:textStyle="normal|bold" /> 

     <Button 
      android:id="@+id/btn_submit" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="15dp" 
      android:layout_marginTop="15dp" 
      android:layout_marginRight="20dp" 
      android:background="@color/colorPrimary" 
      android:text="Submit" 
      android:textAllCaps="true" 
      android:textColor="@android:color/background_light" 
      android:textSize="20sp" 
      android:textStyle="normal|bold" /> 

     </LinearLayout> 

    </LinearLayout> 

Logo_items.xml

 <?xml version="1.0" encoding="utf-8"?> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:cardView="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/logo_container" 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:background="@android:color/darker_gray" 
      android:gravity="center_vertical|center_horizontal" 
      android:orientation="vertical" 
      android:paddingBottom="10dp" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:paddingTop="10dp" 
      android:visibility="visible" 
      cardView:layout_collapseParallaxMultiplier="1.0"> 

    <android.support.v7.widget.CardView 
     android:layout_width="155dp" 
     android:layout_height="100dp" 
     android:layout_marginBottom="5dp" 
     android:layout_marginTop="5dp" 
     cardView:cardBackgroundColor="@android:color/white"> 


     <GridLayout 
      android:id="@+id/cardView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center_horizontal|center_vertical" 
      android:orientation="vertical"> 


      <ImageView 
       android:id="@+id/img_logo" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_column="1" 
       android:layout_gravity="center_horizontal|center_vertical" 
       android:layout_row="0" 
       android:paddingBottom="5dp" 
       android:paddingLeft="2.5dp" 
       android:paddingRight="2.5dp" 
       android:paddingTop="5dp"> 

      </ImageView> 

     </GridLayout> 

     <CheckBox 
      android:id="@+id/checkbox" 
      android:layout_width="30dp" 
      android:layout_height="30dp" 
      android:layout_marginLeft="130dp" 
      android:layout_marginTop="66dp" 
      /> 

    </android.support.v7.widget.CardView> 

    </LinearLayout> 

LogoItems.java

public class LogoItems { 

     //declare variables(the items displayed in the layout) 
     private String logo;//, name; 

     public String getLogo() { 
      return logo; 
     } 

     public void setLogo(String logo) { 
      this.logo = logo; 
     } 

    } 

主要Activity.java

package com.test.test; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.GridLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

public class AddBrandPage extends AppCompatActivity implements OnClickListener { 

    //declare variables 
    private RecyclerView recyclerView; 
    private RecyclerView.LayoutManager layoutManager; 
    private RecyclerView.Adapter adapter; 
    private DatabaseReference myRef; 
    private Button btn_skip; 
    private Button btn_submit; 
    //private String name; 
    //private String url; 

    List<LogoItems> brandLogo = new ArrayList<>(); 
    //HashMap<String, String> dataSet = new HashMap<>(); 



    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_brand_page); 

     //initialize variables 
     btn_skip = (Button) findViewById(R.id.btn_skip); 
     btn_submit = (Button) findViewById(R.id.btn_submit); 
     myRef = FirebaseDatabase.getInstance().getReference().child("/brands"); 

     // set the main recyclerview view in the layout 
     recyclerView = (RecyclerView) findViewById(R.id.recylView); 
     recyclerView.setHasFixedSize(true); 

     // set the main layoutManager of the recyclerview 
     layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 


     loadLogoImgData(); 


     // set the recycler view adapter 
     adapter = new LogoAdapter(brandLogo, getBaseContext()); 
     recyclerView.setAdapter(adapter); 

     //set the listener for the buttons click event 
     btn_skip.setOnClickListener(this); 
     btn_submit.setOnClickListener(this); 


    } 

    @Override 
    public void onClick(View view) { 

     if (view == btn_skip) { 
      //if skip button clicked close current window and go to user main page 
      finish(); 
      startActivity(new Intent(getApplicationContext(), UserMainPage.class)); 

     } 

    } 



    public void loadLogoImgData(){ 

     brandLogo.clear(); 
     myRef.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for (DataSnapshot brandSnapshot : dataSnapshot.getChildren()){ 
        LogoItems value = brandSnapshot.getValue(LogoItems.class); 
        LogoItems brandDetails = new LogoItems(); 
        // String name = value.getName(); 
        String logos = value.getLogo(); 
        //brandDetails.setName(name); 
        brandDetails.setLogo(logos); 
        brandLogo.add(brandDetails); 

      } 
     } 


      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     } 
    } 

LogoItemsAdapter.java

package com.test.test; 
import android.content.Context; 
import android.net.Uri; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 
import java.util.List; 


public class LogoAdapter extends RecyclerView.Adapter<LogoAdapter.LogoViewHolder> { 

    List<LogoItems> brandLogo = new ArrayList<>(); 
    // private AddBrandPage addBrandPage; 
    private Context context; 

    public LogoAdapter(List <LogoItems> brandLogo, Context context){ 
     this.brandLogo = brandLogo; 
     this.context = context; 
     //addBrandPage = (AddBrandPage)context; 
    } 


    @Override 
    public LogoAdapter.LogoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.logo_items,parent,false); 
     LogoViewHolder logoViewHolder = new LogoViewHolder(view); 
     return logoViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(LogoAdapter.LogoViewHolder holder, int position) { 

     //holder.logo.setImageURI(Uri.parse(brandLogo.get(position).getLogo())); 
     Picasso.with(context).load(brandLogo.get(position).getLogo()).into(holder.logo); 

    } 

    @Override 
    public int getItemCount() { 

     return brandLogo.size(); 
    } 



    public static class LogoViewHolder extends RecyclerView.ViewHolder{ 

     //declare variables 
     public ImageView logo; 
     CheckBox checkbox; 
     //private View itemView; 


     public LogoViewHolder(View itemView){ 
      super(itemView); 

      //initialize variables inside the constructor 
      logo = (ImageView)itemView.findViewById(R.id.img_logo); 
      checkbox = (CheckBox)itemView.findViewById(R.id.checkbox); 
      // this.itemView = itemView; 

     } 


    } 


} 

回答

0

你的代碼似乎有點含糊喜歡這裏:

myRef.addValueEventListener(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
for (DataSnapshot brandSnapshot : dataSnapshot.getChildren()){  
LogoItems value =     
brandSnapshot.getValue(LogoItems.class); 
LogoItems brandDetails = 
new LogoItems(); 
// String name = value.getName(); 
String logos = value.getLogo(); 
    //brandDetails.setName(name); 
    brandDetails.setLogo(logos); 
    brandLogo.add(brandDetails); } } 

更改此代碼:

myRef.addValueEventListener(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
for (DataSnapshot brandSnapshot : dataSnapshot.getChildren()){  
LogoItems value =     
brandSnapshot.getValue(LogoItems.class); 
brandLogo.add(value); } 

    startRecyclerView(); 

    } 

火力地堡方法是異步的,你現在的代碼的膨脹recylcerview同步,這意味着它在數據被設置和接收之前被加載。

更改後的代碼在數據從數據庫加載後,異步啓動recyclerview。您可以添加進度欄來了解狀態。您可以設置它像這樣(此方法之前初始化它,它會默認可見):

mProgressBar.setVisibility(View.INVISIBLE); 
    startRecyclerView(); 

這樣的代碼看起來有條理。

+0

謝謝費薩爾。這解決了這個問題。我提出了建議的改變,並且工作完美。 –

相關問題