Android Open Source - android-blog Blog List Fragment






From Project

Back to project page android-blog.

License

The source code is released under:

MIT License

If you think the Android project android-blog listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.kevinmrohr.android_blog.fragments;
/*from  w  w w .  j ava 2 s .  c  o  m*/
import android.app.Activity;
import android.app.Fragment;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.Views;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import dagger.ObjectGraph;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.json.JSONArray;
import org.kevinmrohr.android_blog.R;
import org.kevinmrohr.android_blog.adapter.BlogListAdapter;
import org.kevinmrohr.android_blog.model.BlogPost;
import org.kevinmrohr.android_blog.module.ObjectMappingModule;

import javax.inject.Inject;
import java.util.*;

import static java.util.Collections.reverseOrder;
import static java.util.Collections.sort;
import static org.kevinmrohr.android_blog.fragments.BlogListFragment.SortColumn.*;

/**
 * User: krohr
 * Date: 10/24/13
 * Time: 12:56 PM
 */
public class BlogListFragment extends Fragment {
  @Inject ObjectMapper mapper;
  @InjectView(R.id.blogposts) ListView blogPostsListView;

  public static final String SORT_COL_KEY = "sortCol";
  public static final String SORT_ASC_KEY = "sortAsc";
  public static final String SELECTED_IDX_KEY = "selectedBlogIndex";
  private RequestQueue mRequestQueue;
  private BlogClickListener listener;

  private static final Map<SortColumn, Comparator<BlogPost>> blogSorters = new HashMap<SortColumn, Comparator<BlogPost>>();
  private boolean sortAsc = true;
  private SortColumn sortCol = DATE;

  private int selectedBlogIndex = 0;
  private List<BlogPost> blogPosts;
  private BlogListAdapter blogListAdapter;

  static {
    blogSorters.put(DATE, new DateComparator());
    blogSorters.put(SUMMARY, new ContentComparator());
    blogSorters.put(TITLE, new TitleComparator());
  }

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.bloglistfrag, container, false);

    ObjectGraph.create(new ObjectMappingModule()).inject(this);
    Views.inject(this, view);

    if (savedInstanceState != null && savedInstanceState.get(SORT_COL_KEY) != null) {
      sortCol = (SortColumn) savedInstanceState.getSerializable(SORT_COL_KEY);
    }
    if (savedInstanceState != null && savedInstanceState.get(SORT_ASC_KEY) != null) {
      sortAsc = savedInstanceState.getBoolean(SORT_ASC_KEY);
    }
    if (savedInstanceState != null && savedInstanceState.get(SELECTED_IDX_KEY) != null) {
      selectedBlogIndex = savedInstanceState.getInt(SELECTED_IDX_KEY);
    }

    //Initiate the Volley request queue
    mRequestQueue = Volley.newRequestQueue(getActivity());

    blogListAdapter = new BlogListAdapter(this.getActivity(), new ArrayList<BlogPost>());
    blogPostsListView.setAdapter(blogListAdapter);

    initBlogListClickListener();
    getBlogPosts();
    return view;
  }

  @Override public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (activity instanceof BlogClickListener) {
      listener = (BlogClickListener) activity;
    } else {
      throw new RuntimeException("activity must be a BlogClickListener!");
    }
  }

  @Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable(SORT_COL_KEY, sortCol);
    outState.putBoolean(SORT_ASC_KEY, sortAsc);
    outState.putInt(SELECTED_IDX_KEY, selectedBlogIndex);
  }

  @Override public void onStop() {
    super.onStop();
    mRequestQueue.cancelAll(this);
  }

  @OnClick(R.id.dateHeading)
  public void sortByDate(View view) {
    sortBlogs(DATE);
  }

  @OnClick(R.id.titleHeading)
  public void sortByTitle(View view) {
    sortBlogs(TITLE);
  }

  @OnClick(R.id.summaryHeading)
  public void sortBySummary() {
    sortBlogs(SUMMARY);
  }

  private void getBlogPosts() {
    mRequestQueue.add(new JsonArrayRequest(getString(R.string.rest_base_url) + "/BlogPosts.json",
        new Response.Listener<JSONArray>() {
          @Override public void onResponse(JSONArray response) {
            try {
              blogPosts = mapper.readValue(response.toString(), new TypeReference<List<BlogPost>>() {});

              sort(blogPosts, sortAsc ? blogSorters.get(sortCol) : reverseOrder(blogSorters.get(sortCol)));
              blogListAdapter.setData(blogPosts);
              if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                blogPostsListView.setSelection(selectedBlogIndex);
                listener.onClick(blogPosts.get(selectedBlogIndex));
              }
            } catch (Exception e) {
              throw new RuntimeException("Failed!", e);
            }
          }
        },
        new Response.ErrorListener() {
          @Override public void onErrorResponse(VolleyError error) {
            Log.e("ListBlogsActivity.onCreate()", "Volley failed to get BlogPosts! " + error.toString());
          }
        }
    ));
  }

  private void initBlogListClickListener() {
    blogPostsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //Position 0 is the header. Don't do anything if that is clicked.
        Log.d("ItemClickListener", view.toString());

        //subtract 1 because the header is the first one, which is not accounted for in the blogPosts list.
        BlogPost bp = blogPosts.get(position);

        listener.onClick(bp);
      }
    });
  }

  public interface BlogClickListener {
    void onClick(BlogPost blogPost);
  }

  private void sortBlogs(SortColumn selectedColumn) {
    if (sortCol == selectedColumn) {
      //reverse the sort
      sortAsc = !sortAsc;
    } else {
      sortCol = selectedColumn;
      sortAsc = true;
    }
    sort(blogPosts, sortAsc ? blogSorters.get(sortCol) : reverseOrder(blogSorters.get(sortCol)));
    blogListAdapter.setData(blogPosts);
  }

  public static enum SortColumn {
    DATE, TITLE, SUMMARY
  }

  static class DateComparator implements Comparator<BlogPost> {
    @Override public int compare(BlogPost lhs, BlogPost rhs) {
      return lhs.date.compareTo(rhs.date);
    }
  }

  static class TitleComparator implements Comparator<BlogPost> {
    @Override public int compare(BlogPost lhs, BlogPost rhs) {
      return lhs.title.compareTo(rhs.title);
    }
  }

  static class ContentComparator implements Comparator<BlogPost> {
    @Override public int compare(BlogPost lhs, BlogPost rhs) {
      return lhs.content.compareTo(rhs.content);
    }
  }
}




