4

有没有一种方法可以将图像设置为ListView内的ImageView?在此,我使用SimpleCursorAdapter来显示所有字段,并使用ViewBinder将图像位图设置为ImageView。该图像使用AsyncTask下载。我写的代码如下:使用SimpleCursorAdapter和ViewBinder在ListView项目中设置图像

private void updateTimelineUI() { 
     Cursor data = dbHelper.query(Constants.TABLE_NAME, null, null); 
     if (data.moveToFirst()) { 
      adapter = new SimpleCursorAdapter(this, R.layout.tweet_row, data, new String[] {Constants.CREATED_TIME, Constants.USERNAME, Constants.PROFILE_IMAGE, Constants.TWEET}, new int[] {R.id.time, R.id.username, R.id.userImageView, R.id.tweetMessage}); 
      SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() { 
       public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
        if(view != null && view.getId() != R.id.userImageView) { 
         return false; 
        } 
       String imageUrlString = cursor.getString(columnIndex); 
       String username = cursor.getString(cursor.getColumnIndex(Constants.USERNAME)); 
       String path = getDir("images", MODE_PRIVATE).getAbsolutePath() + "/" + username + ".png"; 
       ImageDownloader downloader = new ImageDownloader(); 
       downloader.setImageUrlString(imageUrlString); 
       downloader.setImageView(view); 
       downloader.setFilePath(path); 
       downloader.execute(imageUrlString); 
       return true; 
       } 
      }; 
      int index = data.getColumnIndex(Constants.PROFILE_IMAGE); 
      //Log.d(Constants.TAG, "" + index); 
      adapter.setViewBinder(viewBinder); 
      viewBinder.setViewValue(userImageView, data, index); 
      timelineList.setAdapter(adapter); 
     } 
    } 

有没有一种方法可以将图像设置为正确的行使用此方法?

随着我目前的代码,图像下载成功。但是,图像是随机设置的。

回答

2

你应该让自己的适配器应当自SimpleCursorAdapter继承,因此,您可以用您的自定义设计,使自己的ListView项,并为其设置的自定义布局,可以在其中添加任何UI元素,你想包括ImageView的

+0

因此,除了编写我自己的适配器之外,没有别的方法吗?我能够将图像设置为imageView,但图像随机更改,所以我想知道是否可以使用当前代码完成任何操作。 –

+1

问题是,如果你在滚动列表的时候不做自己的适配器,那么listItem不知道要渲染哪个图片,这就是为什么它会渲染不同的图像,从而导致每次滚动都会改变图像。这就是为什么你需要实现自己的适配器并跟踪每个ListItem中的项目。 –

2

我创建了一个继承自SimpleCursorAdapter的自定义类,如Serdar Dogruyol提及。在这个自定义类里我@Override bindView。在bindView内部,我打电话super,然后使用view.findViewById获得我的ImageView的句柄,其中view是传递到bindView的参数之一。

相关问题