每次更改设备的方向时,项目都会添加到Recycler视图中

时间:2015-06-21 19:39:59

标签: android android-recyclerview screen-rotation recycler-adapter

我有一个购物清单应用程序有一个错误,当设备的方向改变(Portret到横向或相反)新项目被添加。例如,如果我有一个这样的购物项目: enter image description here

在我更改设备的方向后,它会重复:

enter image description here 如果我不断改变方向,他们会继续重复。 如何在不需要将方向设置为portret的情况下避免使用它?

这是我在MainActivity中的代码:

public class MainActivity extends AppCompatActivity {
public static boolean ifLongPress = false;
private Toolbar mToolbar;
private RecyclerView mRecyclerView;
public static ArrayList<String> shoppingListItems;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private TextView mEmptyTextView;
private int arrayListSizeDefaultValue = 0;
private ShoppingListAdapter adapter;
private ActionButton actionButton;
private MaterialDialog addItemdialog = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mEmptyTextView = (TextView)findViewById(R.id.list_empty);
    mEmptyTextView.setVisibility(View.INVISIBLE);
    mSharedPreferences = getPreferences(MODE_PRIVATE);
    mEditor = mSharedPreferences.edit();

    actionButton = (ActionButton)findViewById(R.id.buttonFloat);
    actionButton.setButtonColor(getResources().getColor(R.color.ColorPrimary));
    actionButton.setButtonColorPressed(getResources().getColor(R.color.ColorPrimaryDark));
    actionButton.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.fab_plus_icon,null));
    actionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            buildAlertDialog();
        }
    });
    mToolbar = (Toolbar)findViewById(R.id.tool_bar);
    setSupportActionBar(mToolbar);
    mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
    if(shoppingListItems == null){
          shoppingListItems = new ArrayList<>();
    }

    //read the array lists
    readShoppingItems();

    adapter = new ShoppingListAdapter(this,shoppingListItems,mSharedPreferences,mEditor);
    mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getApplicationContext()));
    mRecyclerView.setAdapter(adapter);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(linearLayoutManager);

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            actionButton.setHideAnimation(ActionButton.Animations.SCALE_DOWN);
            actionButton.hide();
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                actionButton.setShowAnimation(ActionButton.Animations.SCALE_UP);
                actionButton.show();
            }
        }
    });

    //check weather to show the empty text view
    isListEmpty();

}

private void readShoppingItems() {
    int size = mSharedPreferences.getInt(Constants.ARRAY_LIST_SIZE_KEY, arrayListSizeDefaultValue);
    for(int i = 0;i< size;i++){
        shoppingListItems.add(mSharedPreferences.getString(Constants.ARRAY_LIST_ITEM_KEY + i,null));
    }
}

private void saveShoppingItems() {
    //save array list
    mEditor.putInt(Constants.ARRAY_LIST_SIZE_KEY, shoppingListItems.size());
    for (int i =0;i<shoppingListItems.size();i++){
        mEditor.putString(Constants.ARRAY_LIST_ITEM_KEY + i,shoppingListItems.get(i));
    }
    mEditor.apply();
    adapter.notifyDataSetChanged();
}

