Skip to content

Instantly share code, notes, and snippets.

@coffeearmy
Last active August 29, 2015 14:01
Show Gist options
  • Save coffeearmy/741330edeff869bc4857 to your computer and use it in GitHub Desktop.
Save coffeearmy/741330edeff869bc4857 to your computer and use it in GitHub Desktop.
Android List. with LoaderCallback, Adapter and OTTO events bus, ImageLoader
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.squareup.otto.Subscribe;
public class ItemListFragment extends Fragment implements LoaderCallbacks<List<Item>>{
private static final int LOADER_ITEM_ID = 0;
private ListView mLstItem;
private ArrayList<Item> mItemList;
private ListItemAdapter mAdapterList;
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
OttoBusHelper.getCurrentBus().register(this);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View lstLayout = inflater.inflate(R.layout.list_layout,
null);
mLstElect = (ListView) lstLayout
.findViewById(R.id.lstView);
mItemList = new ArrayList<Item>();
mAdapterList = new ListAdapter(getActivity(),
R.layout.list_item, mItemList);
mLstElect.setAdapter(mAdapterList);
getLoaderManager().initLoader(LOADER_ELECT_ID, null, this).forceLoad();
return lstLayout;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_addItem:
showNewElectrodomesticoDialog();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private void showNewElectrodomesticoDialog() {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
NuevoItemDialog newFragment= NuevoItemDialog.newInstance(0);
newFragment.show(ft, NuevoItemDialog.FRAGMENT_TAG);
}
@Subscribe
public void updateResultsInUi(OnFinishAddItem event) {
ITtem electItem=event.getItem();
ItemHandlerImpl.getInstance(getActivity()).insertItem(electItem);
listChanged(electItem);
}
private void listChanged(Item item) {
mItemList.add(item);
mAdapterList.notifyDataSetChanged();
//getLoaderManager().initLoader(LOADER_ITEM_ID, null, this).forceLoad();
}
/*
* Loader Callbaks
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, android.os.Bundle)
*/
@Override
public Loader<List<Item>> onCreateLoader(int arg0, Bundle arg1) {
return new ItemLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<List< Item >> arg0,
List<Electrodomesticos> arg1) {
mAdapterList.changeDataSet((ArrayList< Item >) arg1);
}
@Override
public void onLoaderReset(Loader<List< Item >> arg0) {
mAdapterList.changeDataSet(new ArrayList< Item >());
}
}
import java.util.List;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
public class ItemLoader extends AsyncTaskLoader<List<Item>> {
private Context mContext;
private int mId;
public OperationLoader(Context context,int id) {
super(context);
mId =id;
}
@Override
public List<Item> loadInBackground() {
return OperationHandler.getInstance(mContext).getItemsFromID(mId);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_margin="8dp"
android:src="@android:drawable/ic_menu_camera" />
<TextView
android:id="@+id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/img"
android:layout_marginLeft="14dp"
android:layout_toRightOf="@+id/img"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/txt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/txt1"
android:layout_below="@+id/txt1"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/txt3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/txt2"
android:layout_alignBottom="@+id/txt2"
android:layout_marginLeft="8dp"
android:layout_toRightOf="@+id/txt2"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
public class ListItemAdapter extends ArrayAdapter<Item> {
// ViewHolder pattern
static class ViewHolder {
public TextView nameElect;
public TextView potencia;
public TextView duracion;
public ImageView icon;
}
private Context mContext;
private ArrayList<Item> mItemList;
private int mItemLayout;
private ImageLoader mImageLoader;
public ListElectAdapter(Context context, int resource,
ArrayList<Item> mItemList) {
super(context, resource, mItemList);
this.mContext = context;
this.mItemList = mItemList;
this.mItemLayout = resource;
this.mImageLoader=ImageLoader.getInstance();
mImageLoader=ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher)
.showImageForEmptyUri(R.drawable.ic_launcher)
.cacheOnDisc()
.cacheInMemory()
.build();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// If the convertview is null needs to be inflated, if not null it can
// be reuse it
if (rowView == null) {
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
rowView = inflater.inflate(R.layout.list_item, null);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.nameElect = (TextView) rowView
.findViewById(R.id.txt1);
viewHolder.icon = (ImageView) rowView
.findViewById(R.id.imgLstElect);
viewHolder.potencia = (TextView) rowView
.findViewById(R.id.txt2);
viewHolder.duracion = (TextView) rowView
.findViewById(R.id.txt3);
// Store the viewHolder in the tag of the view
rowView.setTag(viewHolder);
}
// fill data
ViewHolder holder = (ViewHolder) rowView.getTag();
Item item = mItemList.get(position);
holder.nameElect.setText(item.get1());
holder.potencia.setText(item.get2()+"");
holder.duracion.setText(item.get3()+"");
// Load image, decode it to Bitmap and display Bitmap in ImageView (or
// any other view which implements ImageAware interface)
//Using universal-imager-loader lib
if(item.getFoto()!=null&&! item.getFoto().equals("")){
holder.icon.setVisibility(View.VISIBLE);
mImageLoader.displayImage(item.getFoto(), holder.icon,options);
}else{
holder.icon.setVisibility(View.GONE);
}
return rowView;
}
public void changeDataSet(ArrayList<Item> arrayList) {
mItemList.clear();
mItemList.addAll(arrayList);
notifyDataSetChanged();
}
}
import java.io.File;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import android.app.Application;
import android.graphics.Bitmap.CompressFormat;
import android.os.AsyncTask;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Create global configuration and initialize ImageLoader with this
// configuration
File cacheDir = StorageUtils.getCacheDirectory(getBaseContext());
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getBaseContext())
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
.taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR)
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // default
.memoryCacheSize(2 * 1024 * 1024)
.discCache(new UnlimitedDiscCache(cacheDir)) // default
.discCacheSize(50 * 1024 * 1024)
.discCacheFileCount(100)
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(getBaseContext())) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.build();
ImageLoader.getInstance().init(config);
}
}
//Oncreate
...
if(savedInstanceState!=null){
restoreState(savedInstanceState);
}
...
/** Save the last viewed position of the list */
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(Constant.OVERVIEW_ITEM_LIST_SAVE,
mListOverview.getFirstVisiblePosition());
}
private void restoreState(Bundle savedInstanceState) {
int selectedItem = savedInstanceState
.getInt(Constant.OVERVIEW_ITEM_LIST_SAVE);
mListOverview.smoothScrollToPosition(selectedItem);
mListOverview.setSelection(selectedItem);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment