2016-07-25 13 views
0

我在我的移動應用程序中使用領域來存儲列表視圖的行項目。我正在擴展可以正常工作的RealmBaseAdapter。問題是,如果我對數據庫進行查詢以過濾我的項目,我的適配器不會拾取更改的列表並導致出現out of bound index錯誤。列表適配器在領域查詢後沒有選擇更改

這是我把我的適配器的初始值,

results = realm.where(BillingLineItem.class).findAll(); 
adapter = new BillingListAdapter(getActivity(), results); 

這是基於規範數,我做濾波部分,

results = realm.where(BillingLineItem.class) 
      .equalTo("SpecNumber", spec) 
      .findAll(); 
adapter.notifyDataSetChanged(); 

而像我之前說過之後,查詢結果將會被更新,但是適配器不會接受更改。

編輯:我的列表視圖

public class BillingListAdapter extends RealmBaseAdapter<BillingLineItem> { 

private LayoutInflater inflater = null; 

private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); 
private boolean isActionMode; 

public BillingListAdapter(Context mContext, RealmResults<BillingLineItem> lineItems) { 
    super(mContext,lineItems); 
    inflater = (LayoutInflater) mContext. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.isActionMode = false; 
} 
// I commented out this part because RealmBaseAdapter automaticly implements this methods in the super class 
/*@Override 
public int getCount() { 
    return lineItems.size(); 
} 

@Override 
public Object getItem(int position) { 
    return lineItems.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
}*/ 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    ViewHolder holder; 

    if (convertView == null) { 

     /****** Inflate billing_foreground_item.xml file for each row (Defined below) *******/ 
     vi = inflater.inflate(R.layout.billing_foreground_item, null); 

     /****** View Holder Object to contain billing_foreground_item.xml file elements ******/ 

     holder = new ViewHolder(); 
     holder.SubOper = (TextView) vi.findViewById(R.id.tvSubOper); 
     holder.Spec = (TextView) vi.findViewById(R.id.tvSpec); 
     holder.Address = (TextView) vi.findViewById(R.id.tvAddress); 
     holder.SKU = (TextView) vi.findViewById(R.id.tvSku); 
     holder.SKUDesc = (TextView) vi.findViewById(R.id.tvSkuDesc); 
     holder.Quantity = (TextView) vi.findViewById(R.id.tvQuantity); 
     holder.Unit = (TextView) vi.findViewById(R.id.tvUnit); 
     holder.BilledQty = (TextView) vi.findViewById(R.id.tvBBilledQty); 
     holder.RemainingQty = (TextView) vi.findViewById(R.id.tvRemainingQty); 
     holder.ivLineIcon = (ImageView) vi.findViewById(R.id.ivLineIcon); 
     holder.rlItem = (RelativeLayout) vi.findViewById(R.id.rlItem); 
     holder.ErrorMessage = (TextView) vi.findViewById(R.id.txtErrorDisplay); 
     /************ Set holder with LayoutInflater ************/ 
     vi.setTag(holder); 
    } else { 
     holder = (ViewHolder) vi.getTag(); 
    } 

    /************ Set Model values in Holder elements ***********/ 
    if (adapterData.get(position).getFinalFlag()) { 
     holder.ivLineIcon.setImageResource(R.drawable.finalflagblue); 

     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 255)); 

     if (adapterData.get(position).getCompleted()) { 
      holder.rlItem.setBackgroundColor(Color.rgb(223, 235, 245)); 
     } 
     if (adapterData.get(position).getErrorFlag()){ 
      holder.rlItem.setBackgroundColor(Color.rgb(231, 25, 57)); 
      holder.ErrorMessage.setVisibility(View.VISIBLE); 
      holder.ErrorMessage.setText(adapterData.get(position).getErrorMessage()); 
     } 

    } else if (adapterData.get(position).getDeleteFlag()) { 
     holder.ivLineIcon.setImageResource(R.drawable.trashiconred); 

     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 255)); 
     if (adapterData.get(position).getErrorFlag()){ 
      holder.rlItem.setBackgroundColor(Color.rgb(231, 25, 57)); 
      holder.ErrorMessage.setVisibility(View.VISIBLE); 
      holder.ErrorMessage.setText(adapterData.get(position).getErrorMessage()); 
     } 
    } else if (adapterData.get(position).getChanged()) { 
     holder.ivLineIcon.setImageResource(R.drawable.changedicongreen); 

     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 255)); 
     if (adapterData.get(position).getErrorFlag()){ 
      holder.rlItem.setBackgroundColor(Color.rgb(231, 25, 57)); 
      holder.ErrorMessage.setVisibility(View.VISIBLE); 
      holder.ErrorMessage.setText(adapterData.get(position).getErrorMessage()); 
     } 
    } else if (adapterData.get(position).getNewLine()) { 
     holder.ivLineIcon.setImageResource(R.drawable.newlineicon); 

     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 255)); 

     if (adapterData.get(position).getErrorFlag()){ 
      holder.rlItem.setBackgroundColor(Color.rgb(231, 25, 57)); 
      holder.ErrorMessage.setVisibility(View.VISIBLE); 
      holder.ErrorMessage.setText(adapterData.get(position).getErrorMessage()); 
     } 
    } else { 
     holder.ivLineIcon.setImageResource(R.drawable.linesiconblack); 

     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 255)); 
     holder.ErrorMessage.setVisibility(View.GONE); 
    } 

    if (mSelection.get(position) != null) { 
     //Log.d(TAG, "Item Selected"); 
     holder.rlItem.setBackgroundColor(Color.rgb(255, 255, 192));// this is a selected position so make it hilighted 
    } 

    holder.SubOper.setText(adapterData.get(position).getSubOper()); 
    holder.Spec.setText(adapterData.get(position).getSpecNumber()); 
    holder.Address.setText(adapterData.get(position).getAddress()); 
    holder.SKU.setText(adapterData.get(position).getSKUNumber()); 
    holder.SKUDesc.setText(adapterData.get(position).getSKUDesc()); 
    holder.Quantity.setText(adapterData.get(position).getQuantity()); 
    holder.Unit.setText(adapterData.get(position).getUnit()); 
    holder.BilledQty.setText(adapterData.get(position).getBilledQty()); 
    holder.RemainingQty.setText(adapterData.get(position).getRemainingQty()); 

    return vi; 
} 


