2016-04-01 15 views
0

Bir URL var ve üzerinde çok fazla resim var (En az 3000 veya daha fazla) . Tüm görüntüler href gibidir. Bir resmin başlığını tıklarsam açılır. İstediğim şey bu görüntüleri projemde kullanmak. Bu şey için bir web servisim olması koşuluyla Picasso RecyclerView ve Async sınıfını kullanarak bunu kolayca yapabilirim.Birden çok görüntü alma (eğer mümkünse döngüler kullanarak) sadece url'yi biliyor ve android web servisiyle ilgili herhangi bir bilgimiz yoksa

Şimdilik sadece sahip olduğum URL ile, resim elde etme ve bir sonraki görüntüyü toplamak için bir döngü veya başka bir şey yapma hakkında hiçbir fikrim yok. Ben href üzerine tıklayarak ve string.xml veya bazı dizilerde kopyalayarak tüm URL'leri bir dizide yapıştırmak kopyalayabilirsiniz ama istemiyorum çünkü 100'lerin görüntüleri vardır ve bu şekilde yapmaya değmez.

JSON veya xml'miz yoksa, bazı bedenler URL'den resim alabilmem için bana bir başlangıç ​​verebilir.

Bu benim zaman uyumsuz sınıf

Context context; 
private IAsyncTaskListener listener; 
ProgressBar progressBar; 

public ArrayList<String> linkArray = new ArrayList<>(); 
public HTMLAsync(Context context, IAsyncTaskListener listener, ProgressBar progressBar) { 
    this.context = context; 
    this.listener = listener; 
    // dataArray.clear(); 
    this.progressBar = progressBar; 
} 

@Override 
protected void onPreExecute(){ 
    progressBar.setVisibility(View.VISIBLE); 
} 
@Override 
protected Boolean doInBackground(String... params) { 

    File input = new File("/tmp/input.html"); 
    Document doc = null; 
    try { 
     doc = Jsoup.parse(input, "UTF-8", "http://mobileswall.com/wp-content/uploads/2013/09/"); 

    Element content = doc.getElementById("content"); 
    Elements links = content.getElementsByTag("a"); 
    for (Element link : links) { 
     String linkHref = link.attr("href"); 
     linkArray.add(linkHref); 
     String linkText = link.text(); 
    }} catch (IOException e) { 
     e.printStackTrace(); 
     return false; 

    } 
    return true; 
} 



@Override 
protected void onPostExecute(Boolean result) { 
    if (result==true) { 
     progressBar.setVisibility(View.VISIBLE); 
     this.listener.onCompleted(linkArray); 
    } else 
     Toast.makeText(context,"Check your Internet Connection",Toast.LENGTH_LONG).show(); 

} 
public interface IAsyncTaskListener { 
    void onCompleted(List<String> linkArray); 
} 
} 

olduğunu

EDITED Ve bu

private LayoutInflater inflater; 
Context context; 
List<String> linkArray; 
private int lastPosition = -1; 

public RecyclerViewAdapter(Context context) { 
    //this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 

public void setDataArray(List<String> linkArray) { 
    this.linkArray = linkArray; 

} 

@Override 
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.cardview, parent, false); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Picasso.with(context).load(linkArray.get(position)).into(holder.image); 


} 

@Override 
public int getItemCount() { 
    return linkArray.size(); 
} 


public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    ImageView image; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     image = (ImageView) itemView.findViewById(R.id.imageView); 
    } 

    @Override 
    public void onClick(View v) { 

    } 
} 


} 

Ana Aktivite sınıfını kullanıyorum benim Adaptör sınıftır geçerli:

RecyclerView recyclerView; 
RecyclerViewAdapter recyclerViewAdapter; 
ProgressBar progressBar; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new HTMLAsync(getApplicationContext(), this, progressBar).execute(); 

} 

@Override 
public void onCompleted(List<String> linkArray) { 
    // Initializing the Recycler View and its layout 
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerViewAdapter = new RecyclerViewAdapter(MainActivity.this); 
    recyclerViewAdapter.setDataArray(linkArray); 
    recyclerView.setAdapter(recyclerViewAdapter); 
    recyclerView.setHasFixedSize(true); 
    recyclerViewAdapter.notifyDataSetChanged(); 
} 
} 

Ayrıca Picasoo ve JSoup kitaplığını ve ayrıca grac dosyasındaki geridönüşüm ve kart görüntüleme destek kitaplığını ekledim.

Bu, çalıştırmayı denediğimde oluşturulan LOGCAT olup nedenini tam olarak bilmiyorum.

