Android Open Source - SyncedListView Sync List View Container Fragment






From Project

Back to project page SyncedListView.

License

The source code is released under:

Apache License

If you think the Android project SyncedListView 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

/*
 * Copyright 2013 Wenhui Yao// w  w w .  ja va2 s.co  m
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.wenhui.syncedListView.demo.demo;

import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import com.wenhui.syncedListView.lib.InfiniteListAdapter;
import com.wenhui.syncedListView.lib.SyncedListLayout;

import java.util.HashSet;

public class SyncListViewContainerFragment extends Fragment{
  
    private SyncedListLayout mLayout;
    private MenuItem mAnimMenu;
  private Toast mToast;

  public static SyncListViewContainerFragment newInstance(){
    SyncListViewContainerFragment frag = new SyncListViewContainerFragment();
    return frag;
  }
  
  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mToast = Toast.makeText(getActivity(), "", Toast.LENGTH_SHORT);
        setHasOptionsMenu(true);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    final View root = inflater.inflate(R.layout.sync_list_fragment, null);
        mLayout = (SyncedListLayout)root;
    final ListView lvLeft = (ListView)root.findViewById(R.id.list_view_left);
    final ListView lvRight = (ListView)root.findViewById(R.id.list_view_right);
    int ivHeightLeft = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_left_height);
    int ivHeightRight = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_right_height);

    final ImageAdapter leftAdapter = new ImageAdapter(getActivity(), ivHeightLeft, Images.imageLeftThumbUrls);
    final ImageAdapter rightAdapter = new ImageAdapter(getActivity(), ivHeightRight, Images.imageRightThumbUrls);

        lvLeft.setAdapter(leftAdapter);
        lvRight.setAdapter(rightAdapter);

    lvLeft.setOnItemClickListener(mLeftListClickListener);
    lvRight.setOnItemClickListener(mRightListClickListener);
    
    lvLeft.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      
      @Override
      public void onGlobalLayout() {
        removeGlobalLayoutListenerWrapper(lvLeft.getViewTreeObserver(),this);
                lvLeft.setSelection(200000);
      }
    });
    
    lvRight.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      
      @Override
      public void onGlobalLayout() {
                removeGlobalLayoutListenerWrapper(lvRight.getViewTreeObserver(),this);
                int velocity = getResources().getDimensionPixelSize(R.dimen.animation_velocity);
                lvRight.setSelection(200000);
                mLayout.setAnimationVelocity(velocity);
                mLayout.startAnimation(100l);


      }
    });

    return root;
  }

    private void removeGlobalLayoutListenerWrapper(ViewTreeObserver observer, OnGlobalLayoutListener listener){
        if(Build.VERSION.SDK_INT >= 16 ){
            observer.removeOnGlobalLayoutListener(listener);
        } else {
            observer.removeGlobalOnLayoutListener(listener);
        }
    }

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
  }

    @Override
    public void onResume() {
        super.onResume();
        mLayout.startAnimation(10l);
    }

    @Override
    public void onPause() {
        super.onPause();
        mLayout.stopAnimation();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        String title = (mLayout.isAnimating()) ? "Stop anim" : "Start anim";
        mAnimMenu = menu.add(Menu.NONE, R.id.animation, 0, title);
        if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB  ){
            mAnimMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        }
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch( item.getItemId() ){
            case  R.id.animation:
                if( mLayout.isAnimating() ){
                    mLayout.stopAnimation();
                    mAnimMenu.setTitle("Start anim");
                } else {
                    mLayout.startAnimation(100l);
                    mAnimMenu.setTitle("Stop anim");

                }
                return true;


        }
        return super.onOptionsItemSelected(item);
    }

    private OnItemClickListener mLeftListClickListener = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
        long arg3) {
            position %= Images.imageLeftThumbUrls.length;
      mToast.setText("Left list item " + position  + " click");
      mToast.show();
      
    }
    
  };
  
  private OnItemClickListener mRightListClickListener = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
        long arg3) {
            position %= Images.imageRightThumbUrls.length;
      mToast.setText("Right list item " + position + " click");
      mToast.show();
      
    }
    
  };
  
  private static abstract class ImageBaseAdapter<T> extends InfiniteListAdapter implements
            OnClickListener {

    private T[] mData;
    private Context mContext;
    private android.widget.AbsListView.LayoutParams mImageViewLayoutParams;

    public ImageBaseAdapter(Context context, int imageViewHeight, T[] data) {
      mImageViewLayoutParams = new GridView.LayoutParams(LayoutParams.MATCH_PARENT,
          imageViewHeight);
      mData = data;
      mContext = context;
    }

    @Override
    public int getItemCount() {
      if (mData == null) {
        return 0;
      }
      return mData.length;
    }
    
    @Override
    public long getItemId(int position) {
      return position;
    }

    @Override
    public boolean hasStableIds() {
      return false;
    }

    @Override
    public T getItemAt(int position) {
      if( mData == null ){ return null; }
      return mData[position%mData.length];
    }

    @Override
    public View getItemView(int position, View convertView, ViewGroup parent) {
      ImageView imageView;
      if (convertView == null) { // if it's not recycled, instantiate and
        // initialize
        imageView = new ImageView(mContext);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(mImageViewLayoutParams);
      } else { 
        imageView = (ImageView) convertView;
      }
      
      T photo = getItemAt(position);
      if( photo == null ){
        imageView.setImageDrawable(null);
      } else {
        Picasso.with(mContext).load(getImageUrl(photo)).into(imageView);


      }
      imageView.setTag(photo);
      return imageView;
    }

    protected abstract String getImageUrl(T data);

  }
  
  private class ImageAdapter extends ImageBaseAdapter<String>{

    public ImageAdapter(Context context, int imageViewHeight, String[] data) {
      super(context, imageViewHeight, data);
    }

    @Override
    protected String getImageUrl(String data) {
      return data;
    }

    @Override
    public void onClick(View v) {
      Toast.makeText(getActivity(), v.getTag().toString(), Toast.LENGTH_SHORT).show();
    }
    
  }

}




Java Source Code List

com.wenhui.syncedListView.demo.demo.Images.java
com.wenhui.syncedListView.demo.demo.SyncListViewActivity.java
com.wenhui.syncedListView.demo.demo.SyncListViewContainerFragment.java
com.wenhui.syncedListView.lib.InfiniteListAdapter.java
com.wenhui.syncedListView.lib.SyncedListLayout.java