private void buildAlertDialog() {
    final int[] choosenQuantity = {1};
    final String[] str = {""};
    final MaterialDialog.Builder addItemBuilder = new MaterialDialog.Builder(this);
    addItemBuilder.title("Add Item");
    addItemBuilder.widgetColor(getResources().getColor(R.color.ColorPrimaryDark));
    addItemBuilder.inputMaxLength(30, R.color.material_blue_grey_950);
    addItemBuilder.content("Quantity:" + choosenQuantity[0]);
    addItemBuilder.inputType(InputType.TYPE_CLASS_TEXT);
    addItemBuilder.autoDismiss(true);
    addItemBuilder.input("add shopping item", "", new MaterialDialog.InputCallback() {
        @Override
        public void onInput(MaterialDialog dialog, CharSequence input) {
            str[0] = input.toString().trim();
            //add it to shoppingListItems and save to sharedPreferences
            if (str[0].length() != 0) {
                if (choosenQuantity[0] > 1) {
                    shoppingListItems.add(str[0] + " (" + choosenQuantity[0] + ")");
                } else {
                    shoppingListItems.add(str[0]);
                }
                saveShoppingItems();
                isListEmpty();
                dialog.dismiss();
            } else {
                Toast.makeText(MainActivity.this, "no item description!", Toast.LENGTH_LONG).show();
            }

        }
    });
    addItemBuilder.negativeText("Cancel");
    addItemBuilder.callback(new MaterialDialog.ButtonCallback() {
        @Override
        public void onNegative(MaterialDialog dialog) {
            super.onNegative(dialog);
            dialog.dismiss();
        }
    });
    addItemBuilder.neutralText("Add Quantity");
    addItemBuilder.callback(new MaterialDialog.ButtonCallback() {
        @Override
        public void onNeutral(final MaterialDialog dialog) {
            super.onNeutral(dialog);
            addItemBuilder.autoDismiss(false);
            MaterialDialog.Builder quantityDialogBuilder = new MaterialDialog.Builder(MainActivity.this);
            quantityDialogBuilder.title("Add Quantity");
            quantityDialogBuilder.negativeText("CANCEL").callback(new MaterialDialog.ButtonCallback() {
                @Override
                public void onNegative(MaterialDialog dialog) {
                    super.onNegative(dialog);
                    addItemBuilder.autoDismiss(true);
                }
            });
            quantityDialogBuilder.items(R.array.Quantaty_array);
            quantityDialogBuilder.itemsCallback(new MaterialDialog.ListCallback() {
                @Override
                public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
                    choosenQuantity[0] = which + 1;
                    addItemdialog.setContent("Quantity:" + choosenQuantity[0]);
                    addItemBuilder.autoDismiss(true);
                }
            });
            quantityDialogBuilder.cancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    addItemBuilder.autoDismiss(true);
                }
            });
            quantityDialogBuilder.show();
        }
    });
    addItemdialog = addItemBuilder.build();
    addItemdialog.show();
}
 @Override
protected void onResume() {
    super.onResume();
    isListEmpty();
}
 private void isListEmpty() {
    if (mRecyclerView.getAdapter().getItemCount() == 0) {
        mEmptyTextView.setVisibility(View.VISIBLE);
    }
    else {
        mEmptyTextView.setVisibility(View.INVISIBLE);
    }
}

这是我的适配器中的代码:

public class ShoppingListAdapter extends RecyclerView.Adapter<ShoppingListAdapter.ShoppingListViewHolder> {
private ArrayList<String> mItems;
private Context mContext;
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private MaterialDialog addItemdialog;

public ShoppingListAdapter(Context context, ArrayList<String> items, SharedPreferences preferences,SharedPreferences.Editor editor) {
    mItems = items;
    mContext = context;
    mSharedPreferences = preferences;
    mEditor = editor;
}

@Override
public ShoppingListViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.shopping_list_item,viewGroup,false);
    ShoppingListViewHolder viewHolder = new ShoppingListViewHolder(view);

    return viewHolder;
}

@Override
public void onBindViewHolder(ShoppingListViewHolder shoppingListViewHolder, int position) {
    shoppingListViewHolder.bindShoppingList(mItems.get(position));
}

@Override
public int getItemCount() {
    return mItems.size();
}

public class ShoppingListViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener, View.OnLongClickListener{
    public TextView mShoppingListItem;
    public CheckBox mCheckBox;

    public ShoppingListViewHolder(View itemView) {
        super(itemView);
        mShoppingListItem = (TextView) itemView.findViewById(R.id.shoppingListItem);
        mCheckBox = (CheckBox) itemView.findViewById(R.id.shoppingListCheckBox);
        mCheckBox.setOnCheckedChangeListener(this);
        itemView.setOnLongClickListener(this);
    }