Java Source Code List

com.android.volley.AuthFailureError.java
com.android.volley.CacheDispatcher.java
com.android.volley.Cache.java
com.android.volley.DefaultRetryPolicy.java
com.android.volley.ExecutorDelivery.java
com.android.volley.NetworkDispatcher.java
com.android.volley.NetworkError.java
com.android.volley.NetworkResponse.java
com.android.volley.Network.java
com.android.volley.NoConnectionError.java
com.android.volley.ParseError.java
com.android.volley.RequestQueue.java
com.android.volley.Request.java
com.android.volley.ResponseDelivery.java
com.android.volley.Response.java
com.android.volley.RetryPolicy.java
com.android.volley.ServerError.java
com.android.volley.TimeoutError.java
com.android.volley.VolleyError.java
com.android.volley.VolleyLog.java
com.android.volley.toolbox.AndroidAuthenticator.java
com.android.volley.toolbox.Authenticator.java
com.android.volley.toolbox.BasicNetwork.java
com.android.volley.toolbox.ByteArrayPool.java
com.android.volley.toolbox.ClearCacheRequest.java
com.android.volley.toolbox.DiskBasedCache.java
com.android.volley.toolbox.HttpClientStack.java
com.android.volley.toolbox.HttpHeaderParser.java
com.android.volley.toolbox.HttpStack.java
com.android.volley.toolbox.HurlStack.java
com.android.volley.toolbox.ImageLoader.java
com.android.volley.toolbox.ImageRequest.java
com.android.volley.toolbox.JsonArrayRequest.java
com.android.volley.toolbox.JsonObjectRequest.java
com.android.volley.toolbox.JsonRequest.java
com.android.volley.toolbox.NetworkImageView.java
com.android.volley.toolbox.NoCache.java
com.android.volley.toolbox.PoolingByteArrayOutputStream.java
com.android.volley.toolbox.RequestFuture.java
com.android.volley.toolbox.StringRequest.java
com.android.volley.toolbox.Volley.java
org.kevinmrohr.android_blog.activity.BlogViewActivity$$ViewInjector.java
org.kevinmrohr.android_blog.activity.BlogViewActivity.java
org.kevinmrohr.android_blog.activity.ListBlogsActivity$$InjectAdapter.java
org.kevinmrohr.android_blog.activity.ListBlogsActivity$$ViewInjector.java
org.kevinmrohr.android_blog.activity.ListBlogsActivity.java
org.kevinmrohr.android_blog.adapter.BindingAdapter.java
org.kevinmrohr.android_blog.adapter.BlogListAdapter.java
org.kevinmrohr.android_blog.async.BlogPostLoader.java
org.kevinmrohr.android_blog.fragments.BlogDetailFragment.java
org.kevinmrohr.android_blog.fragments.BlogListFragment.java
org.kevinmrohr.android_blog.model.BlogPost.java
org.kevinmrohr.android_blog.module.ListBlogsModule$$ModuleAdapter.java
org.kevinmrohr.android_blog.module.ObjectMappingModule.java
org.kevinmrohr.android_blog.serialization.CustomDateDeserializer.java
org.kevinmrohr.android_blog.serialization.CustomDateSerializer.java
org.kevinmrohr.android_blog.service.BlogPostService.java