0

我有一個ListView一個活動內部及其每個項目被定製成具有一些TextViews的DropDownList項一起和ImageView的。在的OnScrollListener()實現中,使用ArrayAdapter填充文本視圖來填充listView的每個項目,其中使用從arrayList和ImageView獲取的值以及存儲在SD卡上的.jpeg文件。以下是ListView項的 List View Item如何處理ListView中的ImageView?

當從SD卡的.jpeg文件被轉換爲位圖,就會出現問題(即BitmapFactory.decodeFile(文件名)),然後被分配給圖像查看使用setImageBitmap截圖(Bitmap bmp)。由於將位圖圖像設置爲圖像視圖是一個漫長的過程,因此它無法跟上滾動偵聽器實現的步伐,並且不同ListView行的ImageView會被分配給上面任何行的圖像填充。任何人都可以請建議一些鍛鍊來解決這個問題,特別是從SD卡到imageView的圖像分配。它不像我的listView項目overLoaded控件,這就是爲什麼我面臨這個問題。我也嘗試過使用每行內部的單個ImageView項目,它的行爲方式相同。您的即興創作建議很受歡迎,當然會有很大的幫助。謝謝:-)

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

    View row = convertView; 
    AssetDetailHolder assetDetailholder = null; 

    try { 

     if (row == null) { 

      LayoutInflater inflator = ((Activity) context) 
        .getLayoutInflater(); 
      row = inflator.inflate(layoutResourceID, parent, false); 

      assetDetailholder = new AssetDetailHolder(); 

      assetDetailholder.itemPosition = position; 

      assetDetailholder.txtVwlineCOde = (TextView) row 
        .findViewById(R.id.lineCodeValue_ad); 
      assetDetailholder.txtvwLocation = (TextView) row 
        .findViewById(R.id.locationValue_ad); 
      assetDetailholder.txtvwLocationDetail = (TextView) row 
        .findViewById(R.id.detailLocationValue_ad); 
      assetDetailholder.txtvwInventoryNo = (TextView) row 
        .findViewById(R.id.InventoryNoValue_ad); 
      assetDetailholder.spnrconditionCode = (Spinner) row 
        .findViewById(R.id.spinner_ad); 
      assetDetailholder.txtvwAssetName = (TextView) row 
        .findViewById(R.id.AssetNameValue_ad); 
      assetDetailholder.subNoThumbnail = (ImageView) row 
        .findViewById(R.id.IV_subNoThumbnail); 

      row.setTag(assetDetailholder); 
     } else { 
      assetDetailholder = (AssetDetailHolder) row.getTag(); 
      assetDetailholder.itemPosition = position; 
     } 

     AssetDetail assetDetail = assetsDetailList[position]; 

     new ThumbnailTask(position, assetDetailholder, assetDetail, context) 
       .execute(); 

     if (assetDetail.assetLineCodeDesc.equals("")) { 
      assetDetailholder.txtVwlineCOde 
        .setText(assetDetail.strLineCOde); 
     } else { 
      assetDetailholder.txtVwlineCOde.setText(assetDetail.strLineCOde 
        + "(" + assetDetail.assetLineCodeDesc + ")"); 
     } 

     if (assetDetail.assetLocationNameDesc.equals("")) { 
      assetDetailholder.txtvwLocation 
        .setText(assetDetail.strLocationName); 
     } else { 
      assetDetailholder.txtvwLocation 
        .setText(assetDetail.strLocationName + "(" 
          + assetDetail.assetLocationNameDesc + ")"); 
     } 

     assetDetailholder.txtvwLocationDetail 
       .setText(assetDetail.strLocationDetail); 

     if (assetDetail.strInventoryNumber.contains("-")) { 
      assetDetailholder.txtvwInventoryNo 
        .setText(assetDetail.strInventoryNumber.split("-")[0]); 
     } else { 
      assetDetailholder.txtvwInventoryNo 
        .setText(assetDetail.strInventoryNumber); 
     } 
     assetDetailholder.txtvwAssetName.setText(assetDetail.assetName); 

     String conditionCodeString = assetDetail.assetConditionCode; 

     if (conditionCodeString != "" || conditionCodeString != null) { 
      try { 
       int conditionCodeInteger = Integer 
         .parseInt(conditionCodeString); 
       assetDetailholder.spnrconditionCode 
         .setSelection(conditionCodeInteger); 
      } catch (Exception e) { 
       assetDetailholder.spnrconditionCode.setSelection(0); 
      } 
     } else { 
      assetDetailholder.spnrconditionCode.setSelection(0); 
     } 

     // String thumbnailDir = Common 
     // .getSubNoDirectory(context, assetDetail); 

     // if (new File(thumbnailDir).isDirectory()) { 
     // 
     // File thumbnailFile = new File(Common.getSubNoImgFilePath(
     // thumbnailDir, assetDetail, SubNo_ImageSample.A)); 
     // 
     // if (thumbnailFile.exists()) { 
     // assetDetailholder.subNoThumbnail 
     // .setImageBitmap(BitmapFactory 
     // .decodeFile(thumbnailFile.getAbsolutePath())); 
     // } 
     // } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return row; 
} 

static class AssetDetailHolder { 
    TextView txtVwlineCOde; 
    TextView txtvwLocation; 
    TextView txtvwLocationDetail; 
    TextView txtvwInventoryNo; 
    TextView txtvwAssetName; 
    Spinner spnrconditionCode; 
    ImageView subNoThumbnail; 
    public int itemPosition; 
} 

private static class ThumbnailTask extends AsyncTask<Void, Void, Void> { 

    private int mPosition; 
    private AssetDetailHolder mHolder; 
    private Context cntxt; 
    private AssetDetail assetItem; 

    private Bitmap thumbnailBmp; 

    public ThumbnailTask(int position, AssetDetailHolder holder, 
      AssetDetail asset, Context context) { 
     mPosition = position; 
     mHolder = holder; 
     assetItem = asset; 
     cntxt = context; 
    } 

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

     String thumbnailDir = Common.getSubNoDirectory(cntxt, assetItem); 

     if (new File(thumbnailDir).isDirectory()) { 

      File thumbnailFile = new File(Common.getSubNoImgFilePath(
        thumbnailDir, assetItem, SubNo_ImageSample.A)); 

      if (thumbnailFile.exists()) { 

       thumbnailBmp = BitmapFactory.decodeFile(thumbnailFile 
         .getAbsolutePath()); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (mHolder.itemPosition == mPosition && thumbnailBmp != null) { 
      mHolder.subNoThumbnail.setImageBitmap(thumbnailBmp); 
     } 
     // super.onPostExecute(result); 
    } 
} 
+0

爲什麼onScrollListener? – njzk2

+0

你需要加載一個asynctask。 – njzk2

+0

我一直在爲這個問題苦苦掙扎。最後,我設法通過使方法(返回位圖)「同步」來實現。 –

回答