Android ListView错误的图像

Android ListView错误的图像,android,listview,adapter,Android,Listview,Adapter,我正在开发一个Android应用程序,但我是一个新手,我被卡住了。。。 我的ListView单个元素有一个ImageView和一些TextView,但有时当我滚动页面时,有7-8个以上的元素,它不会在正确的行中显示正确的图像。 我正在使用自定义图像加载器来管理下载的图像。 这是我的适配器: public class AddVideogameActivityAdapter extends BaseAdapter { private ArrayList<Videogame> vi

我正在开发一个Android应用程序,但我是一个新手,我被卡住了。。。 我的ListView单个元素有一个ImageView和一些TextView,但有时当我滚动页面时,有7-8个以上的元素,它不会在正确的行中显示正确的图像。 我正在使用自定义图像加载器来管理下载的图像。 这是我的适配器:

public class AddVideogameActivityAdapter extends BaseAdapter {
    private ArrayList<Videogame> videogames;
    private Typeface typefaceMedium;
    private Typeface typefaceLight;
    private ImageLoader loader;

    private LayoutInflater mInflater;

    public AddVideogameActivityAdapter(Context context, ArrayList<Videogame> results) {
        videogames = results;
        mInflater = LayoutInflater.from(context);
        typefaceMedium = Typeface.createFromAsset(context.getAssets(), "Roboto-Medium.ttf");
        typefaceLight = Typeface.createFromAsset(context.getAssets(), "Roboto-Light.ttf");
        loader = new ImageLoader(context);
    }

    public int getCount() {
        return videogames.size();
    }

    public Object getItem(int position) {
        return videogames.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

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

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_element,null);
            holder = new ViewHolder();
            holder.imgView = (ImageView) convertView.findViewById(R.id.thumbView);
            holder.txtName = (TextView) convertView.findViewById(R.id.elementView);
            holder.txtPlatform = (TextView) convertView.findViewById(R.id.elementView2);
            convertView.setTag(holder);
        } 
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        try  {
            Videogame vgame = (Videogame) videogames.get(position);
            holder.txtName.setText(vgame.getTitle());
            holder.txtName.setTypeface(typefaceMedium);
            holder.txtPlatform.setText(videogames.get(position).getPlatform());
            holder.txtPlatform.setTypeface(typefaceLight);
            holder.imgUrl = videogames.get(position).getImage();
            loader.display(holder.imgUrl, holder.imgView, R.drawable.youtube_icon);
        }
        catch (Exception e) {
            e.printStackTrace();
            Log.e(com.example.ludos2_0.MainActivity.TAG,
                    "Exception: " + e.getLocalizedMessage());
        }
        return convertView;
    }

    static class ViewHolder {
        TextView txtName;
        TextView txtPlatform;
        public String imgUrl;
        ImageView imgView;
    }
}
对不起我的英语,谢谢你的帮助! 编辑: 这也是加载程序:

public class ImageLoader implements ComponentCallbacks2 {
    private TCLruCache cache;

