SlideShare a Scribd company logo
1 of 146
Campus-Guest
Techiteasy
Loaders and Adapters
#6
Android Academy TLV
11/12/2016
Yossi Segev
Yossi Segev
Crave
Android Academy
Jonathan Yarkoni
Android Developer & Advocate
Ironsource
Android Academy Staff
Yonatan Levin
Google Developer Expert &
Android @ Gett
Britt Barak
Android Lead
Figure8
Yossi Segev
Android Developer
Crave
~ 2000 members Largest Android Active Community
What Do We Do?
●Android Fundamentals
●Android UI / UX
●Community Hackathon
●Android Performance
●Mentors Program
Community Mentors
Betzalel Silver
Today’s agenda
● Part 1: Loaders
○ What are they?
○ Why do we need them?
○ How do we use them?
● Part 2: Adapters
○ View recycling
○ ViewHolder
○ ArrayAdapter
○ CursorAdapter
Code.
Lots of it.
Part 1:
Loaders
Android Main/UI Thread
1.Code runs on the main thread (UI thread).
Android Main/UI Thread
1. Code runs on the main thread (UI thread).
2.Statements are executed in sequence.
Android Main/UI Thread
1. Code runs on the main thread (UI thread).
2. Statements are executed in sequence.
3.Long operation will block the UI thread.
Android Main/UI Thread
1. Code runs on the main thread (UI thread).
2. Statements are executed in sequence.
3. Long operation will block the UI thread.
4.Perform long operation off the UI thread.
Use AsyncTask ?
AsyncTask
✓ Performs background operations off the UI thread.
doInBackground()
@Override
protected String doInBackground(String... params) {
// This code is running on a background thread.
if (!TextUtils.isEmpty(params[0])) {
return "Hello AsyncTask " + params[0];
}
return null;
}
AsyncTask
✓ Performs background operations off the UI thread.
✓ Returns results on the UI thread.
onPostExecute()
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// We're back on the UI thread so we can update the UI from here.
if (!TextUtils.isEmpty(result)) {
mTextView.setText(result);
}
}
AsyncTask
✓ Performs background operations off the UI thread.
✓ Returns results on the UI thread.
✓ Save time.
AsyncTask = Awesome
But there’s a problem…
The AsyncTask
Experiment
Experiment
onCreate() execute()
doInBackground()
Count to 3
.
.
.
onPostExecute()
Activity AsyncTask
Experiment - Logger
public class Logger {
public static void logWithThread(String tag, String message) {
Log.d(tag,
"T:"
+ Thread.currentThread().getId()
+ " | "
+ message);
}
}
D/LogTag: T:1 | The log message.
Experiment - AsyncTask
@Override
protected Void doInBackground(Void... params) {
for (int i = 1 ; i < 4 ; i ++) {
Logger.logWithThread(TAG, "doInBackground: " + i);
try {
Thread.sleep(1000); // Simulates long operation
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
Experiment - AsyncTask
public SimpleAsyncTask() {
Logger.logWithThread(TAG, "SimpleAsyncTask created.");
}
// ...
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Logger.logWithThread(TAG, "onPostExecute()");
}
Experiment - Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Logger.logWithThread(TAG, "onCreate()");
setContentView(R.layout.activity_async_task);
// Creating a new AsyncTask
SimpleAsyncTask simpleAsyncTask = new SimpleAsyncTask();
simpleAsyncTask.execute();
}
Experiment - Activity
@Override
protected void onDestroy() {
super.onDestroy();
Logger.logWithThread(TAG, "onDestroy()");
}
Test #1
Test log #1
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:132 | doInBackground: 1
D/AsyncTask: T:132 | doInBackground: 2
D/AsyncTask: T:132 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Test log #1
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:132 | doInBackground: 1
D/AsyncTask: T:132 | doInBackground: 2
D/AsyncTask: T:132 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Activity lifecycle
Test log #1
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:132 | doInBackground: 1
D/AsyncTask: T:132 | doInBackground: 2
D/AsyncTask: T:132 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Activity lifecycle
AsyncTask
Test #1 results
Test #2
Test log #2
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 1
D/AsyncTask: T:136 | doInBackground: 2
D/Activity: T:1 | onDestroy()
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 3
D/AsyncTask: T:137 | doInBackground: 1
D/AsyncTask: T:1 | onPostExecute()
D/AsyncTask: T:137 | doInBackground: 2
D/AsyncTask: T:137 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Test log #2
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 1
D/AsyncTask: T:136 | doInBackground: 2
D/Activity: T:1 | onDestroy()
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 3
D/AsyncTask: T:137 | doInBackground: 1
D/AsyncTask: T:1 | onPostExecute()
D/AsyncTask: T:137 | doInBackground: 2
D/AsyncTask: T:137 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Activity lifecycle
AsyncTask
Test log #2
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 1
D/AsyncTask: T:136 | doInBackground: 2
D/Activity: T:1 | onDestroy()
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 3
D/AsyncTask: T:137 | doInBackground: 1
D/AsyncTask: T:1 | onPostExecute()
D/AsyncTask: T:137 | doInBackground: 2
D/AsyncTask: T:137 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Activity lifecycle
AsyncTask
Test log #2
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 1
D/AsyncTask: T:136 | doInBackground: 2
D/Activity: T:1 | onDestroy()
D/Activity: T:1 | onCreate()
D/AsyncTask: T:1 | SimpleAsyncTask created.
D/AsyncTask: T:136 | doInBackground: 3
D/AsyncTask: T:137 | doInBackground: 1
D/AsyncTask: T:1 | onPostExecute()
D/AsyncTask: T:137 | doInBackground: 2
D/AsyncTask: T:137 | doInBackground: 3
D/AsyncTask: T:1 | onPostExecute()
Activity lifecycle
AsyncTask
AsyncTask #2
✘ No coordination with Activity lifecycle.
✘ Multiple AsyncTasks.
✘ onPostExecute() has no effect.
Test #2 results
Introducing:
Loaders
Loaders
● Loading data asynchronously.
● Coordinating with Activity lifecycle.
● Surviving configuration changes.
● Observing the data source for changes.
Loaders - Where?
Available to every Activity.
First introduced in Android 3.0 (Honeycomb, API 11).
Part of the v4 support library (Compatibility Library).
so,
How Loaders work?
Loader
Loader
Doing background work
● Loading data asynchronously.
● Can monitor the data source.
LoaderCallbacks
LoaderCallBacks
Notify on Loader events
Events:
● New Loader is needed.
● Data is ready.
● Loader is about to reset.
LoaderManager
● Monitor Activity lifecycle.
● Manage Loaders:
➢ Start / Stop / Reset / Retrain
(Activity lifecycle / direct request)
● Invoke LoaderCallBacks.
LoaderManager
Monitor Activity
Manage Loaders
Notify LoaderCallBacks
How Loaders work
Loader
Doing background work
LoaderCallBacks
Notify on Loader events
LoaderManager
Monitor Activity
Manage Loaders
Notify LoaderCallBacks
Create
Let’s create a Loader.
Creating a Loader
Loader<D>
The base class of all Loaders.
AsyncTaskLoader<D>
Subclass of Loader<D>, uses AsyncTask to do its
work in the background.
CursorLoader<D>
Subclass of AsyncTaskLoader<Cursor>, built to
query ContentProviders and monitor their data.
Creating a Loader
1. Create class that extends AsyncTaskLoader<String>.
1. Implement loadInBackground().
2. Override deliverResult().
1. Override onStartLoading().
SimpleLoader.java
public class SimpleLoader extends AsyncTaskLoader<String> {
public SimpleLoader(Context context) {
super(context);
}
}
Creating a Loader
1. Create class that extends AsyncTaskLoader<String>.
1. Implement loadInBackground().
2. Override deliverResult().
1. Override onStartLoading().
SimpleLoader.java
@Override
public String loadInBackground() {
// Simulate long operation
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Return data
return "I'm a data string.";
}
Creating a Loader
1. Create class that extends AsyncTaskLoader<String>.
1. Implement loadInBackground().
2. Override deliverResult().
1. Override onStartLoading().
SimpleLoader.java
private String mCache;
// ...
@Override
public void deliverResult(String data) {
mCache = data;
super.deliverResult(data);
}
Creating a Loader
1. Create class that extends AsyncTaskLoader<String>.
1. Implement loadInBackground().
2. Override deliverResult().
1. Override onStartLoading().
SimpleLoader.java
private String mCache;
// ...
@Override
protected void onStartLoading() {
super.onStartLoading();
if (TextUtils.isEmpty(mCache)) {
forceLoad();
} else {
deliverResult(mCache);
}
}
We have a Loader...
Now preparing our Activity
Preparing our Activity
1. Implement a LoaderCallbacks<String> interface.
2. Create Loader unique ID.
3. Initialize our Loader.
MyActivity.java
public class MyActivity extends Activity implements
LoaderManager.LoaderCallbacks<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myactivity);
mTextView = (TextView) findViewById(R.id.text_view);
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
showLoadingIndicator();
//todo init loader
}
LoaderCallbacks
LoaderCallBacks
Notify on Loader events
Events:
● New Loader is needed.
● Loader data is ready.
● Loader is about to reset.
LoaderCallbacks<String>
New Loader is needed
onCreateLoader(int id, Bundle args)
Loader unique ID Optional Bundle
MyActivity.java
// ...
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
return new SimpleLoader(this);
}
LoaderCallbacks
LoaderCallBacks
Notify on Loader events
Events:
● New Loader is needed.
● Loader data is ready.
● Loader is about to reset.
LoaderCallbacks<String>
Loader data is ready
onLoadFinished(Loader<String> loader, String data)
Finished Loader. Returned data
Check Loader ID:
loader.getId()
MyActivity.java
// ...
@Override
public void onLoadFinished(Loader<String> loader, String data) {
if (!TextUtils.isEmpty(data)) {
showData(data);
}
}
LoaderCallbacks
LoaderCallBacks
Notify on Loader events
Events:
● New Loader is needed.
● Loader data is ready.
● Loader is about to reset.
LoaderCallbacks<String>
Loader is about to reset
onLoaderReset(Loader<String> loader)
Check Loader ID:
loader.getId()
MyActivity.java
// ...
@Override
public void onLoaderReset(Loader<String> loader) {
// Our chance to clear data, reset UI etc...
}
Preparing our Activity
1. Implement a LoaderCallbacks<String> interface.
2. Create Loader unique ID.
3. Initialize our Loader.
Create Loader unique ID
Used to identify the Loader by LoaderManager and the Activity.
private static final int SIMPLE_LOADER_ID = 100;
Preparing our Activity
1. Implement a LoaderCallbacks<String> interface.
2. Create Loader unique ID.
3. Initialize our Loader.
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Getting a reference to the Activity LoaderManager
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Instruct LoaderManager to initialize the Loader
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Unique Loader ID to init
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Optional Bundle
Can be used for Loader creation
Init Loader
getLoaderManager().initLoader(LOADER_ID, args, LoaderCallbacks);
Interface to report on Loader state changes
MyActivity.java
public class MyActivity extends Activity implements
LoaderManager.LoaderCallbacks<String> {
private static final int SIMPLE_LOADER_ID = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myactivity);
mTextView = (TextView) findViewById(R.id.text_view);
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
showLoadingIndicator();
getLoaderManager().initLoader(SIMPLE_LOADER_ID, null, this);
}
initLoader()
LoaderManager
initLoader(LOADER_ID, args, LoaderCallbacks);
No.
onCreateLoader(int id, Bundle
args)
Use the existing Loader
Yes.
Init new Loader
LoaderManager
Init new Loader
LoaderManager
onCreateLoader(int id, Bundle args)
Init new Loader
LoaderManager
onStartLoading()
loadInBackground()
deliverResult(D data)
Init new Loader
LoaderManager
onLoadFinished(Loader<D> loader, D data)
initLoader()
LoaderManager
initLoader(LOADER_ID, args, LoaderCallbacks);
No.
onCreateLoader(int id, Bundle
args)
Use the existing Loader
Yes.
Use existing Loader
deliverResult(D data)
Loader state ?
onLoadFinished(Loader<D> loader, D data)
Remember
● initLoader() - when ready to receive data.
● Need fresh data? Call restartLoader().
Loader vs AsyncTask
Loader vs AsyncTask
Let’s talk about the CursorLoader
CursorLoader
Subclass of AsyncTaskLoader<Cursor>.
Queries ContentProviders.
Monitor data changes using ContentObserver.
Returns a Cursor.
CursorLoader #1
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(this);
loader.setUri(ContactsContract.Contacts.CONTENT_URI);
return loader;
}
CursorLoader #2
// …
Bundle args = new Bundle();
args.putString(ARGS_SEARCH_QUERY, “Yossi”);
getLoaderManager().initLoader(CONTACTS_LOADER_ID, args, this);
CursorLoader #2
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String searchQuery = args.getString(ARGS_SEARCH_QUERY);
String selection = ContactsContract.Contacts.DISPLAY_NAME + " = ?";
String[] selectionArgs = { searchQuery };
return new CursorLoader(
this, // Context
ContactsContract.Contacts.CONTENT_URI, // Table
null, // Projections
selection, // Selection
selectionArgs, // Selection args
null); // Sort order
}
Questions?
Part 2:
Adapters
Adapter
A “bridge” between an AdapterView and it’s underlying data.
Has access to the data items.
Building a View for each item.
Adapter
Data set
ListView (AdapterView)
Adapter
Position Position
Data View
Adapter
Adapter interface
BaseAdapter
Base class of common implementation
for an Adapter
ArrayAdapter<T>
Uses array as a data source
CursorAdapter
Uses Cursor as a data source
Sunshine app ArrayAdapter
// The ArrayAdapter will take data from a source and
// use it to populate the ListView it's attached to.
mForecastAdapter =
new ArrayAdapter<String>(
getActivity(), // The current context (this activity)
R.layout.list_item_forecast, // The name of the layout ID.
R.id.list_item_forecast_textview, // The ID of the textview to populate.
new ArrayList<String>());
Building a custom ArrayAdapter
Custom ArrayAdapter
1. Define the data model.
2. Create a custom XML layout.
3. Create UsersAdapter class.
4. Override getView().
5. Tweak for performance
User.java
public class User {
private String mFullName;
private String mPhoneNumber;
public User(String fullName, String phoneNumber) {
mFullName = fullName;
mPhoneNumber = phoneNumber;
}
public String getFullName() { return mFullName; }
public String getPhoneNumber() { return mPhoneNumber; }
}
Custom ArrayAdapter
1. Define the data model.
2. Create a custom XML layout.
3. Create UsersAdapter class.
4. Override getView().
5. Tweak for performance
XML layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/users_adapter_row_fullname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
tools:text="Full Name"/>
<TextView
android:id="@+id/users_adapter_row_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
tools:text="123-4567"/>
</LinearLayout>
Custom ArrayAdapter
1. Define the data model.
2. Create a custom XML layout.
3. Create UsersAdapter class.
4. Override getView().
5. Tweak for performance
UsersAdapter.java
public class UsersAdapter extends ArrayAdapter<User> {
public UsersAdapter(Context context, User[] users) {
// We'll Override getView()
// layout res can be 0.
super(context, 0, users);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
//todo implement this method
}
Custom ArrayAdapter
1. Define the data model.
2. Create a custom XML layout.
3. Create UsersAdapter class.
4. Override getView().
5. Tweak for performance
getView()
Called for every AdapterView position.
getView(int position, View convertView, ViewGroup parent)
getView()
Called for every AdapterView position.
Convert data into a View.
getView(int position, View convertView, ViewGroup parent)
getView()
Called for every AdapterView position.
Convert data into a View.
Reference to current position.
getView(int position, View convertView, ViewGroup parent)
getView()
Called for every AdapterView position.
Convert data into a View.
Reference to current position.
Has access to recycled views.
getView(int position, View convertView, ViewGroup parent)
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
}
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
}
Get data object by position
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
}
Inflate XML (only if needed)
View recycling
getView(int position, View convertView, ViewGroup parent)
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
}
Reference layout Views
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
fullName.setText(user.getFullName());
phoneNumber.setText(user.getPhoneNumber());
}
Bind data to Views
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
fullName.setText(user.getFullName());
phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
Return View
Custom ArrayAdapter
1. Define the data model.
2. Create a custom XML layout.
3. Create UsersAdapter class.
4. Override getView().
5. Tweak for performance
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
fullName.setText(user.getFullName());
phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
fullName.setText(user.getFullName());
phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
TextView fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
TextView phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
fullName.setText(user.getFullName());
phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
ViewHolder
Hold references to the Views
Skip findViewById()
ViewHolder
public class UsersAdapter extends ArrayAdapter<User> {
// ...
private static class ViewHolder {
TextView fullName;
TextView phoneNumber;
}
}
ViewHolder
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
ViewHolder
ViewHolder vh;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
}
ViewHolder
ViewHolder vh;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
vh = new ViewHolder();
vh.fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
vh.phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
}
ViewHolder
ViewHolder vh;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
vh = new ViewHolder();
vh.fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
vh.phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
convertView.setTag(vh);
}
ViewHolder
ViewHolder vh;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
vh = new ViewHolder();
vh.fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
vh.phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
ViewHolder
// ...
vh.fullName.setText(user.getFullName());
vh.phoneNumber.setText(user.getPhoneNumber());
getView() with ViewHolder
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User user = getItem(position);
ViewHolder vh;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.users_adapter_row, parent, false);
vh = new ViewHolder(); // Create a new ViewHolder
vh.fullName = (TextView) convertView.findViewById(R.id.users_adapter_row_fullname);
vh.phoneNumber = (TextView) convertView.findViewById(R.id.users_adapter_row_phone);
convertView.setTag(vh); // Store it as a tag
} else {
vh = (ViewHolder) convertView.getTag(); // use the ViewHolder
}
vh.fullName.setText(user.getFullName());
vh.phoneNumber.setText(user.getPhoneNumber());
return convertView;
}
Questions?
CursorAdapter
CursorAdapter
1. Subclass of the abstract BaseAdapter class.
2. Using a Cursor as a data source.
3.getView() is mostly implemented.
CursorAdapter source code
public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}
CursorAdapter source code
public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}
CursorAdapter
1.newView():
Used to inflate a new view and return it.
2.bindView():
Get Cursor Extract data Bind data to View.
CursorAdapter
public class ContactCursorAdapter extends CursorAdapter {
public ContactCursorAdapter(Context context, Cursor c,
boolean autoRequery) {
super(context, c, autoRequery);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// Inflate new view
return LayoutInflater.from(context)
.inflate(R.layout.contacts_adapter_row, parent, false);
}
// ...
}
CursorAdapter
@Override
public void bindView(View view, Context context, Cursor cursor) {
int idx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
TextView displayName =
(TextView) view.findViewById(R.id.contacts_adapter_row_displayName);
// Get cursor + extract data
String name = cursor.getString(idx);
// Bind data to the view
displayName.setText(name);
}
CursorAdapter + ViewHolder
CursorAdapter + ViewHolder
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// Inflate new view
View view = LayoutInflater.from(context)
.inflate(R.layout.contacts_adapter_row, parent, false);
// Create a new view holder
ViewHolder vh = new ViewHolder();
vh.displayName = (TextView) view.findViewById(R.id.contacts_adapter_row_displayName);
// Save as tag
view.setTag(vh);
return view;
}
CursorAdapter + ViewHolder
@Override
public void bindView(View view, Context context, Cursor cursor) {
int idx = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
// Get the view holder from the view tag
ViewHolder vh = (ViewHolder) view.getTag();
// Get cursor + extract data
String name = cursor.getString(idx);
// Bind data to the view
vh.displayName.setText(name);
What we didn’t cover today
Multiple layouts
RecyclerView
Questions?
Thank you

More Related Content

What's hot

Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Fabio Collini
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKFabio Collini
 
Entity Component System - for App developers
Entity Component System - for App developersEntity Component System - for App developers
Entity Component System - for App developersMaxim Zaks
 
Groovy And Grails JUG Padova
Groovy And Grails JUG PadovaGroovy And Grails JUG Padova
Groovy And Grails JUG PadovaJohn Leach
 
Making Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMMaking Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMRafael Winterhalter
 
Android programming -_pushing_the_limits
Android programming -_pushing_the_limitsAndroid programming -_pushing_the_limits
Android programming -_pushing_the_limitsDroidcon Berlin
 
Java 8 and beyond, a scala story
Java 8 and beyond, a scala storyJava 8 and beyond, a scala story
Java 8 and beyond, a scala storyittaiz
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQLRoberto Franchini
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDanny Preussler
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.JustSystems Corporation
 
Groovy And Grails JUG Trento
Groovy And Grails JUG TrentoGroovy And Grails JUG Trento
Groovy And Grails JUG TrentoJohn Leach
 
Escape from Mars
Escape from MarsEscape from Mars
Escape from MarsJorge Ortiz
 
13multithreaded Programming
13multithreaded Programming13multithreaded Programming
13multithreaded ProgrammingAdil Jafri
 
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaTesting Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaFabio Collini
 
«Продакшн в Kotlin DSL» Сергей Рыбалкин
«Продакшн в Kotlin DSL» Сергей Рыбалкин«Продакшн в Kotlin DSL» Сергей Рыбалкин
«Продакшн в Kotlin DSL» Сергей РыбалкинMail.ru Group
 

What's hot (20)

Completable future
Completable futureCompletable future
Completable future
 
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
 
Code Samples
Code SamplesCode Samples
Code Samples
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UK
 
Entity Component System - for App developers
Entity Component System - for App developersEntity Component System - for App developers
Entity Component System - for App developers
 
Groovy And Grails JUG Padova
Groovy And Grails JUG PadovaGroovy And Grails JUG Padova
Groovy And Grails JUG Padova
 
Making Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMMaking Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVM
 
Android programming -_pushing_the_limits
Android programming -_pushing_the_limitsAndroid programming -_pushing_the_limits
Android programming -_pushing_the_limits
 
Java 8 and beyond, a scala story
Java 8 and beyond, a scala storyJava 8 and beyond, a scala story
Java 8 and beyond, a scala story
 
OrientDB - The 2nd generation of (multi-model) NoSQL
OrientDB - The 2nd generation of  (multi-model) NoSQLOrientDB - The 2nd generation of  (multi-model) NoSQL
OrientDB - The 2nd generation of (multi-model) NoSQL
 
Demystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and ToothpickDemystifying dependency Injection: Dagger and Toothpick
Demystifying dependency Injection: Dagger and Toothpick
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
 
Groovy And Grails JUG Trento
Groovy And Grails JUG TrentoGroovy And Grails JUG Trento
Groovy And Grails JUG Trento
 
Escape from Mars
Escape from MarsEscape from Mars
Escape from Mars
 
Java Concurrency by Example
Java Concurrency by ExampleJava Concurrency by Example
Java Concurrency by Example
 
13multithreaded Programming
13multithreaded Programming13multithreaded Programming
13multithreaded Programming
 
Koin Quickstart
Koin QuickstartKoin Quickstart
Koin Quickstart
 
Mobile AR
Mobile ARMobile AR
Mobile AR
 
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaTesting Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJava
 
«Продакшн в Kotlin DSL» Сергей Рыбалкин
«Продакшн в Kotlin DSL» Сергей Рыбалкин«Продакшн в Kotlin DSL» Сергей Рыбалкин
«Продакшн в Kotlin DSL» Сергей Рыбалкин
 

Viewers also liked

Session #7 rich and responsive layouts
Session #7  rich and responsive layoutsSession #7  rich and responsive layouts
Session #7 rich and responsive layoutsVitali Pekelis
 
Lecture #3 activities and intents
Lecture #3  activities and intentsLecture #3  activities and intents
Lecture #3 activities and intentsVitali Pekelis
 
Session #5 content providers
Session #5  content providersSession #5  content providers
Session #5 content providersVitali Pekelis
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your appVitali Pekelis
 
Lecture #4 activities &amp; fragments
Lecture #4  activities &amp; fragmentsLecture #4  activities &amp; fragments
Lecture #4 activities &amp; fragmentsVitali Pekelis
 
Android pro tips trilogy
Android  pro tips trilogyAndroid  pro tips trilogy
Android pro tips trilogyVitali Pekelis
 
Lecture #1 Creating your first android project
Lecture #1  Creating your first android projectLecture #1  Creating your first android project
Lecture #1 Creating your first android projectVitali Pekelis
 
Android material design lecture #2
Android material design   lecture #2Android material design   lecture #2
Android material design lecture #2Vitali Pekelis
 
Android design lecture #1
Android design   lecture #1Android design   lecture #1
Android design lecture #1Vitali Pekelis
 

Viewers also liked (10)

Session #7 rich and responsive layouts
Session #7  rich and responsive layoutsSession #7  rich and responsive layouts
Session #7 rich and responsive layouts
 
Lecture #3 activities and intents
Lecture #3  activities and intentsLecture #3  activities and intents
Lecture #3 activities and intents
 
Session #5 content providers
Session #5  content providersSession #5  content providers
Session #5 content providers
 
Session #8 adding magic to your app
Session #8  adding magic to your appSession #8  adding magic to your app
Session #8 adding magic to your app
 
Lecture #4 activities &amp; fragments
Lecture #4  activities &amp; fragmentsLecture #4  activities &amp; fragments
Lecture #4 activities &amp; fragments
 
Performance #1 memory
Performance #1   memoryPerformance #1   memory
Performance #1 memory
 
Android pro tips trilogy
Android  pro tips trilogyAndroid  pro tips trilogy
Android pro tips trilogy
 
Lecture #1 Creating your first android project
Lecture #1  Creating your first android projectLecture #1  Creating your first android project
Lecture #1 Creating your first android project
 
Android material design lecture #2
Android material design   lecture #2Android material design   lecture #2
Android material design lecture #2
 
Android design lecture #1
Android design   lecture #1Android design   lecture #1
Android design lecture #1
 

Similar to Session #6 loaders and adapters

Android Loaders : Reloaded
Android Loaders : ReloadedAndroid Loaders : Reloaded
Android Loaders : Reloadedcbeyls
 
Android Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondAndroid Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondRamon Ribeiro Rabello
 
Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Stacy Devino
 
Performance #6 threading
Performance #6  threadingPerformance #6  threading
Performance #6 threadingVitali Pekelis
 
Angular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupAngular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupDavid Barreto
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slidesDavid Barreto
 
Less Verbose ActionScript 3.0 - Write less and do more!
Less Verbose ActionScript 3.0 - Write less and do more!Less Verbose ActionScript 3.0 - Write less and do more!
Less Verbose ActionScript 3.0 - Write less and do more!Arul Kumaran
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemGuardSquare
 
Functional Reactive Programming on Android
Functional Reactive Programming on AndroidFunctional Reactive Programming on Android
Functional Reactive Programming on AndroidSam Lee
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java DevelopersYakov Fain
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time OptimizationKan-Ru Chen
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemGuardSquare
 
Composing an App with Free Monads (using Cats)
Composing an App with Free Monads (using Cats)Composing an App with Free Monads (using Cats)
Composing an App with Free Monads (using Cats)Hermann Hueck
 
Quick Intro to Android Development
Quick Intro to Android DevelopmentQuick Intro to Android Development
Quick Intro to Android DevelopmentJussi Pohjolainen
 
How to become an Android dev starting from iOS (and vice versa)
How to become an Android dev starting from iOS (and vice versa)How to become an Android dev starting from iOS (and vice versa)
How to become an Android dev starting from iOS (and vice versa)Giuseppe Filograno
 
[Droidcon Paris 2013]Multi-Versioning Android Tips
[Droidcon Paris 2013]Multi-Versioning Android Tips[Droidcon Paris 2013]Multi-Versioning Android Tips
[Droidcon Paris 2013]Multi-Versioning Android TipsKenichi Kambara
 

Similar to Session #6 loaders and adapters (20)

Android Loaders : Reloaded
Android Loaders : ReloadedAndroid Loaders : Reloaded
Android Loaders : Reloaded
 
Android Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyondAndroid Jetpack + Coroutines: To infinity and beyond
Android Jetpack + Coroutines: To infinity and beyond
 
Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!
 
Performance #6 threading
Performance #6  threadingPerformance #6  threading
Performance #6 threading
 
Android best practices
Android best practicesAndroid best practices
Android best practices
 
Angular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupAngular Optimization Web Performance Meetup
Angular Optimization Web Performance Meetup
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
 
Less Verbose ActionScript 3.0 - Write less and do more!
Less Verbose ActionScript 3.0 - Write less and do more!Less Verbose ActionScript 3.0 - Write less and do more!
Less Verbose ActionScript 3.0 - Write less and do more!
 
Android classes in mumbai
Android classes in mumbaiAndroid classes in mumbai
Android classes in mumbai
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build system
 
Functional Reactive Programming on Android
Functional Reactive Programming on AndroidFunctional Reactive Programming on Android
Functional Reactive Programming on Android
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java Developers
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build system
 
Composing an App with Free Monads (using Cats)
Composing an App with Free Monads (using Cats)Composing an App with Free Monads (using Cats)
Composing an App with Free Monads (using Cats)
 
Quick Intro to Android Development
Quick Intro to Android DevelopmentQuick Intro to Android Development
Quick Intro to Android Development
 
Kommons
KommonsKommons
Kommons
 
How to become an Android dev starting from iOS (and vice versa)
How to become an Android dev starting from iOS (and vice versa)How to become an Android dev starting from iOS (and vice versa)
How to become an Android dev starting from iOS (and vice versa)
 
Android - Anatomy of android elements & layouts
Android - Anatomy of android elements & layoutsAndroid - Anatomy of android elements & layouts
Android - Anatomy of android elements & layouts
 
[Droidcon Paris 2013]Multi-Versioning Android Tips
[Droidcon Paris 2013]Multi-Versioning Android Tips[Droidcon Paris 2013]Multi-Versioning Android Tips
[Droidcon Paris 2013]Multi-Versioning Android Tips
 

More from Vitali Pekelis

Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940Vitali Pekelis
 
Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019Vitali Pekelis
 
Advanced #6 clean architecture
Advanced #6  clean architectureAdvanced #6  clean architecture
Advanced #6 clean architectureVitali Pekelis
 
Advanced #4 GPU & Animations
Advanced #4   GPU & AnimationsAdvanced #4   GPU & Animations
Advanced #4 GPU & AnimationsVitali Pekelis
 
Advanced #2 networking
Advanced #2   networkingAdvanced #2   networking
Advanced #2 networkingVitali Pekelis
 
Advanced #1 cpu, memory
Advanced #1   cpu, memoryAdvanced #1   cpu, memory
Advanced #1 cpu, memoryVitali Pekelis
 
All the support you need. Support libs in Android
All the support you need. Support libs in AndroidAll the support you need. Support libs in Android
All the support you need. Support libs in AndroidVitali Pekelis
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practicesVitali Pekelis
 
Android design patterns
Android design patternsAndroid design patterns
Android design patternsVitali Pekelis
 
Advanced #3 threading
Advanced #3  threading Advanced #3  threading
Advanced #3 threading Vitali Pekelis
 
Mobile ui fruit or delicious sweets
Mobile ui  fruit or delicious sweetsMobile ui  fruit or delicious sweets
Mobile ui fruit or delicious sweetsVitali Pekelis
 
Lecture #4 c loaders and co.
Lecture #4 c   loaders and co.Lecture #4 c   loaders and co.
Lecture #4 c loaders and co.Vitali Pekelis
 
Session #4 b content providers
Session #4 b  content providersSession #4 b  content providers
Session #4 b content providersVitali Pekelis
 
Advanced #2 - ui perf
 Advanced #2 - ui perf Advanced #2 - ui perf
Advanced #2 - ui perfVitali Pekelis
 
Android design lecture #3
Android design   lecture #3Android design   lecture #3
Android design lecture #3Vitali Pekelis
 

More from Vitali Pekelis (20)

Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940
 
Droidkaigi 2019
Droidkaigi 2019Droidkaigi 2019
Droidkaigi 2019
 
Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019
 
Android Q 2019
Android Q 2019Android Q 2019
Android Q 2019
 
Advanced #6 clean architecture
Advanced #6  clean architectureAdvanced #6  clean architecture
Advanced #6 clean architecture
 
Advanced #4 GPU & Animations
Advanced #4   GPU & AnimationsAdvanced #4   GPU & Animations
Advanced #4 GPU & Animations
 
Advanced #2 networking
Advanced #2   networkingAdvanced #2   networking
Advanced #2 networking
 
Advanced #2 threading
Advanced #2   threadingAdvanced #2   threading
Advanced #2 threading
 
Advanced #1 cpu, memory
Advanced #1   cpu, memoryAdvanced #1   cpu, memory
Advanced #1 cpu, memory
 
All the support you need. Support libs in Android
All the support you need. Support libs in AndroidAll the support you need. Support libs in Android
All the support you need. Support libs in Android
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practices
 
Di &amp; dagger
Di &amp; daggerDi &amp; dagger
Di &amp; dagger
 
Android design patterns
Android design patternsAndroid design patterns
Android design patterns
 
Advanced #3 threading
Advanced #3  threading Advanced #3  threading
Advanced #3 threading
 
Mobile ui fruit or delicious sweets
Mobile ui  fruit or delicious sweetsMobile ui  fruit or delicious sweets
Mobile ui fruit or delicious sweets
 
Lecture #4 c loaders and co.
Lecture #4 c   loaders and co.Lecture #4 c   loaders and co.
Lecture #4 c loaders and co.
 
Session #4 b content providers
Session #4 b  content providersSession #4 b  content providers
Session #4 b content providers
 
Advanced #2 - ui perf
 Advanced #2 - ui perf Advanced #2 - ui perf
Advanced #2 - ui perf
 
Android meetup
Android meetupAndroid meetup
Android meetup
 
Android design lecture #3
Android design   lecture #3Android design   lecture #3
Android design lecture #3
 

Recently uploaded

Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
software engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxsoftware engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxnada99848
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 

Recently uploaded (20)

Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
software engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptxsoftware engineering Chapter 5 System modeling.pptx
software engineering Chapter 5 System modeling.pptx
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 

Session #6 loaders and adapters