public void setNewSelection(int position, boolean value) { 
    mSelection.put(position, value); 
    notifyDataSetChanged(); 
} 

public boolean isPositionChecked(int position) { 
    Boolean result = mSelection.get(position); 
    return result == null ? false : result; 
} 

public Set<Integer> getCurrentCheckedPosition() { 
    return mSelection.keySet(); 
} 

public void removeSelection(int position) { 
    mSelection.remove(position); 
    notifyDataSetChanged(); 
} 

public void clearSelection() { 
    mSelection = new HashMap<Integer, Boolean>(); 
    notifyDataSetChanged(); 
} 

public void setActionMode(boolean isActionMode) 
{ 
    this.isActionMode = isActionMode; 
} 

@Override 
public boolean isEnabled(int position) 
{ 
    final BillingLineItem item = (BillingLineItem) getItem(position); 
    if (!item.getDeleteFlag().equals("true")) 
    { 
     //only enable items that are not inside the basket 
     return true; 
    } 
    //all other items are disabled during actionmode 
    return false; 
} 

public static class ViewHolder { 
    public TextView SubOper; 
    public TextView Spec; 
    public TextView Address; 
    public TextView SKU; 
    public TextView SKUDesc; 
    public TextView Quantity; 
    public TextView Unit; 
    public TextView BilledQty; 
    public TextView RemainingQty; 
    public ImageView ivLineIcon; 
    public RelativeLayout rlItem; 
    public TextView ErrorMessage; 
} 

}

+0

什麼realm.where(BillingLineItem.class) .equalTo( 「SpecNumber」,SPEC) .findAll()大小()?。它大於零?! –

+0

是的,在查詢後,結果的大小是8 –

+0

您是否在適配器的getitemcount()中設置了正確的值? –

回答

1

的一些信息適配器在這裏指出:

Android是基於java因而它的變量是參考值傳遞(More Info)。 這意味着,如果你有一個對象:

RealmResults<BillingLineItem> results; 

你通過這個變量作爲參數傳遞給適配器的構造:

adapter = new BillingListAdapter(getActivity(), results); 

您擁有適配器和內部變量之外名單適配器實際上是相同的對象(兩個變量指向同一個引用)。

後,你讓你的第二個查詢:

results = realm.where(BillingLineItem.class) 
      .equalTo("SpecNumber", spec) 
      .findAll(); 

你正在一個新的參考並將其存儲在結果對象因此適配器之外名單和先前的適配器通過字面上不同列表對象,因此適配器將無法感知更改並且出現錯誤。你能解決這個問題是這樣的:

results.clear(); 
//adapter.notifyDataSetChanged() if you want to show the change before data fetched... 
results.addAll(realm.where(BillingLineItem.class) 
      .equalTo("SpecNumber", spec) 
      .findAll()); 
adapter.notifyDataSetChanged(); 
+0

在RealmResults中不建議使用clear()和addAll()函數,並且找不到其他方法來替換該函數。我意識到這個參考問題,我無法找到解決它的方法。 –

+0

@EsatIBIS然後使用RealmList。將結果添加到列表中並改爲使用該列表。 https://github.com/realm/realm-java/blob/master/realm/realm-library/src/main/java/io/realm/RealmList.java –

+0

但是,如果我改變爲RealmList,我可以對我現在正在做的事情做出改變。在這種情況下,我需要有2個列表,其中一個將是用於數據更改的RealmResults和用於顯示目的的RealmList。我認爲這不是有效的做事方式。 –