簡體   English   中英

Android GridView重繪問題

[英]Android GridView Redraw issues

我創建了一個應用程序,該應用程序允許用戶拍照並上傳到Web服務器。 然后,該圖像在活動中的網格視圖上變得可見

我雖然一切正常,但是我拍攝的照片越多,我注意到的問題就越多

當用戶開始滾動時,gridview中的圖像似乎正在重繪自身,從而有效地再次向用戶顯示相同的圖像(並非總是以相同的順序)

我讀過其他人在類似的東西上苦苦掙扎的帖子,但是這些修復似乎對我不起作用

GridView重繪問題

預先感謝您提供的所有幫助

這是我的gridview活動

package com.example.alex.jsonparsegridview;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

public class MainActivity extends Activity {

    GridView gridView;

    static final String[] MOBILE_OS = new String[]{
            "Android", "iOS", "Windows", "Blackberry"};

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new JSONParse().execute();

        TextView tv = (TextView)findViewById(R.id.footerText);


        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Intent myIntent = new Intent(MainActivity.this, CameraActivity.class);
                myIntent.putExtra("dir", "BS"); //Optional parameters
                MainActivity.this.startActivity(myIntent);
            }
        });


    }


    private class JSONParse extends AsyncTask<String, String, JSONArray> {
        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();

        }

        @Override
        protected JSONArray doInBackground(String... args) {

            JSONParser jParser = new JSONParser();

            // Getting JSON from URL

            String url = "http://www.500kgiveaway.co.uk/getimagesmob.php";
            JSONArray json = jParser.getJSONFromUrl(url);
            return json;
        }

        @Override
        protected void onPostExecute(JSONArray json) {
            pDialog.dismiss();
                // Getting JSON Array from URL

                JSONArray android = json;


                //copied from onCreate
                gridView = (GridView) findViewById(R.id.gridView1);

                gridView.setAdapter(new ImageAdapter(MainActivity.this, android));

                gridView.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View v,
                                            int position, long id) {
                        Toast.makeText(
                                getApplicationContext(),
                                ((TextView) v.findViewById(R.id.grid_item_label))
                                        .getText(), Toast.LENGTH_SHORT).show();
                    }
                });

                //End Copy





        }
    }
}

這是我的圖片適配器(畢加索定制)

package com.example.alex.jsonparsegridview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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


public class ImageAdapter extends BaseAdapter {
    private Context context;
    private JSONArray android;
    private String TAG_PATH = "path";
    ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();


    public ImageAdapter(Context context,  JSONArray android) {
        this.context = context;
        this.android = android;
    }

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


        View gridView = null;

             try {
                 if (convertView == null) {

                     LayoutInflater inflater = (LayoutInflater) context
                             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


                 JSONObject c = android.getJSONObject(position);

                // Storing  JSON item in a Variable
                String path = c.getString(TAG_PATH);

                // Adding value HashMap key => value

                HashMap<String, String> map = new HashMap<String, String>();

                map.put(TAG_PATH, path);

                oslist.add(map);

                gridView = new View(context);

                // get layout from mobile.xml
                gridView = inflater.inflate(R.layout.mobile, null);

                // set value into textview
                TextView textView = (TextView) gridView
                        .findViewById(R.id.grid_item_label);
                textView.setText(path.toString());

                // set image based on selected text
                ImageView imageView = (ImageView) gridView
                        .findViewById(R.id.grid_item_image);


                Picasso.with(context).load("http://www.500kgiveaway.co.uk/" + path).resize(400,400).into(imageView);

                 } else {
                     gridView = (View) convertView;
                 }

             } catch (JSONException e) {
                e.printStackTrace();
            }

        return gridView;
    }

    @Override
    public int getCount() {
       return android.length();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

}

問題出在您的getView()函數中。 GridView通過將視圖傳遞給convertView getView()來重用視圖。 但是,這些視圖不一定已經加載了正確的圖像,它們是以前用於在不同位置顯示網格中不同單元格的視圖。 因此,如果convertView不為null,則convertView使視圖膨脹的麻煩,但是仍然需要將圖像加載到其中。

重新排列您的代碼,如下所示:

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

    View gridView = null;

    try {
        if (convertView == null) {
             LayoutInflater inflater = (LayoutInflater) context
                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

             gridView = new View(context);

             // get layout from mobile.xml
             gridView = inflater.inflate(R.layout.mobile, null);              
        }
        else
        {
             gridView = convertView;
        }

        JSONObject c = android.getJSONObject(position);

        // Storing  JSON item in a Variable
        String path = c.getString(TAG_PATH);

        // set value into textview
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);
        textView.setText(path.toString());

        // set image based on selected text
        ImageView imageView = (ImageView) gridView
                .findViewById(R.id.grid_item_image);

        Picasso.with(context).load("http://www.500kgiveaway.co.uk/" + path).resize(400,400).into(imageView);

        // Adding value HashMap key => value
        HashMap<String, String> map = new HashMap<String, String>();
        map.put(TAG_PATH, path);
        // TODO: add some checks so you don't add it if it's already in the list? 
        oslist.add(map);

     } catch (JSONException e) {
        e.printStackTrace();
    }

    return gridView;
}

我不知道關於HashMap程序邏輯是什么,但是您可能只想在第一次加載圖像時將其添加到oslist 請注意,您不能為此使用(convertView == null)測試,因為convertView可能已用於完全不同的圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM