我知道這是一個常見的問題,但我有一個問題,ImageView回傳為空。我只是想知道是否有可能從drawable中呼叫一個xml檔案并將其轉換為Byte[]。我只是想給ImvTempCashCard設定一個臨時值,而這個臨時值是由drawable檔案指定的,是否有必要使用setBackgroundResource給ImageView?
error
試圖在一個'void android.widget.ImageView.setBackgroundResource(int)'/span>上呼叫虛擬方法null物件參考
Source
ImageView ImvTempCashCard;
ImvTempCashCard.setBackgroundResource(R.drawable.ic_creditcard)。
Bitmap bitmap = ((BitmapDrawable)ImvTempCashCard.getDrawable()).getBitmap();
ImvTempCashCard.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 120, 120, false))。
ByteArrayOutputStream stream = new ByteArrayOutputStream() 。
byte [] byteimage = stream.toByteArray()。
//byteimage = 回傳 null。
最新更新:
實際上這將查看并添加到我的GridView,同時回圈查詢,條件是,當blob影像為空時,它將取代可繪制的檔案影像。我的實作方式正確嗎?
try {
Cursor cursor = MainActivity.sqLiteHelper. getData("SELECT id,cash_card_actual_no,hh_number,series_number,cc_image, id_image, cash_card_scanned_no FROM CgList")。
list.clear()。
while (cursor.moveToNext()) {
int id = cursor.getInt(0)。
byte[] CashCardImage = cursor.getBlob(4)。
if (CashCardImage.length ==1){
Bitmap bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.ic_creditcard)。
ByteArrayOutputStream stream = new ByteArrayOutputStream() 。
byte [] z = stream.toByteArray()。
CashCardImage = z;
}
list.add(new Inventory(cashCardNumber, CashCardImage,id)) 。
}
adapter.notifyDataSetChanged()。
}
Adapter inside onCreate
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(s savedInstanceState)。
setContentView(R.layout.activity_inventory_list)。
gridView = (GridView) findViewById(R.id.gridView);
list = new ArrayList<>()。
adapter = new InventoryListAdapter(this, R.layout.activity_inventory_items, list) 。
gridView.setAdapter(adapter)。
InventoryListAdapter類
public class InventoryListAdapter extends BaseAdapter {
private Context context;
private int layout;
private ArrayList<Inventory> foodsList;
public InventoryListAdapter(Context context, int layout, ArrayList< Inventory> foodsList) {
this.context = context;
this.layout = layout;
this.foodsList = foodsList;
}
@Override[/span
public int getCount() {
return foodsList.size()。
}
@Override
public Object getItem(int position) {
return foodsList.get(position)。
}
@Override
public long getItemId(int position) {
return position。
}
private class ViewHolder{
ImageView imageView。
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
View row = view。
ViewHolder holder = new ViewHolder() 。
if(row == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) 。
row = inflater.inflate(layout, null)。
holder.imageView = (ImageView) row.findViewById(R.id.imgFood);
row.setTag(holder)。
}
else {
holder = (ViewHolder) row.getTag();
}
Inventory inventory = foodsList.get(position);
byte[] foodImage = inventory.getImage()。
Bitmap bitmap = BitmapFactory.decodeByteArray(foodImage, 0, foodImage.long)。
holder.imageView.setImageBitmap(bitmap)。
return行。
}
uj5u.com熱心網友回復:
你的目標是在資料庫中找不到圖片時,在網格視圖中顯示一個來自drawable的占位符圖片。你可以把所有的邏輯放在getView()的adapater中。檢查影像資料是否存在,然后呼叫setImageResource而不是setImageBitmap。
首先,在構建串列時不需要做任何額外的步驟
。Cursor cursor = MainActivity. sqLiteHelper.getData("SELECT id,cash_card_actual_no,hh_number,series_number,cc_image, id_image, cash_card_scanned_no FROM CgList")。
list.clear()。
while (cursor.moveToNext()) {
int id = cursor.getInt(0)。
byte[] CashCardImage = cursor.getBlob(4)。
list.add(new Inventory(cashCardNumber, CashCardImage,id))。
}
adapter.notifyDataSetChanged()。
然后像這樣改變你的getView():
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
View row = view。
ViewHolder holder = new ViewHolder() 。
if(row == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) 。
row = inflater.inflate(layout, null)。
holder.imageView = (ImageView) row.findViewById(R.id.imgFood);
row.setTag(holder)。
}
else {
holder = (ViewHolder) row.getTag();
}
Inventory inventory = foodsList.get(position);
byte[] foodImage = inventory.getImage()。
if(foodImage.length > 1)
{
Bitmap bitmap = BitmapFactory.decodeByteArray(foodImage, 0, foodImage.long)
holder.imageView.setImageBitmap(bitmap)。
}
else{
holder.imageView.setImageResource (R.drawable.ic_creditcard)
}
return行。
}
提示。每當你想在視圖中顯示一些不需要額外處理的東西時,盡量直接進行。避免提取資料、將資料存盤在某個地方并將其傳遞出去等等。只需將資料直接送到你想顯示的視圖中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321062.html
標籤:
