Listview没有在android中显示正确的图像

时间:2014-05-20 04:17:40

标签: android listview android-listview imageview

在我的应用中,我有一个列表视图。每个listview项都包含一个图像视图和几个textview。要显示图像,我使用Drawable。但滚动时图像显示在错误的行中。连续的图像会多次更改,直到出现右图。我在网上搜索过,但发现没有任何对我有用的东西。我在下面发布我的代码。请帮我!提前谢谢!

MainActivity.java

package com.makemyandroidapp.example.stacksites;

import java.io.FileNotFoundException;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    private SitesAdapter mAdapter;
    private ListView sitesList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("StackSites", "OnCreate()");
        setContentView(R.layout.activity_main);

        //Get reference to our ListView
        sitesList = (ListView)findViewById(R.id.sitesList);

        //Set the click listener to launch the browser when a row is clicked.
        sitesList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int pos,long id) {
            String posID = mAdapter.getItem(pos).getID();
                Intent i = new Intent(getApplicationContext(), PositionDesc.class);
                i.putExtra("posID", posID);
                startActivity(i);

            }

        });

        /*
         * If network is available download the xml from the Internet.
         * If not then try to use the local file from last time.
         */
        if(isNetworkAvailable()){
            Log.i("StackSites", "starting download Task");
            SitesDownloadTask download = new SitesDownloadTask();
            download.execute();
        }else{
            mAdapter = new SitesAdapter(getApplicationContext(), -1, SitesXmlPullParser.getStackSitesFromFile(MainActivity.this, "StackSites.xml"));
            sitesList.setAdapter(mAdapter);
        }

    }

    //Helper method to determine if Internet connection is available.
    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager 
              = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    } 

    /*
     * AsyncTask that will download the xml file for us and store it locally.
     * After the download is done we'll parse the local file.
     */
    private class SitesDownloadTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... arg0) {
            //Download the file
            try {
                Downloader.DownloadFromUrl("https://duapune.com/mobile/listaeplote.php", openFileOutput("StackSites.xml", Context.MODE_PRIVATE));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            //setup our Adapter and set it to the ListView.
            mAdapter = new SitesAdapter(MainActivity.this, -1, SitesXmlPullParser.getStackSitesFromFile(MainActivity.this, "StackSites.xml"));
            sitesList.setAdapter(mAdapter);
            Log.i("StackSites", "adapter size = "+ mAdapter.getCount());
        }
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        Intent objIntent = new Intent(getApplication(), TabActivity.class);
        finish();
        startActivity(objIntent);

    }
    }

SitesAdapter.java

package com.makemyandroidapp.example.stacksites;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.view.View.OnClickListener;

/*
 * Custom Adapter class that is responsible for holding the list of sites after they
 * get parsed out of XML and building row views to display them on the screen.
 */
public class SitesAdapter extends ArrayAdapter<StackSite> {

    //ImageLoader imageLoader;
    //DisplayImageOptions options;
    Context c;
    String url1;
    String url2;
    Drawable backgr;
    ImageView iconImg;
    int posi;
    RelativeLayout row;

    public SitesAdapter(Context ctx, int textViewResourceId, List<StackSite> sites) {
        super(ctx, textViewResourceId, sites);
        c=ctx;




    }