E/lowmemorykiller: Kernel does not support memory pressure events or in- kernel low memory killer 
04-02 02:05:46.746 963-963/? E/CameraService: setUpVendorTags: Vendor tag operations not fully defined. Ignoring definitions. 
04-02 02:05:46.856 1019-1019/? E/perfprofd: unable to open configuration file /data/data/com.google.android.gms/files/perfprofd.conf 
04-02 02:05:46.995 952-952/? E/SurfaceFlinger: hwcomposer module not found 
04-02 02:05:47.640 952-977/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property 
04-02 02:05:51.636 966-966/? E/memtrack: Couldn't load memtrack module (No such file or directory) 
04-02 02:05:51.636 966-966/? E/android.os.Debug: failed to load memtrack module: -2 
04-02 02:05:51.820 963-963/? E/audio_hw_generic: Error opening input stream format 1, channel_mask 0010, sample_rate 16000 
04-02 02:05:51.820 963-1284/? E/AudioFlinger: no wake lock to update! 
04-02 02:05:51.821 963-963/? E/AudioFlinger: int android::load_audio_interface(const char*, audio_hw_device_t**) couldn't load audio hw module audio.r_submix (No such file or directory) 
04-02 02:05:51.821 963-963/? E/SoundTriggerHwService: couldn't load sound trigger module sound_trigger.primary (No such file or directory) 
04-02 02:05:51.822 963-963/? E/RadioService: couldn't load radio module radio.primary (No such file or directory) 
04-02 02:05:51.858 959-959/? E/Netd: cannot find interface dummy0 
04-02 02:05:52.606 966-966/? E/Minikin: addFont failed to create font /system/fonts/NanumGothic.ttf 
04-02 02:05:52.606 966-966/? E/Minikin: addFont failed to create font /system/fonts/DroidSansFallback.ttf 
04-02 02:05:52.606 966-966/? E/Minikin: addFont failed to create font /system/fonts/MTLmr3m.ttf 
04-02 02:05:53.188 966-966/? E/EmojiFactory_jni: Failed to load libemoji.so: dlopen failed: library "libemoji.so" not found 
04-02 02:05:54.443 966-966/? E/Hyphenator: error loading hyphenation /system/usr/hyphen-data/hyph-en-us.pat.txt 
java.io.FileNotFoundException: /system/usr/hyphen-data/hyph-en-us.pat.txt: open failed: ENOENT (No such file or directory) 
at libcore.io.IoBridge.open(IoBridge.java:452) 
at libcore.io.IoUtils$FileReader.<init>(IoUtils.java:207) 
at libcore.io.IoUtils.readFileAsString(IoUtils.java:114) 
at android.text.Hyphenator.loadHyphenator(Hyphenator.java:96) 
at android.text.Hyphenator.init(Hyphenator.java:154) 
at com.android.internal.os.ZygoteInit.preloadTextResources(ZygoteInit.java:207) 
at com.android.internal.os.ZygoteInit.preload(ZygoteInit.java:186) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
at libcore.io.Posix.open(Native Method) 
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
at libcore.io.IoBridge.open(IoBridge.java:438) 
at libcore.io.IoUtils$FileReader.<init>(IoUtils.java:207)  
at libcore.io.IoUtils.readFileAsString(IoUtils.java:114)  
at android.text.Hyphenator.loadHyphenator(Hyphenator.java:96)  
at android.text.Hyphenator.init(Hyphenator.java:154)  
at com.android.internal.os.ZygoteInit.preloadTextResources(ZygoteInit.java:207)  
at com.android.internal.os.ZygoteInit.preload(ZygoteInit.java:186)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)  
+0

"URL'm var ve resimlerin birçoğu (Atleast 3000 veya daha fazla)" - URL'nin kendisinde resim yok. Bir Web sayfası resimlere referans verebilir ve bir URL bir Web sayfasına işaret edebilir. "Tüm görüntüler href gibidir" - Bu URL'nin bir HTTP istemcisi tarafından istendiğinde, resimlere bir çeşit referans içeren bir HTML sayfası döndürdüğünü mi söylüyorsunuz? – CommonsWare

+0

Evet, tam olarak durum buydu! – Umair

cevap

0

Adım # 1: an HTML parsing library'u seçin.

Adım # 2: Bu kütüphaneyi projenize ekleyin.

3. Adım: Söz konusu URL ile ilişkili HTML'yi ayrıştırmak ve resimlerinizin URL'lerini ayıklamak için söz konusu kitaplıktaki yönergeleri izleyin.

Bu işi arka plan iş parçacığında yaptığınızdan emin olun. URL'ler listenizi aldıktan sonra, görüntüleri gerektiği gibi almak için Picasso'yu kullanarak RecyclerView'u doldurabilirsiniz.

+0

Pekala, bir deneyeyim ve sonuçlardan sonra haberdar edeceğim. – Umair

0

JSoup'u kolayca kullanabilirsiniz.

File input = new File("/tmp/input.html"); 
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/"); 
Element content = doc.getElementById("content"); 
Elements links = content.getElementsByTag("a"); 
for (Element link : links) { 
String linkHref = link.attr("href"); 
String linkText = link.text(); 
}