    public void bindShoppingList(String item){
        mShoppingListItem.setText(item);
        mCheckBox.setChecked(false);
    }


    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked){
            mItems.remove(getAdapterPosition());
            saveShoppingItems();
            notifyItemRemoved(getAdapterPosition());
        }
    }

    private void saveShoppingItems() {
        //save array list
        mEditor.putInt(Constants.ARRAY_LIST_SIZE_KEY, mItems.size());
        for (int i =0;i<mItems.size();i++){
            mEditor.putString(Constants.ARRAY_LIST_ITEM_KEY + i,mItems.get(i));
        }
        mEditor.apply();
    }

    @Override
    public boolean onLongClick(View v) {
        final int selectedItem = getAdapterPosition();
        String itemToBeEdited = mSharedPreferences.getString(Constants.ARRAY_LIST_ITEM_KEY + selectedItem, null);
        //check if the selected item has added quantity and if yes -> remove space+(number)
        String formatted ="";
        int itemSavedQuantity = 1;
        if(itemToBeEdited.length()-4>0 && (itemToBeEdited.charAt(itemToBeEdited.length()-1)==')')){
            //get the save quantity
            itemSavedQuantity = Integer.parseInt(itemToBeEdited.charAt(itemToBeEdited.length()-2)+"");
            //format the string by removing the space + (number)
            formatted = itemToBeEdited.substring(0, itemToBeEdited.length() - 4);

        }else{
            formatted = itemToBeEdited;
        }

        final String[] str = {""};
        final int[] userQuantityInput = {itemSavedQuantity};
        Toast.makeText(mContext, "Long Press", Toast.LENGTH_LONG).show();
        final MaterialDialog.Builder addItemBuilder = new MaterialDialog.Builder(mContext);
        addItemBuilder.title("Edit Item");
        addItemBuilder.widgetColor(mContext.getResources().getColor(R.color.ColorPrimaryDark));
        addItemBuilder.inputMaxLength(30, R.color.material_blue_grey_950);
        addItemBuilder.content("Quantity:" + userQuantityInput[0]);
        addItemBuilder.inputType(InputType.TYPE_CLASS_TEXT);
        addItemBuilder.autoDismiss(true);
        addItemBuilder.input("Edit shopping item", "", new MaterialDialog.InputCallback() {
            @Override
            public void onInput(MaterialDialog dialog, CharSequence input) {
                str[0] = input.toString().trim();
                //add it to shoppingListItems and save to sharedPreferences
                if (str[0].length() != 0) {
                    //save items
                    if (userQuantityInput[0] > 1) {
                        str[0] += " (" + userQuantityInput[0] + ")";
                    }
                    mEditor.putString(Constants.ARRAY_LIST_ITEM_KEY + selectedItem, str[0]);
                    mEditor.apply();
                    //clear the content
                    MainActivity.shoppingListItems.clear();
                    //read again content
                    readShoppingItems();
                    notifyDataSetChanged();
                    dialog.dismiss();
                    Toast.makeText(mContext, "Saved", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(mContext, "no item description!", Toast.LENGTH_LONG).show();
                }
            }
        });
        addItemBuilder.negativeText("Cancel");
        addItemBuilder.callback(new MaterialDialog.ButtonCallback() {
            @Override
            public void onNegative(MaterialDialog dialog) {
                super.onNegative(dialog);
                dialog.dismiss();
            }
        });
        addItemBuilder.neutralText("Edit Quantity");
        addItemBuilder.callback(new MaterialDialog.ButtonCallback() {
            @Override
            public void onNeutral(final MaterialDialog dialog) {
                super.onNeutral(dialog);
                addItemBuilder.autoDismiss(false);
                MaterialDialog.Builder quantityDialogBuilder = new MaterialDialog.Builder(mContext);
                quantityDialogBuilder.title("Edit Quantity");
                quantityDialogBuilder.negativeText("CANCEL").callback(new MaterialDialog.ButtonCallback() {
                    @Override
                    public void onNegative(MaterialDialog dialog) {
                        super.onNegative(dialog);
                        addItemBuilder.autoDismiss(true);
                    }
                });
                quantityDialogBuilder.items(R.array.Quantaty_array);
                quantityDialogBuilder.itemsCallback(new MaterialDialog.ListCallback() {
                    @Override
                    public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
                        userQuantityInput[0] = which + 1;
                        addItemdialog.setContent("Quantity:" + userQuantityInput[0]);
                        addItemBuilder.autoDismiss(true);
                    }
                });
                quantityDialogBuilder.cancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        addItemBuilder.autoDismiss(true);
                    }
                });
                quantityDialogBuilder.show();
            }
        });
        addItemdialog = addItemBuilder.build();
        addItemdialog.getInputEditText().setText(formatted);
        addItemdialog.show();
        return true;
    }
}
private void readShoppingItems() {
    int size = mSharedPreferences.getInt(Constants.ARRAY_LIST_SIZE_KEY, 0);
    for(int i = 0;i< size;i++){
        MainActivity.shoppingListItems.add(mSharedPreferences.getString(Constants.ARRAY_LIST_ITEM_KEY + i, null));
    }
}

2 个答案:

答案 0 :(得分:3)

每次更改屏幕旋转时,您的活动都会被销毁并重新创建。

  

警告:您的活动每次都会被销毁并重新创建   用户旋转屏幕。当屏幕改变方向时,   系统会破坏并重新创建前台活动,因为   屏幕配置已更改,您的活动可能需要加载   替代资源(如布局)   Recreating an Activity

因此,重要的是您只需实例化一次对象,而不是每次重新创建应用时都不再重新创建它们。然后将它们添加到您的列表中。

您需要使用onSaveInstanceState,可能还需要使用onRestoreInstanceState

答案 1 :(得分:0)

if(shoppingListItems == null){
    shoppingListItems = new ArrayList<>();
}

地点

shoppingListItems.clear();