    @Override
    public View getView(int pos, View convertView, ViewGroup parent){
         posi=pos;
        row = (RelativeLayout)convertView;
        Log.i("StackSites", "getView pos = " + pos);
        if(null == row){
            //No recycled View, we have to inflate one.
            LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = (RelativeLayout)inflater.inflate(R.layout.row_site, null);
        }

        //Get our View References
        final TextView kompaniaTxt = (TextView)row.findViewById(R.id.nameTxt);
        TextView pozicioniTxt = (TextView)row.findViewById(R.id.aboutTxt);
        final TextView kategoriaTxt = (TextView)row.findViewById(R.id.kategoriaTxt);
        TextView qytetiTxt = (TextView)row.findViewById(R.id.qytetiTxt);
        //final ProgressBar indicator = (ProgressBar)row.findViewById(R.id.progress);


        kompaniaTxt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
//String emri_komp=kompaniaTxt.getText().toString().replaceAll("\\s+","%20");
String emri_komp=kompaniaTxt.getText().toString();

            Intent intent=new Intent(c,CompanyDesc.class);
             intent.putExtra("emri_komp", emri_komp);
             intent.putExtra("url1", url1); 
            c.startActivity(intent);


            }
        });
        kategoriaTxt.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                String idKateg=getItem(posi).getIdKategoria();

            Intent intent=new Intent(c,CategoryList.class);
             intent.putExtra("idKateg", idKateg);
             intent.putExtra("url2", url2); 
            c.startActivity(intent);


            }
        });


        //Set the relavent text in our TextViews
        kompaniaTxt.setText(getItem(pos).getKompania());
        pozicioniTxt.setText(getItem(pos).getPozicioni());
        kategoriaTxt.setText(getItem(pos).getKategoria());
        qytetiTxt.setText(getItem(pos).getQyteti());
url1=getItem(pos).getImgUrl();
SitesDownloadTask download=new SitesDownloadTask();
download.execute();

        return row;


    }
    private class SitesDownloadTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... arg0) {

            try {    iconImg = (ImageView)row.findViewById(R.id.iconImg);

                backgr=drawable_from_url(url1,"kot");
                //backgr=drawable_from_url("https://duapune.com/photos/duapune@duapune.com1349707357.png","kot");

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result){


            iconImg.setBackground(backgr);

        }

        Drawable drawable_from_url(String url, String src_name) throws 
           java.net.MalformedURLException, java.io.IOException 
        {System.out.println("uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu");
           return Drawable.createFromStream(((java.io.InputStream)
              new java.net.URL(url.trim()).getContent()), src_name);

        }
    }




}

1 个答案:

答案 0 :(得分:1)

试试这个..

您必须使用ViewHolder来解决该问题

    private class ViewHolder {
        ImageView iconImg;
        TextView kompaniaTxt,pozicioniTxt,kategoriaTxt,qytetiTxt;
    }

修改

    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder holder;
        if (convertView == null) {

            view = getActivity().getLayoutInflater().inflate(R.layout.row_site, parent, false);
            holder = new ViewHolder();

            holder.iconImg = (ImageView) view.findViewById(R.id.iconImg);

            holder.kompaniaTxt = (TextView) view.findViewById(R.id.nameTxt);
            holder.pozicioniTxt = (TextView) view.findViewById(R.id.aboutTxt);
            //holder.kategoriaTxt = (TextView) view.findViewById(R.id.kategoriaTxt);
            holder.qytetiTxt = (TextView) view.findViewById(R.id.qytetiTxt);

            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

    holder.kompaniaTxt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
             //String emri_komp=kompaniaTxt.getText().toString().replaceAll("\\s+","%20");
             String emri_komp=holder.kompaniaTxt.getText().toString();

        Intent intent=new Intent(c,CompanyDesc.class);
         intent.putExtra("emri_komp", emri_komp);
         intent.putExtra("url1", url1); 
        c.startActivity(intent);


        }
    });
    holder.kategoriaTxt.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            String idKateg=getItem(posi).getIdKategoria();

        Intent intent=new Intent(c,CategoryList.class);
         intent.putExtra("idKateg", idKateg);
         intent.putExtra("url2", url2); 
        c.startActivity(intent);


        }
    });


    //Set the relavent text in our TextViews
    holder.kompaniaTxt.setText(getItem(pos).getKompania());
    holder.pozicioniTxt.setText(getItem(pos).getPozicioni());
    holder.kategoriaTxt.setText(getItem(pos).getKategoria());
    holder.qytetiTxt.setText(getItem(pos).getQyteti());
    url1=getItem(pos).getImgUrl();
    SitesDownloadTask download=new SitesDownloadTask();
    download.execute();
       return view;
    }

onPostExecute

    @Override
    protected void onPostExecute(Void result){


        holder.iconImg.setBackground(backgr);

    }

修改

而不是使用SitesDownloadTask AsyncTask使用Universal Image Loader lib

https://github.com/nostra13/Android-Universal-Image-Loader

lazy image loader

https://github.com/thest1/LazyList