我有片段(在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);
}
}
答案 0 :(得分:0)
您可能正在传递对Fragment
的引用并更改引用尝试更新它(使用=
)。
变量的工作方式是,变量包含指向内存中对象的内存地址。如果您想更改它的值并希望更改反映在其他位置的其他引用中,则使用=
将无效。
例如,如果适配器中有ArrayList
并且您在Fragment
中传递了arrayList.clear();
arrayList.add(newValue);
,则将所有值替换为:
arrayList = new ArrayList<>();
arrayList.add(newValue);
它将反映在您在其他地方保留的所有其他参考文献中,但如果您这样做,则会:
arrayList
它改变了引用,这个变量CredentialCache.DefaultNetworkCredentials
现在指向一个完全不同的内存位置,它包含一个完全不同的对象。这些变化不会反映在其他地方的旧物体的其他参考文献中。
答案 1 :(得分:0)
简单。将全局变量声明为static。并在任何地方使用该变量。如果有问题,请告诉我。