    public ImageLoader(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE);
        int memoryClass = am.getMemoryClass() * 1024 * 1024;
        cache = new TCLruCache(memoryClass);
    }

    public void display(String url, ImageView imageview, int defaultresource) {
        imageview.setImageResource(defaultresource);
        Bitmap image = cache.get(url);
        if (image != null) {
            imageview.setImageBitmap(image);
        }
        else {
            new SetImageTask(imageview).execute(url);
        }
    }

    private class TCLruCache extends LruCache<String, Bitmap> {

        public TCLruCache(int maxSize) {
            super(maxSize);
        }
    }

    private class SetImageTask extends AsyncTask<String, Void, Integer> {
        private ImageView imageview;
        private Bitmap bmp;

        public SetImageTask(ImageView imageview) {
            this.imageview = imageview;
        }

        @Override
        protected Integer doInBackground(String... params) {
            String url = params[0];
            try {
                bmp = getBitmapFromURL(url);
                if (bmp != null) {
                    cache.put(url, bmp);
                }
                else {
                    return 0;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            }
            return 1;
        }

        @Override
        protected void onPostExecute(Integer result) {
            if (result == 1) {
                imageview.setImageBitmap(bmp);
            }
            super.onPostExecute(result);
        }

        private Bitmap getBitmapFromURL(String src) {
            try {
                URL url = new URL(src);
                HttpURLConnection connection
                    = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();
                Bitmap myBitmap = BitmapFactory.decodeStream(input);
                return myBitmap;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

    }
}
重新编辑 活动代码:

public class AddVideogameActivity extends ListActivity {

    private TextView searchField = null;
    private final Handler handler = new Handler();
    private ArrayList<Videogame> videogamesList = null;
    private static AddVideogameActivity mContext = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_book);
        mContext = this;
        searchField = (TextView) findViewById(R.id.searchField);
        searchField.setMaxLines(1);
        searchField.setOnFocusChangeListener(new OnFocusChangeListener() {           
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                searchField.setHint("");
            }
        });

        // Setup the list view and its listener
        getListView().setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {


                Log.d(MainActivity.TAG,
                        "AddBookActivity --->  AddButton:onClick()");

                // Sets typefaces for TextView

                String videogameId = videogamesList.get(position).getId();
                String videogameName = videogamesList.get(position).getTitle();
                String thumbnail = videogamesList.get(position).getThumbnail();
                String description = videogamesList.get(position)
                        .getDescription();
                String image = videogamesList.get(position).getImage();
                String platform = videogamesList.get(position).getPlatform();

                if (videogameName != null && videogameName.length() > 0
                        && thumbnail != null && thumbnail.length() > 0
                        && description != null && description.length() > 0
                        && image != null && image.length() > 0
                        && platform != null && platform.length() > 0) {
                    if (ListsManager.getInstance().addVideogame(
                            new Videogame(videogameId, videogameName,
                                    thumbnail, image, description, platform)) == 0) {
                        Log.d(MainActivity.TAG,
                                "AddBookActivity --> Videogame:[" + videogameId
                                        + "@" + videogameName + "]");

                        Toast toast = Toast.makeText(mContext, "["
                                + videogameName + "] Saved !",
                                Toast.LENGTH_LONG);
                        toast.show();
                    } else {
                        Log.e(MainActivity.TAG,
                                "AddBookActivity --> Error ! Videogame already in the list ! ");
                        Toast toast = Toast.makeText(mContext,
                                "Error! Videogame already in the list!",
                                Toast.LENGTH_LONG);
                        toast.show();
                    }
                } else {
                    Log.e(MainActivity.TAG,
                            "AddBookActivity --> Error ! Invalid Videogame Name or Thumbnail or Id or Deck");
                    Toast toast = Toast
                            .makeText(
                                    mContext,
                                    "Error ! Invalid Videogame Name or Thumbnail or Id or Deck",
                                    Toast.LENGTH_LONG);
                    toast.show();
                }

                Intent newIntent = new Intent(getApplicationContext(),
                        MainActivity.class);
                startActivity(newIntent);
            }

        });

        // Setup the search button and its listener
        Button searchButton = (Button) findViewById(R.id.searchButton);
        searchButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(com.example.ludos2_0.MainActivity.TAG, "Search Game ...");

                String searchInputString = searchField.getText().toString();

                if (searchInputString != null && searchInputString.length() > 0) {
                    try {
                        String requestURL = ("http://www.giantbomb.com/api/search/?api_key=fcf60d6d67b98b0d17b3905d1a90b3fd31ed1e8e&format=json&query="
                                + Uri.encode(searchInputString) + "&resources=game");
                        // String requestURL =
                        // String.format("https://gdata.youtube.com/feeds/api/videos?v=2&alt=jsonc&category=Music&orderby=relevance&q=%s",Uri.encode(searchInputString));
                        Log.d(com.example.ludos2_0.MainActivity.TAG, requestURL);
                        DownloadGiantBombJSONData giantbombAsyncTask = new DownloadGiantBombJSONData();
                        giantbombAsyncTask.execute(new String[] { requestURL });
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        if (videogamesList == null)
            videogamesList = new ArrayList<Videogame>();
        else
            updateVideogamesListView(videogamesList);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.add_book, menu);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }



    public void updateVideogamesListView(ArrayList<Videogame> values) {
        AddVideogameActivityAdapter adapter = new AddVideogameActivityAdapter(this, values);
        setListAdapter(adapter);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
    }


}
构建ListView涉及的其他类是REST类和AsyncTask类,用于下载和解析JSon文件。

ListView是什么样子的,它是这样的:

<ListView android:id="@id/android:list"   
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="0dip" ></ListView>

尤其是ListView的id。检查您的布局文件,可能存在错误。

您应该发布ImageLoader的代码适配器乍一看很好…您可以发布活动类吗?@ZhenxiaoHao post: