FragmentStatePagerAdapter中的onOptionsItemSelected片段保留了之前的引用

时间:2017-02-21 09:23:54

标签: android android-fragments fragmentstatepageradapter

我有片段(在FragmentStatePagerAdapter中),它有全局变量,在onOptionsItemSelected中我引用了这个值。它第一次工作正常,当我回到同一页并更新这个全局变量时,现在如果我引用onOptionsItemSelected中的值,它将保留先前的值而不是当前值。 我试图打印"这个"在onOptionsItemSelected中引用,它指的是第一个引用。而其他方法中的值是指更新后的值。

编辑1:添加代码段

   public class CustomizeFieldFragment extends BaseFragment implements CustomizeFieldListAdapter.IOnSelectCustomizeField {

private MenuItem mMenuItem;
private List<String> mSelectedFieldsId;
private boolean mShowDoneMenu;

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.customize_field_done, menu);
    mMenuItem = menu.findItem(R.id.action_done);
    mMenuItem.setVisible(false);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_done:
            updateSelectedFields();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onSelect(List<String> selectedFieldsId) {
   if(!selectedFieldsId.isEmpty()){
        mSelectedFieldsId = new ArrayList<>(selectedFieldsId);
        mShowDoneMenu = true;
    }
}

private void updateSelectedFields() {

    String[] selectionArgs = mSelectedFieldsId.toArray(new String[mSelectedFieldsId.size()]);
    Uri uri = Contract.DefectFieldEntry.buildDefectFieldUri(baseUrl, domainName, projectName);
    ContentValues cv = new ContentValues();
    cv.put(Contract.DefectFieldEntry.COLUMN_IS_FIELD_SELECTED, true);
 //  mContext.getContentResolver().update(uri, cv, null, selectionArgs);
}
}

问题在于&#34; mSelectedFieldsId&#34;变量。当我在onOptionsItemSelected中引用它时,它引用存储的旧值,而在其他方法中引用实际值。

编辑2:适配器代码段

public class CustomizeFieldListAdapter  extends RecyclerView.Adapter<CustomizeFieldListAdapter.CustomizeFieldListViewHolder> {

private static final String TAG = CustomizeFieldListAdapter.class.getSimpleName();
private Cursor mCursor;
private SparseBooleanArray mSelectedItems;
private IOnSelectCustomizeField onSelectCustomizeField;
private List<String> mSelectedItemsId;

public CustomizeFieldListAdapter(IOnSelectCustomizeField iOnSelectCustomizeField){
    onSelectCustomizeField = iOnSelectCustomizeField;
    mSelectedItems = new SparseBooleanArray();
    mSelectedItemsId = new ArrayList<>();
}

public class CustomizeFieldListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    TextView tvFieldName;
    ImageView selectionIcon;

    public CustomizeFieldListViewHolder(View itemView) {
        super(itemView);
        tvFieldName = (TextView) itemView.findViewById(R.id.customize_field_name);
        selectionIcon = (ImageView) itemView.findViewById(R.id.selection_icon);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int adapterPos = getAdapterPosition();
        toggleSelection(adapterPos);
    }
}

@Override
public CustomizeFieldListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_customize_field,
            parent, false);
    return new CustomizeFieldListViewHolder(rootView);
}

@Override
public void onBindViewHolder(CustomizeFieldListViewHolder holder, int position) {
    mCursor.moveToPosition(position);
    holder.tvFieldName.setText(mCursor.getString(1));
    if(mSelectedItems.get(position, false))
        holder.selectionIcon.setImageResource(R.mipmap.select);
    else
        holder.selectionIcon.setImageResource(R.mipmap.selection_icon);
}

@Override
public int getItemCount() {
    return mCursor == null ? 0 : mCursor.getCount();
}

public void swapCursor(Cursor cursor){
    mCursor = cursor;
    notifyDataSetChanged();
}

private void toggleSelection(int position){
    mCursor.moveToPosition(position);
    if(mSelectedItems.get(position, false)){
        mSelectedItems.delete(position);
        mSelectedItemsId.remove(mCursor.getString(0));
    }
    else{
        mSelectedItems.put(position, true);
        mSelectedItemsId.add(mCursor.getString(0));
    }
    onSelectCustomizeField.onSelect(mSelectedItemsId);
    notifyItemChanged(position);
}

public interface IOnSelectCustomizeField {
    void onSelect(List<String> selectedItemsId);
}

}

2 个答案:

答案 0 :(得分:0)

您可能正在传递对Fragment的引用并更改引用尝试更新它(使用=)。

变量的工作方式是,变量包含指向内存中对象的内存地址。如果您想更改它的值并希望更改反映在其他位置的其他引用中,则使用=将无效。

例如,如果适配器中有ArrayList并且您在Fragment中传递了arrayList.clear(); arrayList.add(newValue); ,则将所有值替换为:

arrayList = new ArrayList<>();
arrayList.add(newValue);

它将反映在您在其他地方保留的所有其他参考文献中,但如果您这样做,则会:

arrayList

它改变了引用,这个变量CredentialCache.DefaultNetworkCredentials 现在指向一个完全不同的内存位置,它包含一个完全不同的对象。这些变化不会反映在其他地方的旧物体的其他参考文献中。

答案 1 :(得分:0)

简单。将全局变量声明为static。并在任何地方使用该变量。如果有问题,请告诉我。