2017-02-23 13 views
-1

나는 왜 그럴지 모르는 패스를 피카소의 [.load (url)]에 넣고 싶습니다. 하지만 Textview에서 URL 값을로드 할 수 있습니다. 제발 내가 아주 간단하다는 것을 알도록 도와주세요. 제발 도와주세요 (초보)Picasso Dynamic Image URL 전달 날짜

package com.maasin.map.anew.model; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.text.Html; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.firebase.database.ChildEventListener; 
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 com.google.firebase.storage.FirebaseStorage; 
import com.google.firebase.storage.StorageReference; 
import com.maasin.map.anew.R; 
import com.maasin.map.anew.model.model.Local; 
import com.squareup.picasso.Picasso; 

import java.util.LinkedList; 
import java.util.List; 

import static android.R.attr.defaultValue; 
import static android.R.attr.drawable; 
import static android.R.attr.name; 
import static android.R.attr.value; 
import static android.R.attr.valueFrom; 

/** 
* Created by Carl Christian on 11/02/2017. 
*/ 

public class establishment extends AppCompatActivity implements OnMapReadyCallback { 

    TextView Name; 
    // TextView Name2; 
    TextView add; 
    TextView Categ; 
    TextView oStart; 
    TextView oEnd; 
    Toolbar tool; 
    String s; 
    private FirebaseDatabase database; 

    double latt = 124.838767; 
    double longg = 10.134265; 

    double longitude = 124.831786 ; 
    double latitude = 10.130952; 
    //String url; 
// List<String> urls = new LinkedList<String>(); 


    Context ctx = this; 


    private GoogleMap mMap; 
    private GoogleMap map; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_scrolling); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     database = FirebaseDatabase.getInstance(); 


     final DatabaseReference establishments = database.getReference("establishments"); 


     FirebaseStorage storage = FirebaseStorage.getInstance(); 
     s = getIntent().getStringExtra("PRIMEKEY"); 
     String s2 = getIntent().getStringExtra("PRIMEKEY2"); 
     latitude= getIntent().getDoubleExtra("location", defaultValue); 
     longitude= getIntent().getDoubleExtra("location1", defaultValue); 
    // Toast.makeText(this,Double.toString(l), Toast.LENGTH_SHORT).show(); 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     // Toast.makeText(establishment.this, s2, Toast.LENGTH_SHORT).show(); 

     //SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      //  .findFragmentById(R.id.map); 
     //mamapFragment.getMapAsync(this); 
     //map.addMarker(new MarkerOptions() 
      //  .position(new LatLng(124.838767, 10.134265)) 
      // .title("Hello world")); 

     // StorageReference storageRef = storage.getReferenceFromUrl("gs://newtest-e7dff.appspot.com/"); 

     //StorageReference imagesRef = storageRef.child(s2); 







//from main activity , title action bar 
     Name = (TextView) findViewById(R.id.Name); 
     //Name.setText(s2); 

     // Name2 = (TextView) findViewById(R.id.Name2); 

     add = (TextView) findViewById(R.id.add); 
     // Name2.setText(s2); 
     oStart = (TextView) findViewById(R.id.oStart); 

     oEnd = (TextView) findViewById(R.id.oEnd); 

     Categ = (TextView) findViewById(R.id.Categ); 

     getSupportActionBar().setTitle(s); 





     //FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); 
     // DatabaseReference mref = firebaseDatabase.getReference(); 
     establishments.child(s2).child("Estab_url").addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      // String url = dataSnapshot.child("url").getValue(String.class); 
       // url = dataSnapshot.child("url").getValue(String.class); 
       // Name.setText(Html.fromHtml("&ldquo;" + url + "&rdquo;")); 
       // String gg = (Html.fromHtml("&ldquo;" + url + "&rdquo;")); 
       //urls.add(url); 
      // Name.setText(url); 
       ImageView imageView = (ImageView) findViewById(R.id.imageView); 
       Picasso.with(ctx) 
         .load(dataSnapshot.child("url").getValue(String.class)) 
         .resize(200,100) 
         .into(imageView); 

      } 

      public void onChildChanged(DataSnapshot dataSnapshot, String s) { } 
      public void onChildRemoved(DataSnapshot dataSnapshot) { } 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       throw databaseError.toException(); // don't ignore onCancelled 
      } 
     }); 

     // Name.setText(urls); 



    // ImageView imageView = (ImageView) findViewById(R.id.imageView); 
    // Name.setText(url); 
    // Picasso.with(this) 
     //  .load(url) 
      // .resize(200,100) 
      //  .into(imageView); 







     // String x = establishments.child(s2).child("Estab_name").toString(); 
     // Name2.setText(x); 
     // final DatabaseReference establishments = database.getReference("establishments"); 



     establishments.child(s2).child("Estab_name").addListenerForSingleValueEvent(new ValueEventListener() 
     { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String value = (String) dataSnapshot.getValue(); 
       //Name.setText(value); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 




     // establishments.child(s2).child("latitude").addValueEventListener(new ValueEventListener() { 
     // @Override 
      // public void onDataChange(DataSnapshot dataSnapshot) { 
      // String value = (String) dataSnapshot.getValue(); 
       // double amount = Double.parseDouble(value); 
       //latitude= amount; 
       // Toast.makeText(this,value, Toast.LENGTH_SHORT).show(); 
      // } 

//   @Override 
    //   public void onCancelled(DatabaseError databaseError) { 

    //  } 
     // }); 



//  establishments.child(s2).child("longitude").addValueEventListener(new ValueEventListener() { 
    //   @Override 
    //  public void onDataChange(DataSnapshot dataSnapshot) { 
     //   String value = (String) dataSnapshot.getValue(); 
     //  double amount = Double.parseDouble(value); 
      //  longitude= amount; 

      //} 

//   @Override 
    //   public void onCancelled(DatabaseError databaseError) { 

//   } 
    //  }); 










     establishments.child(s2).child("Estab_add").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String value = (String) dataSnapshot.getValue(); 
       add.setText(value); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 





     establishments.child(s2).child("Estab_category").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String value = (String) dataSnapshot.getValue(); 
       Categ.setText(value); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 


     establishments.child(s2).child("Estab_Officestart").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String value = (String) dataSnapshot.getValue(); 
       oStart.setText(value); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 


     establishments.child(s2).child("Estab_Officeout").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String value = (String) dataSnapshot.getValue(); 
       oEnd.setText(value); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 




     // Add a marker in Sydney and move the camera 
     LatLng sydney = new LatLng(latitude, longitude); 
     float zoomLevel = 16; 
     mMap.addMarker(new MarkerOptions().position(sydney).title(s)); 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, zoomLevel)); 
    } 

} 
+0

