グローバル変数を持つフラグメント(FragmentStatePagerAdapter内)があり、この値をonOptionsItemSelectedに参照しています。それは最初にうまく動作し、同じページに戻ってこのグローバル変数を更新して、onOptionsItemSelectedの値を参照すると、現在の値ではなく以前の値が保持されます。 "this"リファレンスをonOptionsItemSelectedに印刷しようとしました。これは最初の参照を参照しています。他のメソッドの値は更新された値を参照します。FragmentStatePagerAdapter内のフラグメントの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);
}
}
問題は "mSelectedFieldsId" 変数です。これを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);
}
}
コードスニペットを追加してください。 –
変数を更新するコードのスニペットを投稿すると、より簡単に役立ちます。 –
アダプターから 'Fragment'に渡すコードを投稿することはできますか? –