2015-10-18 6 views
5

लक्ष्यप्रदर्शन डिफ़ॉल्ट छवि कोई छवि सर्वर

प्रदर्शन एक डिफ़ॉल्ट छवि से लौटे, तो जब कोई छवि सर्वर से डाउनलोड किया जाता है।

समस्या

मैं (कुछ पाठ बॉक्स के साथ लेकिन महत्वपूर्ण नहीं thats) एक imageView साथ सूचीदृश्य है। मेरी छविदृश्य छात्रों के लिए छवियों को डाउनलोड करता है लेकिन जब छात्र की कोई छवि नहीं होती है तो मैं एक डिफ़ॉल्ट छवि प्रदर्शित करने की कोशिश कर रहा हूं। मैंने दो चीजों की कोशिश की है जो मैंने सोचा था कि काम करना चाहिए, एक डिफ़ॉल्ट छवि सेट करें, या नीचे दिया गया कोड। इस कोड को एक गतिविधि फ़ाइल जहाँ मैं चर करने के लिए डेटाबेस कॉलम के मानों लिखने

    //Image path returned 
        if (javaRealObject.getString("img").equals("")) 
        { 
         imgv = (ImageView)findViewById(R.id.ivImage); 
         imgv.setImageResource(R.drawable.emptyhead); 

         Log.d("Test", "Empty"); 
        } 
        else//No image found in column 
        { 
         student.setImage(javaRealObject.getString("img")); 
         Log.d("Test","Not Empty"); 
        } 

हालांकि मैं imgv = (ImageView)findViewById(R.id.ivImage); पर एक अशक्त refernce हो रही है (केवल सादगी बनाए रखने के लिए img दिखाया) से ली गई है और मुझे यकीन है कि क्यों नहीं कर रहा हूँ चूंकि मेरी छवि दृश्य घोषित किया जा रहा है। कॉलम से आपूर्ति की गई कोई भी कोई भी डिफ़ॉल्ट छवि के प्रभाव को प्राप्त करने में कोई मदद नहीं करता है।

थोड़ा और संदर्भ के लिए, ऊपर दिया गया कोड एक गतिविधि है जो listview.xml को कॉल करता है, जो तब row.xml को कॉल करता है। प्रश्न में imageview row.xml फ़ाइल में है।

ROW.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="4dp" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <ImageView 
      android:id="@+id/ivImage" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:src="@drawable/empty_head" /> //default image here 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/tvFirstName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/primary" 
       android:textAppearance="?android:attr/textAppearanceLarge" /> 
      </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

सूची उस पंक्ति

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ListView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="450dp" 
     tools:listitem="@layout/row" > 
    </ListView> 
</LinearLayout> 

एडाप्टर कॉल:

public class DriverAdapter extends ArrayAdapter<Drivers> { 

    ArrayList<Drivers> ArrayListDrivers; 
    int Resource; 
    Context context; 
    LayoutInflater vi; 

    public DriverAdapter(Context context, int resource, ArrayList<Drivers> objects) { 
     super(context, resource, objects); 

     ArrayListDrivers = objects; 
     Resource = resource; 
     this.context = context; 

     vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

     ViewHolder holder; 
     if (convertView == null) { 
      convertView = vi.inflate(Resource, null); 
      holder = new ViewHolder(); 

      holder.imageview = (ImageView) convertView.findViewById(R.id.ivImage); 
      holder.tvName = (TextView) convertView.findViewById(R.id.tvFirstName); 
      holder.tvDescription = (TextView) convertView.findViewById(R.id.tvLastName); 
      holder.tvClientid = (TextView) convertView.findViewById(R.id.tvid); 
      holder.tvExpires = (TextView) convertView.findViewById(R.id.tv_expdate); 

      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.imageview.setImageResource(R.drawable.ic_launcher); 
      new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage()); 


     Glide.with(holder.imageview.getContext()) 
       .load(new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage())  ) 
       .centerCrop() 
       .placeholder(R.drawable.ic_launcher) 
       .crossFade() 
       .into(holder.imageview); 


     holder.tvName.setText(ArrayListDrivers.get(position).getFirstname()); 
     holder.tvDescription.setText(ArrayListDrivers.get(position).getLastname()); 
     holder.tvClientid.setText(ArrayListDrivers.get(position).getClient_id()); 
     holder.tvExpires.setText("Expiry Date:"+ArrayListDrivers.get(position).getExpires()); 



     return convertView; 


    } 

    static class ViewHolder { 
     public ImageView imageview; 
     public TextView tvName; 
     public TextView tvDescription; 
     public TextView tvClientid; 
     public TextView tvExpires; 

    } 


    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap cImg1 = null; 


      try { 

       byte[] decodedString = Base64.decode(urldisplay, Base64.DEFAULT); 
       cImg1 = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 


      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return cImg1; 


     } 

     protected void onPostExecute(Bitmap result) { 

      bmImage.setImageBitmap(result); 


     } 
    } 
} 
+0

कृपया अपना एक्सएमएल कोड पोस्ट करें। –

+0

आपके एडाप्टर क्लास से कोड से ऊपर है ..? –

+0

एक्सएमएल और लॉग पोस्ट करें। अगर किसी अन्य स्थिति के ऊपर आपको findViewbyId लाइन घोषित करने के लिए एक और चीज है। – Pankaj

उत्तर

1

