How to set observer to update navigation box after onActivityResult method got Intent result

In my application, I want to update the navigation box with the username and email address after logging in.

From mine, MainActivityI start with LoginActivityusing the method startActivityForResult(intent, PICK_ACCOUNT_REQUEST); so that users register or log in.

After LoginActivityreturns the result Intent data(it NAMEand EMAIL) back on MainActivity, the method is called onActivityResult(), and there I am trying to update the global class variables NAMEand EMAILwith the newly received data, without success: after every registration or registration of the two fields are never displayed in the navigation box. Here is my code:

At the beginning of the class, MainActivityI assign two variables:

String NAME = "Sign in", EMAIL = "";

These two values ​​are inserted into my navigation box. After getting the result from LoginActivityI want to update these two fields in the method onActivityResult(). In this way:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    // Check which request we're responding to
    if (requestCode == PICK_ACCOUNT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            String usr = data.getStringExtra("username");
            String mal = data.getStringExtra("email");
            this.NAME = usr;this.EMAIL=mal;
        }
    }
}

without success, in fact, upon completion, LoginActivityI still visualize the old values ​​in the navigation box, because I cannot access 2 EditText while holding the username and password from MainActivity. In fact, 2 EditTexts are managed internally RecyclerView.ViewHolder.

How to install Observer or something similar to dynamically updating my navigation box RecyclerView.Adapter?

More details below

* EDIT *

Ps. My navigation box is implemented using RecyclerView, so I have a class RecyclerView.Adapterand RecyclerView.ViewHolderinside the adapter. In MainActivityI have this code:

public class MainActivity extends ActionBarActivity{
    ArrayList<DrawerItem> dataList; 
    RecyclerView mRecyclerView;                // Declaring RecyclerView
    RecyclerView.Adapter mAdapter;              // Declaring Adapter For Recycler View
    RecyclerView.LayoutManager mLayoutManager; // Declaring Layout Manager as a linear layout manager
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mTitle, mDrawerTitle;
    Toolbar toolbar;

    String NAME, EMAIL; int AVATARresID; //TODO update Navigation Drawer fields

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /* Assigning the toolbar object to the view
        and setting the the Action bar to our toolbar */
        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);
        // enable ActionBar app icon to behave as action to toggle nav drawer
        getSupportActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer
        getSupportActionBar().setHomeButtonEnabled(true);      //pulsante dietro

        //Initializing
        mTitle = mDrawerTitle = getTitle();

        AVATARresID = R.mipmap.aka;
        // Add Drawer Item to dataList
        dataList = new ArrayList<>();
        dataList.add(new DrawerItem(NAME,EMAIL,AVATARresID));
        dataList.add(new DrawerItem("Account", R.mipmap.ic_account));
        dataList.add(new DrawerItem("Tuoi Tour", R.mipmap.ic_events));
        dataList.add(new DrawerItem("Prenota Tour", R.mipmap.ic_action_search));
        // dataList.add(new DrawerItem("My Favorites")); // adding a header to the list
        dataList.add(new DrawerItem("Others")); // adding a header to the list
        dataList.add(new DrawerItem("Contatti", R.mipmap.ic_about));
        dataList.add(new DrawerItem("Tutorial", R.mipmap.ic_help));

        mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
        mRecyclerView.setHasFixedSize(true);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        mAdapter = new MyAdapter(dataList, mSelectedPositions);

        mRecyclerView.setAdapter(mAdapter);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,
            R.string.drawer_open, R.string.drawer_close){
                    @Override 
                    public void onDrawerOpened(View drawerView) {...}
                    @Override
                    public void onDrawerClosed(View drawerView) {...}
        };


        // Drawer Listener set to the Drawer toggle
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerToggle.syncState(); 
        mRecyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {...});

    }
}
+4
3

!

: dataList dataStructure , SharedPreferences.

, :

String usr = data.getStringExtra("username");
String mal = data.getStringExtra("email");
this.NAME = usr; this.EMAIL=mal;

, RecyclerView.Adapter mAdapter (, ) , , .

, - , ArrayList<DrawerItems> dataList, -, Adapter mAdapter.notifyItemChanged(0) ( , Observer-Observable). , dataList.

. dataList , , , MainActivity, NavigationDrawer ( NAME EMAIL). , SharedPreferences.

onActivityResult(), " ", SharedPreferences:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    // Check which request we're responding to
    if (requestCode == PICK_ACCOUNT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            String usr = data.getStringExtra("username");
            String mail = data.getStringExtra("email");

            SharedPreferences usrData = getSharedPreferences(usr_loggedin, MODE_PRIVATE);
            SharedPreferences.Editor editor = usrData.edit();
            editor.clear();
            editor.putBoolean("usraccount",true).commit();
            editor.putString("username",usr).commit();
            editor.putString("email",mail).commit();

            dataList.remove(0);
            dataList.add(0,new DrawerItem(usr,mail,AVATARresID));
            mAdapter.notifyItemChanged(0);
        }
    }
}

MainActivity , , , SharedPreferences:

//...
String NAME,EMAIL; int AVATARresID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...

    //Initializing
    SharedPreferences usrData = getSharedPreferences(usr_loggedin, MODE_PRIVATE);
    AVATARresID = R.mipmap.aka;
    // Add Drawer Item to dataList
    dataList = new ArrayList<>();
    dataList = prepareDatalist(dataList, NAME, EMAIL, AVATARresID);

    mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
    mRecyclerView.setHasFixedSize(true);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    mAdapter = new MyAdapter(dataList, mSelectedPositions);

    if(usrData.contains("usraccount")){
        String usr,mail;
        usr = usrData.getString("username",usr_loggedin);
        mail = usrData.getString("email",usr_loggedin);
        dataList.remove(0);
        dataList.add(0,new DrawerItem(usr,mail,AVATARresID));
        mAdapter.notifyItemChanged(0);
    }

    mRecyclerView.setAdapter(mAdapter);
    //... ...
}

, , ( ), onActivityResult() MainActivity onCreate() onActivityResult().

SharedPreferences, . , , SharedPreferences , , onCreate , RecyclerView.Adapter , SharedPreferences .

MainActivity mAdapter.notifyItemChanged(0), .

, onCreate() MainActivity SharedPreferences(), - .

+3

, - , DrawerLayout? , - TextViews EditTexts , .setText(NAME)/.setText(EMAIL)? .:)

+1

, . , .

, ,

public interface ChangeListener {
     void displayNameAndEmail(String name, String email );
}

.

@Override 
private void displayNameAndEmail(String name, String email ) {
      mEmailTextView.setText(email);
      mNameTextView.setText(name);
};

onActivityResult()

ChangeListener.displayNameAndEmail(name, email );
+1
source

Source: https://habr.com/ru/post/1583790/


All Articles