Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - vicpinm/PresenterAdapter · GitHub
Skip to content

Repository files navigation

PresenterAdapter

A lighweight Android library to implement adapters for your RecyclerViews in a clean way, using the MVP pattern.

Features

  • Avoid writing adapter classes, you only has to focus in view clases and their presenters, following the MVP pattern.
  • View representation and view logic decoupled from adapter framework classes.
  • Easy creation of different kinds of views for the same RecyclerView.
  • Avoid create new presenters for each row, presenter instances are recycled in the same way that adapter does with ViewHolder clases.
  • Lifecycle callbacks in presenter clases. You can control view creation and destroy for each RecyclerView position. Presenters are notified when they are destroyed to perform clear and unsubscribe operations if needed.
  • Custom presenter creation. You are responsible for creating presenter instance the same way yo usually do in your Activities or Fragments, which allows you to use tools like Dagger to inject your dependencies (see description below for details).

Download

Grab via Gradle:

repositories {
mavenCentral()
}
compile 'com.github.vicpinm:presenteradapter:1.5.7'

Usage

Single view type adapter

For adapters with a unique kind of view, there is no need to create any adapter class. SimplePresenterAdapter is provided for this kind of lists.

Adapter creation sample for a list of countries.

Extracted from the sample, CountryView.java is the class which implements the view layer for each adapter position, the same way Activities or Fragment does. Data setter is optional and can be setted in any moment later.

 PresenterAdapter<Country> adapter = SimplePresenterAdapter.with(CountryView.class)
.setLayout(R.layout.adapter_country)
.setData(data);

View class

Your view class inherits from ViewHolder class. This class is responsible for implementing the view layer in MPV pattern, equivalent to Activities or Fragments, and creating a presenter instance.

public class CountryView extends ViewHolder<Country> implements CountryPresenter.View {
private CountryPresenter mPresenter;
@BindView(R.id.countryName)
TextView mCountryName;
public CountryView(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@Override
public void createPresenter() {
mPresenter = new CountryPresenter();
}
@Override
public ViewHolderPresenter getPresenter() {
return mPresenter;
}
@Override
public void setCountryName(String text) {
mCountryName.setText(text);
}

}

Presenter class

Class responsible for implementing the presenter layer in MPV pattern, equivalent to any other presenter. It inherits from ViewHolderPresenter<Data, PresenterView> class. This class is generic and you need to indicate two types, your adapter data type ( in the sample) and your presenter view interface. You have to override onCreate method to setup your view. Also, you can override onDestroy method if you need to implement any destroy logic for your view. Inside your presenter class, you have access to getData() method, in order to get the current data instance for the view, obtained from the adapter data collection. Also, inside your presenter class, you have access to getView() method, in order to interact with your view class.

public class CountryPresenter extends ViewHolderPresenter<Country, CountryPresenter.View> {
@Override
public void onCreate() {
setCountryName();
}
public void setCountryName(){
getView().setCountryName(getData().getName());
}
public interface View {
void setCountryName(String s);
}
}

Multiple view type adapter

It is very easy to implement multiple view types in for your RecyclerView. Instead of use SimpleAdapterPresenter, you have to implement your own adapter, in order to implement your representation logic. Your adapter class must extends from PresenterAdapter class. PresenterAdapter class has only one abstract method you have to implement, getViewInfo(int position) method. This method returns an instance of ViewInfo class, which holds an association between your view class and your layour resource for a given position.

Example of different types of views based on item position, using the same view class and differents layouts:
public class MultipleAdapter extends PresenterAdapter<Country> {
@Override public ViewInfo getViewInfo(int position) {
if(position % 2 == 0)
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_even);
else
return ViewInfo.with(CountryView.class).setLayout(R.layout.adapter_country_odd);
}

}

Example of different types of views based on item properties, using diferent view clases and layouts:

public class MultipleAdapter extends PresenterAdapter {

@Override public ViewInfo getViewInfo(int position) {
if((getItem(position).isFavourite())
return ViewInfo.with(FavouriteItemView.class).setLayout(R.layout.adapter_favourite_item);
else
return ViewInfo.with(NormalItemView.class).setLayout(R.layout.adapter_normal_item);
}

Event listeners

Click and long click listeners methods are provided to be notified when users interacts with your views. Also, you can set a custom object listener to be manually invoked from your view class when you want. See sample for details.

Proguard

-keepclassmembers public class * extends com.vicpin.presenteradapter.ViewHolder {
public <init>(...);
}

Author

Víctor Manuel Pineda Murcia | http://vicpinm.github.io/PresenterAdapter/

About

No description, website, or topics provided.

Resources

Stars

12 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages