2016-07-25 7 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(); 

など私は前に言ったクエリの結果は更新されますが、アダプタは変更をピックアップしません。

EDIT:リストビュー

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

は(BillingLineItem.class) .equalTo( "SpecNumber"、スペック) .findAll()サイズ()realm.where何?それはゼロよりも大きいですか? –

+0

質問後、結果のサイズは8 –

+0

あなたのアダプタのgetitemcount()に正しい値を設定していますか? –

答えて

1

一部の情報のための私のアダプタは、ここで指摘します

のAndroidはJavaに基づいていますので、それは変数が基準値によって渡されます(More Info)。

RealmResults<BillingLineItem> results; 

そして、あなたは、アダプタのコンストラクタにパラメータとしてこの変数を渡します: それはあなたがオブジェクトを持っている場合ことを意味

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

あなたは内部アダプターおよび変数の外に持っているリストを実際には同じオブジェクトです(2つの変数が同じ参照を指しています)。

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

あなたは新しい参照を作り、結果オブジェクトにこれアダプター外リストと以前のアダプタに渡され、文字通り異なっているリストを、それを格納している:あなたは2番目のクエリを行った後

アダプターは変更を検出できず、エラーが発生します。あなたはこのようにそれを修正することができます。

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

'clear()'と 'addAll()'関数はRealmResultsでは廃止されましたが、その関数を置き換えるための他のメソッドを見つけることができませんでした。私はその参照の問題を知っていただけで私はそれを回避する方法を見つけることができませんでした。 –

+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です。私はそれが効率的なやり方ではないと思う。 –

関連する問題