매일 질문 ... onChildXXX() 내의 코드가 비동기로 실행됩니다. 즉, 아래 코드는 URL이 있기 전에 실행될 것입니다. –

답변

0

데이터가 Firebase에서 비동기 적으로로드됩니다. 즉, 피카소로 이미지를 설정할 때까지는 url이 아직 설정되지 않았습니다. 이 코드를 실행하면

System.out.println("Before attaching listener"); 
establishments.child(s2).child("Estab_url").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     System.out.println("In onChildAdded"); 
    } 

    public void onChildChanged(DataSnapshot dataSnapshot, String s) { } 
    public void onChildRemoved(DataSnapshot dataSnapshot) { } 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore onCancelled 
    } 
}); 
System.out.println("After attaching listener"); 

, 그것은 인쇄됩니다 :

당신은 가장 쉽게 코드에서 몇 로그 문을 배치하여이 문제를 볼 수 있습니다

청취자

를 장착하기 전에 청취자를 부착 한 후

있음 onChildAdded

아마도 예상 한 순서가 아닙니다. 그러나 코드가 이미지를로드하지 못하는 이유를 완벽하게 설명합니다. URL을 아직 사용할 수 없습니다.

해결책은 문제를 재구성하는 것입니다. "먼저 URL을 읽은 다음 이미지로 설정하겠습니다"라고 생각하는 대신 "URL을 읽을 때 사용하기 시작합니다. 사용 가능한 경우 이미지로 설정하겠습니다"라고 생각하십시오.

후자의 방식은 URL이 필요한 코드를 onChildAdded (이 경우)으로 옮기는 것을 의미합니다. 따라서 다음과 같이 끝납니다 :

ImageView imageView = (ImageView) findViewById(R.id.imageView); 
Context ctx = this; 

establishments.child(s2).child("Estab_url").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     String url = dataSnapshot.child("url").getValue(String.class); 
     Picasso.with(ctx) 
      .load(url) 
      .resize(200,100) 
      .into(imageView); 
    } 

    public void onChildChanged(DataSnapshot dataSnapshot, String s) { } 
    public void onChildRemoved(DataSnapshot dataSnapshot) { } 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore onCancelled 
    } 
}); 
+0

무엇이 잘못되었지만 앱 위의 코드를 시도했을 때 충돌이 발생합니다. 그것을 구축 할 때 오류가 없습니다. URL에 ""를 추가하려면 .load (url) 및 this .load ("“"+ url + "”")로 시도하십시오. –

+0

따옴표를 자식 이름에 포함 할 필요가 없습니다. 그것은 데이터베이스에서 단지'url'입니다. 크래시가 발생하면 데이터 구조를 일반 텍스트, 새 코드, 스택 추적에 포함하고 코드의 어느 줄에서 예외를 throw하는지 질문을 편집해야합니다. –

+0

도움을 주셔서 감사합니다. 프랭크 이제 이미지 하나를 가져올 수 있습니다. 이제 우리의 문제는 여러 이미지를 가져 오는 것입니다. –

0

onChildAdded 콜백에서 Picasa로드를 실행해야합니다. onChildAdded는 비동기식이므로 콜백 후에로드를 수행해야합니다.

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    String url = dataSnapshot.child("url").getValue(String.class); 
    Log.v("Url content", "value:" + url); // Added this log 
    ImageView imageView = (ImageView) findViewById(R.id.imageView); 
    Picasso.with(this) 
      .load(url) 
      .resize(200,100) 
      .into(imageView); 
} 
+0

이제 앱에서 더 이상 크래시가 발생하지 않지만 URL에서 이미지를 표시하지 않습니다. 무엇을 해야할지 잘 모릅니다. –

+0

코드를 저장소 또는 다른 사람과 공유하십시오. –

+0

Nicola, 여기 내 establishment.class가 있습니다. 내 질문 아래. 희망을 가지고 나를 도울 수 있기를 바랍니다. –