एंड्रॉइड ग्रिड व्यू कुछ डिवाइसों पर क्रैश या बहुत धीमा है (सैमसंग गैलेक्सी एस 4, एस 3)

मेरे पास मेरे ऐप में ग्रिड व्यू है और यह लगभग हर डिवाइस पर वाकई बहुत अच्छा है, लेकिन ... मैंने इसे कुछ दोस्तों के लिए परीक्षण करने के लिए दिया और उन्होंने कहा कि मेरा ऐप ग्रिड व्यू पर दुर्घटनाग्रस्त हो गया है .. ऐप क्रैश हो जाता है या उन्हें वास्तव में स्क्रॉल करना पड़ता है सावधानी से। कुछ दोस्तों ने कहा कि ग्रिड व्यू ठीक है (मेरा - एचटीसी वाइल्डफायर, सैमसंग गैलेक्सी मिनी), लेकिन सैमसंग गैलेक्सी एस 3, एस 4 के मेरे दोस्तों का कहना है कि यह दुर्घटनाग्रस्त है। मेरा ग्रिड व्यू:

public static List items = new ArrayList();

...

GridView gridView = (GridView) findViewById(R.id.gridview);
        items.clear();
//add all items to list

    gridView.setAdapter(new ImageAdapter(this, items));
            gridView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View v,
                        int position, long id) {
                    Intent i = new Intent(getApplicationContext(), SecondActivity.class);
                    i.putExtra("id", position);
                    startActivity(i);

                }
            });

ImageAdapter:

public class ImageAdapter extends BaseAdapter {

    private List items = new ArrayList();
    private LayoutInflater inflater;

    public ImageAdapter(Context context, List items) {
        inflater = LayoutInflater.from(context);
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int i) {
        return items.get(i);
    }

    @Override
    public long getItemId(int i) {
        return items.get(i).drawable;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View v = view;
        ImageView picture;
        TextView name;

        if (v == null) {
            v = inflater.inflate(R.layout.squareimageview, viewGroup, false);
            v.setTag(R.id.picture, v.findViewById(R.id.picture));
            v.setTag(R.id.text, v.findViewById(R.id.text));
        }

        picture = (ImageView) v.getTag(R.id.picture);
        name = (TextView) v.getTag(R.id.text);

        Item item = (Item) items.get(i);

        picture.setImageResource(item.getDrawable());
        name.setText(item.name);

        return v;

    }

}

My SquareImageView क्लास, जो मेरे ग्रिड व्यू के तत्वों को 2 कॉलम तक आकार देता है और कई स्क्रीन पर अच्छा दिखता है:

public class SquareImageView extends ImageView {
    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); //Snap to width
    }

}
0
जैसा कि मैंने stackoverflow.com/a/20332564/1297987 पोस्ट में उल्लेख किया है, नोस्ट्रा के छवि लोडर के साथ प्रयास करें
जोड़ा लेखक Maciej Boguta, स्रोत

1 उत्तर

setImageResource() के दस्तावेज़ से। (जोर मेरा है)

यह UI थ्रेड पर बिटमैप पढ़ने और डिकोडिंग करता है, जो विलंबता हिचकी का कारण बन सकता है। यदि यह कोई चिंता है, तो setImageDrawable (android.graphics.drawable.Drawable) या setImageBitmap (android.graphics.Bitmap) और बिटमैपफ़ैक्ट्री का उपयोग करने पर विचार करें।

मैं दृढ़ता से आपको छवियों को दिखाने के लिए पिकासो लाइब्रेरी का उपयोग करने का सुझाव देता हूं। getView() में फ़ंक्शन के बाद अपनी प्रोजेक्ट कॉल में लाइब्रेरी जोड़ने के बाद:

Picasso.with(context).load(item.getDrawable()).into(picture);

और बस।


public class ImageAdapter extends BaseAdapter {

    private List items = new ArrayList();
    private LayoutInflater inflater;

    private Context context; 

    public ImageAdapter(Context context, List items) {
        inflater = LayoutInflater.from(context);
        this.items = items;
        this.context = context;
    }
    .
    .
    .
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View v = view;
        ImageView picture;
        TextView name;

        if (v == null) {
            v = inflater.inflate(R.layout.squareimageview, viewGroup, false);
            v.setTag(R.id.picture, v.findViewById(R.id.picture));
            v.setTag(R.id.text, v.findViewById(R.id.text));
        }

        picture = (ImageView) v.getTag(R.id.picture);
        name = (TextView) v.getTag(R.id.text);

        Item item = (Item) items.get(i);

        Picasso.with(context).load(item.getDrawable()).into(picture);
        name.setText(item.name);

        return v; 
    }
}
2
जोड़ा
मैं संदर्भ कैसे बदल सकता हूं क्योंकि अब मुझे इसकी गलती हो रही है?
जोड़ा लेखक linkas, स्रोत
क्षमा करें, मुझे समझ में नहीं आता ... :( स्टोर को क्लास वैरिएबल के रूप में कहकर आपका क्या मतलब है? इस तरह लिखने के लिए: ImageAdapter संदर्भ;?: /
जोड़ा लेखक linkas, स्रोत
आप इस लाइन तस्वीर को बदलने के लिए कहते हैं .setImageResource (item.getDrawable ()); Picasso.with (संदर्भ) .load (item.getDrawable ()) में। (चित्र) और zwnj;; क्या तुम नहीं यदि हां, तो जब मैं ग्रिड व्यू खोलने का प्रयास करता हूं तो मेरा ऐप दुर्घटनाग्रस्त हो जाता है ..
जोड़ा लेखक linkas, स्रोत
बातचीत में मेरे प्रश्न का उत्तर दें!
जोड़ा लेखक linkas, स्रोत
आप ImageAdapter के कन्स्ट्रक्टर में संदर्भ प्राप्त कर रहे हैं, इसे क्लास वैरिएबल के रूप में स्टोर करें क्योंकि आप inflater और आइटम्स के साथ कर रहे हैं।
जोड़ा लेखक M-WaJeEh, स्रोत
अद्यतन उत्तर ...
जोड़ा लेखक M-WaJeEh, स्रोत
लॉग क्या है?
जोड़ा लेखक M-WaJeEh, स्रोत
जोड़ा लेखक M-WaJeEh, स्रोत