इस विधि काम करेगा - अपने xml कोड में एक डिफ़ॉल्ट छवि सेट करें , जो छात्र के पास होने पर प्रदर्शित किया जाएगा छवि। यदि आपके पास कोई छवि है तो setImageResource (...) का उपयोग करके गतिशील रूप से छवि सेट करें।

अपनी छवि दृश्य की आईडी को दोबारा जांचें क्योंकि आपको शून्य संदर्भ त्रुटि मिल रही है और यदि यह समस्या का समाधान नहीं करता है तो कृपया पूर्ण गतिविधि कोड पोस्ट करें।

Glide:

+0

हां आपको शून्य संदर्भ त्रुटि मिलेगी क्योंकि आपकी गतिविधि को आपकी row.xml के बारे में कोई जानकारी नहीं है, आप केवल XML दृश्य सूची में दृश्यों को कॉल कर सकते हैं। आप उस छविदृश्य को केवल उस तक एक्सेस कर सकते हैं जहां आप उस पंक्ति को एडवेंटर क्लास –

+0

में सूचीदृश्य में सेट कर रहे हैं, मैं बिल्कुल अपने एडाप्टर में कर रहा हूं (मैंने इसे ऊपर चिपकाया है) हालांकि डिफ़ॉल्ट छवियां नहीं दिखायी जाती हैं। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि यह इसे "nothnig" असाइन करता है क्योंकि यह क्वेरी में छवि पथ से कुछ भी नहीं मिलता है। – Niana

13

, आप की तरह छवि लोड libs में से एक का उपयोग कर सकते करने के लिए एक बेहतर तरीका है।

एक छवि लोड हो रहा है और Android के लिए कैशिंग पुस्तकालय आसान स्क्रॉलिंग

पर ध्यान केंद्रित है और यह आपको सिर्फ एक लाइन ले आप क्या चाहते करने के लिए होगा।

Glide.with(myFragment) 
    .load(url) 
    .placeholder(R.drawable.loading_spinner) 
    .into(myImageView); 

यह आसान और क्लीनर है।

+0

मैं वास्तव में इसका उपयोग करना चाहता हूं लेकिन मेरे पास एक प्रश्न है। मैंने सवाल संपादित किया है और अपना एडाप्टर जोड़ा है। क्या आप वहां ग्लाइड को लागू करने के लिए और निर्देश दे सकते हैं? – Niana

+0

बहुत धन्यवाद जीवन की बचत :-) – Gattsu

+0

मुझे एक त्रुटि मिलती है कि विधि प्लेसहोल्डर को हल नहीं किया जा सकता है। क्या आपके पास कोई विचार है कि यह क्यों है? ग्लाइड लाइब्रेरी, निश्चित रूप से, परियोजना में जोड़ा गया है। – XerXes

2

आपकी सूचीदृश्य का एडाप्टर आपकी पंक्तियों के विचारों के प्रबंधन के लिए ज़िम्मेदार है। आपका एडाप्टर कैसा दिखता है? (ऑब्जेक्ट जिसे आप listview.setAdapter (एडाप्टर) पर कॉल करते हैं)।

अपने एडाप्टर के अंदर, एक विधि कॉल प्राप्त होता है देखें कि आपको ओवरराइड करने और दृश्य ऑब्जेक्ट को वापस करने की आवश्यकता है। तुम्हें पता है, इस दृश्य वस्तु पर view.findviewbyId() कॉल करने के लिए आपकी गतिविधि पर नहीं

अद्यतन इन पंक्तियों को दूर

holder.imageview.setImageResource(R.drawable.ic_launcher); 
     new DownloadImageTask(holder.imageview).execute(ArrayListDrivers.get(position).getImage()); 

पी प्रयास करें की जरूरत है/एस आप Glide.with बुला के उद्देश्य को समझा सकता है (संदर्भ) .load (वस्तु)? आप

+0

में एक टाइपो है, कृपया मेरे एडाप्टर कोड को देखें। मैंने वहां – Niana

1

धन्यवाद अपने AsyncTask constructor कोशिश में इस

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View convertView = inflater.inflate(R.layout.row, null, false); 
ivImage= (ImageView) convertView.findViewById(R.id.ivImage); 
यहाँ

row.xml जहां imageView घोषित की तरह अपने चित्र दृश्य प्रारंभ करने में ... और यह सुनिश्चित करें ivImage बनाने वैश्विक चर अब ivImage अशक्त नहीं है ...। मैंने इसे चेक किया .. लेकिन listview row....

+0

में छवि संसाधन सेट किया है, मैंने inflater = (layoutInflater) getAplicationContext() प्राप्त किया है। GetSystemService (context.LAYOUT_INFLATER_SERVICE); (ऑनक्रेट में) और कन्वर्ट व्यू = inflater.inflate (R.layout.row, शून्य, झूठी) देखें; ivImage = (ImageView) convertView.findViewById (R.id.ivImage); imgv.setImageResource (R.drawable.empty_head); एआईएनसी विधि में लेकिन अभी भी कोई डिफ़ॉल्ट छवि नहीं है – Niana

1

प्रबंधित करने के लिए adapter कक्षा का उपयोग करना बेहतर है, मैंने इसे कुछ आसान करके हल किया। एआईएनसी विधि के पोस्ट exeucte में मैंने बस कहा।

if (result != null){ 
       bmImage.setImageBitmap(result); 
      } 

इस तरह अगर यह रिक्त है, डिफ़ॉल्ट imageView से अधिक "अशक्त" के साथ लिखा नहीं किया जाएगा। मार्गदर्शन के लिए धन्यवाद

संबंधित मुद्दे