package com.gnod.geekr.ui.activity; import java.util.ArrayList; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gnod.geekr.R; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.model.StatusModel; import com.gnod.geekr.model.UserInfoModel; import com.gnod.geekr.tool.WeiboBaseTool; import com.gnod.geekr.tool.StringUtils; import com.gnod.geekr.tool.ToastHelper; import com.gnod.geekr.tool.fetcher.BaseFetcher; import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener; import com.gnod.geekr.tool.fetcher.ProfileFetcher; import com.gnod.geekr.tool.manager.DrawableManager; import com.gnod.geekr.tool.manager.Utils; import com.gnod.geekr.weibo.api.RemindAPI.UNREAD_TYPE; import com.gnod.geekr.widget.AvatarView; import com.gnod.geekr.widget.ListViewFooter; public class FriendListActivity extends BaseActivity { private static final int FETCH_COUNT = 30; public static final int TYPE_FOLLOWERS = 0; public static final int TYPE_FOLLOWING = 1; private ListView mListView; private ArrayList<UserInfoModel> mList = new ArrayList<UserInfoModel>(); private ProfileFetcher mFetcher; private DrawableManager mDrawableMgr; private UserInfoModel mUserInfoModel; private boolean isAllLoaded; private int type; private ListViewFooter mFooter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_follow); mFetcher = new ProfileFetcher(); mDrawableMgr = AppConfig.getDrawableManager(); initView(); bindListener(); bindView(); } @Override protected void onResume() { super.onResume(); AppConfig.sImageFetcher.setExitTasksEarly(false); } @Override protected void onPause() { super.onPause(); AppConfig.sImageFetcher.setPauseWork(false); AppConfig.sImageFetcher.setExitTasksEarly(true); AppConfig.sImageFetcher.flushCache(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_follow, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } private void initView() { mListView = (ListView) findViewById(R.id.view_follow_list); mFooter = new ListViewFooter(this); mListView.addFooterView(mFooter); mListView.setAdapter(userAdapter); mFooter.startLoading(); } private void bindListener() { mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { if (position < mList.size()) { Intent intent = new Intent(v.getContext(), ProfileActivity.class); StatusModel item = new StatusModel(); UserInfoModel user = mList.get(position); intent.putExtra("UserInfoModel", user); v.getContext().startActivity(intent); } } }); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean lastViewVisible = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_FLING) { if (!Utils.hasHoneycomb()) { AppConfig.sImageFetcher.setPauseWork(true); } } else { AppConfig.sImageFetcher.setPauseWork(false); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (mList.size() == 0) return; if (firstVisibleItem + visibleItemCount >= totalItemCount && !lastViewVisible) { lastViewVisible = true; if (isAllLoaded == false && !mFooter.isLoading()) { mFooter.startLoading(); mFetcher.fetchFollows(mUserInfoModel.userID, mUserInfoModel.nickName, type == TYPE_FOLLOWERS ? 0 : 1, 30, mList .size() + 1, onFetchListener); } } else if (firstVisibleItem + visibleItemCount < totalItemCount) { lastViewVisible = false; } } }); } private void bindView() { Bundle extras = getIntent().getExtras(); if (extras == null) finish(); mUserInfoModel = (UserInfoModel) extras .getSerializable("UserInfoModel"); type = extras.getInt("Type", 0); boolean isFromNotice = extras.getBoolean("IsFromNotice", false); if (isFromNotice) { WeiboBaseTool.getInstance().resetUnRead(UNREAD_TYPE.FOLLOWER, null); } String userName = mUserInfoModel.nickName; if (StringUtils.isNullOrEmpty(userName)) { throw new NullPointerException("User Name Can Not Be NULL!"); } if (type == TYPE_FOLLOWERS) { setTitle(userName + "·粉丝"); } else if (type == TYPE_FOLLOWING) { setTitle(userName + "·关注"); } mFetcher.fetchFollows(mUserInfoModel.userID, mUserInfoModel.nickName, type == TYPE_FOLLOWERS ? 0 : 1, 30, 0, onFetchListener); } private FetchCompleteListener onFetchListener = new FetchCompleteListener() { @Override public void fetchComplete(int state, int code, Object obj) { switch (state) { case BaseFetcher.FETCH_NOT_NETWORK: case BaseFetcher.FETCH_AUTH_FAILED: ToastHelper.show((String) obj, 2); mFooter.stopLoading("-FAILED-"); break; case BaseFetcher.FETCH_EMPTY: mFooter.stopLoading("-ZERO-"); break; case BaseFetcher.FETCH_SUCCEED_NEWS: mList.clear(); mList.addAll((ArrayList<UserInfoModel>) obj); userAdapter.notifyDataSetChanged(); break; case BaseFetcher.FETCH_SUCCEED_MORE: mList.addAll((ArrayList<UserInfoModel>) obj); userAdapter.notifyDataSetChanged(); default: break; } if (state == BaseFetcher.FETCH_SUCCEED_NEWS || state == BaseFetcher.FETCH_SUCCEED_MORE) { if (((ArrayList<UserInfoModel>) obj).size() < 10) { mFooter.stopLoading("-END-"); isAllLoaded = true; } else { mFooter.stopLoading("-MORE-"); } } } }; private BaseAdapter userAdapter = new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { ItemView itemView; if (convertView == null) { itemView = new ItemView(); convertView = LayoutInflater.from(FriendListActivity.this) .inflate(R.layout.listitem_users, null); itemView.imageAvatar = (AvatarView) convertView .findViewById(R.id.image_users_item_avatar); itemView.textName = (TextView) convertView .findViewById(R.id.text_users_item_name); convertView.setTag(itemView); } else { itemView = (ItemView) convertView.getTag(); } UserInfoModel user = mList.get(position); itemView.imageAvatar.setItem(user); // itemView.imageAvatar.setImageResource(R.drawable.avatar_default); // mDrawableMgr.loadBitmap(user.iconURL, itemView.imageAvatar, // true); AppConfig.sImageFetcher.loadImage(user.iconURL, itemView.imageAvatar, R.drawable.avatar_default); itemView.textName.setText(user.nickName); return convertView; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return mList.get(position); } @Override public int getCount() { return mList.size(); } class ItemView { public AvatarView imageAvatar; public TextView textName; } }; }