我有一个购物清单应用程序有一个错误,当设备的方向改变(Portret到横向或相反)新项目被添加。例如,如果我有一个这样的购物项目:
在我更改设备的方向后,它会重复:
如果我不断改变方向,他们会继续重复。 如何在不需要将方向设置为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));
}
}
答案 0 :(得分:3)
每次更改屏幕旋转时,您的活动都会被销毁并重新创建。
警告:您的活动每次都会被销毁并重新创建 用户旋转屏幕。当屏幕改变方向时, 系统会破坏并重新创建前台活动,因为 屏幕配置已更改,您的活动可能需要加载 替代资源(如布局) Recreating an Activity
因此,重要的是您只需实例化一次对象,而不是每次重新创建应用时都不再重新创建它们。然后将它们添加到您的列表中。
您需要使用onSaveInstanceState,可能还需要使用onRestoreInstanceState
答案 1 :(得分:0)
在
if(shoppingListItems == null){
shoppingListItems = new ArrayList<>();
}
地点
shoppingListItems.clear();