转载请标明出处:http://blog.csdn.net/android_ls/article/details/8884335

声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。

一、先看下效果图如下:

选中列表中的某一项(状态)如下:

二、如上面的这种效果,是使用PopupWindow来实现的。下面来说说具体的实现思路:

1.准备要显示的文字。

在资源文件strings.xml中添加如下配置:

  <string-array name="fresh_news_filter_list"><item>新鲜事</item><item>好友内容</item><item>特别关注</item><item>状态</item><item>照片</item><item>位置</item><item>分享</item><item>日志</item></string-array>

在新鲜事视图(FreshNewsLayout类)中添加如下代码:

mTexts = mActivity.getResources().getStringArray(R.array.fresh_news_filter_list);

2. 准备要显示的图标。

   /*** 顶部下拉列表的操作指示图标Id数组*/private int[] mIcons = {R.drawable.v5_0_1_newsfeed_popupwindow_type_all_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_friend_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_specialfocus_background, R.drawable.v5_0_1_newsfeed_popupwindow_type_status_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_photo_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_place_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_share_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_blog_background };

3. 使用PopupWindow类的实例显示视图。

a.构建PopupWindow对象,并设置属性值。

        View view = LayoutInflater.from(mActivity).inflate(R.layout.fresh_news_popupwindow, null);mPopupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, true);mPopupWindow.setAnimationStyle(R.style.fresh_news_popup_animation);

fresh_news_popupwindow.xml布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#FFE4E4E4" ><ListViewandroid:id="@+id/popup_listview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dip"android:background="@drawable/flipper_popupwindow_list_background"android:cacheColorHint="#00000000"android:divider="@drawable/flipper_popupwindow_line"android:listSelector="#00000000"android:scrollbars="none" /></LinearLayout>

设置的样式fresh_news_popup_animation如下:

   <style name="fresh_news_popup_animation" parent="android:Animation"><item name="android:windowEnterAnimation">@anim/fade_in</item><item name="android:windowExitAnimation">@anim/fade_out</item></style>

动画配置文件fade_in.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300"android:fillAfter="true"android:fillEnabled="true"android:fromAlpha="0.0"android:toAlpha="1.0" />

动画配置文件fade_out.xml 如下:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300"android:fillAfter="true"android:fillEnabled="true"android:fromAlpha="1.0"android:toAlpha="0.0" />

b.获取ListView组件并设置数据适配器。

        mPopupListView = (ListView) view.findViewById(R.id.popup_listview);mPopupAdapter = new FreshNewsPopupAdapter(mActivity, mIcons, mTexts);mPopupListView.setAdapter(mPopupAdapter);

下拉列表数据适配器类( FreshNewsPopupAdapter )代码如下:

package com.everyone.android.ui.freshnews;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;import com.everyone.android.R;/*** 功能描述:新鲜事视图顶部下拉列表数据适配器* @author android_ls**/
public class FreshNewsPopupAdapter extends BaseAdapter {private LayoutInflater mInflater;private int[] mIcon;private String[] mName;private int mPosition;public int getPosition() {return mPosition;}public void setPosition(int mPosition) {this.mPosition = mPosition;}public FreshNewsPopupAdapter(Context context, int[] icon, String[] name) {mInflater = LayoutInflater.from(context);mIcon = icon;mName = name;}public int getCount() {return mIcon.length;}public Object getItem(int position) {return null;}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.fresh_news_popupwindow_item, null);holder = new ViewHolder();holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb_text_icon);holder.imageView = (ImageView) convertView.findViewById(R.id.iv_checked);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.checkBox.setButtonDrawable(mIcon[position]);holder.checkBox.setText(mName[position]);holder.checkBox.setChecked(false);holder.imageView.setVisibility(View.GONE);if (position == mPosition) {holder.checkBox.setChecked(true);holder.imageView.setVisibility(View.VISIBLE);}return convertView;}static class ViewHolder {CheckBox checkBox;ImageView imageView;}
}

c. 点击顶部导航栏中新鲜事项的事件处理:

    @Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ll_down_list:if (mPopupWindow != null) {mPopupWindow.showAsDropDown(topMenuNavbar);}break;case R.id.ll_refresh:break;default:break;}}

d. 下拉列表项的单击事件处理:

    mPopupListView.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view, int position, long id) {mPopupWindow.dismiss();if (mPopupAdapter.getPosition() != position) {mPopupAdapter.setPosition(position);mPopupAdapter.notifyDataSetChanged();topMenuNavbar.tvTitle.setText(mTexts[position]);}// 新鲜事过滤事件处理}});

三、 FreshNewsLayout类的 完整代码

package com.everyone.android.ui.freshnews;import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;import org.json.JSONException;import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;import com.everyone.android.R;
import com.everyone.android.api.AuthTokenManager;
import com.everyone.android.callback.ParseCallback;
import com.everyone.android.callback.ResultCallback;
import com.everyone.android.entity.FreshNews;
import com.everyone.android.net.AsyncBaseRequest;
import com.everyone.android.net.AsyncHttpsPost;
import com.everyone.android.net.DefaultThreadPool;
import com.everyone.android.ui.EveryoneActivity;
import com.everyone.android.utils.Constant;
import com.everyone.android.utils.LogUtil;
import com.everyone.android.widget.TopMenuNavbar;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;/*** 功能描述:新鲜事视图* @author android_ls*/
public class FreshNewsLayout extends FrameLayout implements OnClickListener {/*** LOG打印标签*/private static final String TAG = "FreshNewsLayout";private TopMenuNavbar topMenuNavbar;/*** 所有类别的新鲜事*/private static final String FRESH_NEWS_TYPE_ALL = "10,11,20,21,22,23,31,32,33,34,35,36,40,41,50,51,52,53,54,55";/*** 每一页记录数,默认值为30,最大50 */private int pageCount = 30;/*** 当前获取第几页,默认值为1*/private int page = 1;public TopMenuNavbar getTopMenuNavbar() {return topMenuNavbar;}private EveryoneActivity mActivity;private List<AsyncBaseRequest> mAsyncRequests;private DefaultThreadPool mDefaultThreadPool;private Handler mHandler;public AuthTokenManager mAuthTokenManager;private LinearLayout mLoadingView;private ListView mListView;private FreshNewsAdapter mFreshNewsAdapter;/*** 新鲜事信息集合*/private LinkedList<FreshNews> mFreshNewsList = new LinkedList<FreshNews>();private PopupWindow mPopupWindow;/*** 顶部下拉列表*/private ListView mPopupListView;/*** 顶部下拉列表数据适配器*/private FreshNewsPopupAdapter mPopupAdapter;/*** 顶部下拉列表的操作提示文本数组*/private String[] mTexts;/*** 顶部下拉列表的操作指示图标Id数组*/private int[] mIcons = { R.drawable.v5_0_1_newsfeed_popupwindow_type_all_background, R.drawable.v5_0_1_newsfeed_popupwindow_type_friend_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_specialfocus_background, R.drawable.v5_0_1_newsfeed_popupwindow_type_status_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_photo_background, R.drawable.v5_0_1_newsfeed_popupwindow_type_place_background,R.drawable.v5_0_1_newsfeed_popupwindow_type_share_background, R.drawable.v5_0_1_newsfeed_popupwindow_type_blog_background };public FreshNewsLayout(EveryoneActivity activity) {super(activity);mActivity = activity;this.mAsyncRequests = activity.getAsyncRequests();this.mDefaultThreadPool = activity.getDefaultThreadPool();this.mHandler = activity.getHandler();this.mAuthTokenManager = activity.getAuthTokenManager();setupViews();// 初始化下拉列表setupPopupWindow();}/*  public FreshNewsLayout(Context context, AttributeSet attrs) {super(context, attrs);setupViews();}*/private void setupPopupWindow() {mTexts = mActivity.getResources().getStringArray(R.array.fresh_news_filter_list);View view = LayoutInflater.from(mActivity).inflate(R.layout.fresh_news_popupwindow, null);mPopupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, true);mPopupWindow.setAnimationStyle(R.style.fresh_news_popup_animation);mPopupListView = (ListView) view.findViewById(R.id.popup_listview);mPopupAdapter = new FreshNewsPopupAdapter(mActivity, mIcons, mTexts);mPopupListView.setAdapter(mPopupAdapter);mPopupListView.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view, int position, long id) {mPopupWindow.dismiss();if (mPopupAdapter.getPosition() != position) {mPopupAdapter.setPosition(position);mPopupAdapter.notifyDataSetChanged();topMenuNavbar.tvTitle.setText(mTexts[position]);}// 新鲜事过滤事件处理}});}private void setupViews() {final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());LinearLayout freshNewsViewRoot = (LinearLayout) mLayoutInflater.inflate(R.layout.fresh_news, null);addView(freshNewsViewRoot);// 加载提示进度条mLoadingView = (LinearLayout) freshNewsViewRoot.findViewById(R.id.loading);topMenuNavbar = (TopMenuNavbar) freshNewsViewRoot.findViewById(R.id.rl_top_menu_navbar);topMenuNavbar.mLlDownList.setOnClickListener(this);topMenuNavbar.mLlRefresh.setOnClickListener(this);topMenuNavbar.ivRightLine.setVisibility(View.GONE);topMenuNavbar.tvRightOperationName.setVisibility(View.GONE);mListView = (ListView) freshNewsViewRoot.findViewById(R.id.listview);mFreshNewsAdapter = new FreshNewsAdapter(mActivity, mFreshNewsList);mListView.setAdapter(mFreshNewsAdapter);// TODO 这里暂时简单的这样处理mListView.setOnScrollListener(new OnScrollListener() {public void onScrollStateChanged(AbsListView view, int scrollState) {if (view.getLastVisiblePosition() == view.getCount() - 1) {page++;getNewsAll();}}public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ll_down_list:if (mPopupWindow != null) {mPopupWindow.showAsDropDown(topMenuNavbar);}break;case R.id.ll_refresh:break;default:break;}}/*** 向服务器端请求新鲜事的数据*/public void getNewsAll() {String accessToken = mAuthTokenManager.getAccessToken();LogUtil.e(TAG, "accessToken = " + accessToken);Map<String, String> parameter = new HashMap<String, String>();parameter.put("v", "1.0"); // API的版本号,固定值为1.0 parameter.put("access_token", accessToken); // OAuth2.0验证授权后获得的token。parameter.put("format", "JSON"); // 返回值的格式。请指定为JSON或者XMLparameter.put("call_id", "1.0"); // 请求队列号parameter.put("method", "feed.get");parameter.put("type", FRESH_NEWS_TYPE_ALL); // 新鲜事的类别,多个类型以逗号分隔,type列表 // parameter.put("uid", ""); // 支持传入当前用户的一个好友ID,表示获取此好友的新鲜事,如果不传,默认为获取当前用户的新鲜事 parameter.put("page", page + ""); // 支持分页,指定页号,页号从1开始,默认值为1 parameter.put("count", pageCount + ""); // 支持分页,每一页记录数,默认值为30,最大50 AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() {@Overridepublic Object parse(String json) throws JSONException {LogUtil.i(TAG, "json = " + json);Gson gson = new Gson();java.lang.reflect.Type type = new TypeToken<LinkedList<FreshNews>>() {}.getType();LinkedList<FreshNews> freshNewsList = gson.fromJson(json, type);LogUtil.i(TAG, "freshNewsList = " + freshNewsList.size());return freshNewsList;}}, new ResultCallback() {@Overridepublic void onSuccess(Object obj) {@SuppressWarnings("unchecked")LinkedList<FreshNews> freshNewsList = (LinkedList<FreshNews>) obj;if (freshNewsList.isEmpty()) {return;}mFreshNewsList.addAll(freshNewsList);mHandler.post(new Runnable() {@Overridepublic void run() {mLoadingView.setVisibility(View.GONE);mFreshNewsAdapter.notifyDataSetChanged();}});}@Overridepublic void onFail(int errorCode) {LogUtil.i(TAG, "freshNewsList errorCode = " + errorCode);}});mDefaultThreadPool.execute(asyncHttpsPost);mAsyncRequests.add(asyncHttpsPost);}}

Android仿人人客户端(v5.7.1)——新鲜事之下拉列表(过滤项列表)相关推荐

  1. Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(二)...

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8758943 上一篇在Android仿人人客户端(v5.7.1)--应用主界面之滑动效 ...

  2. Android仿人人客户端(v5.7.1)——采用RelativeLayout做父容器,实现左侧滑动菜单(二)

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8758943 上一篇在Android仿人人客户端(v5.7.1)--应用主界面之滑动效 ...

  3. Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基类java源码)...

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8909068 声明:没看过仿人人android客户端系列博文,前面的相关文章的朋友,请 ...

  4. Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)...

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8797740 这篇是基于上一篇Android仿人人客户端(v5.7.1)--对从服务器 ...

  5. Android仿人人客户端(v5.7.1)——通过HTTPS协议的POST方式获取用户的基本信息

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8770537 一.扩展之前的网络模块 基于Android仿人人客户端(v5.7.1)- ...

  6. Android仿人人客户端(v5.7.1)——网络模块处理的架构

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8732427 声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端, ...

  7. Android仿人人客户端(v5.7.1)——点击左侧菜单栏中的Item切换视图

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8765193 在前面几讲中,左侧菜单(左侧面板).满足滑动或点击子View的方式,打开 ...

  8. Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8749188 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编 ...

  9. [置顶] Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8749188  声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用, ...

最新文章

  1. 干货丨一文看懂生成对抗网络:从架构到训练技巧
  2. 中国北斗全球系统核心星座将于2019年年底部署完成
  3. CAS增加免登陆(Remember Me)功能
  4. 存储过程批量执行脚本
  5. 将CSV文件存为HTML文件形式
  6. RHEL5 安装VMware tools
  7. winform等待窗口之最简单使用线程实现loading
  8. Windows系统Git安装教程,超详细的安装过程!附软件资料~
  9. Sizzle揭秘—Sizzle选择器引擎的入口
  10. Hotmail Smtp邮箱发送的端口
  11. vue低级错误(浏览器页面,后台页面全部正常)
  12. 瑞萨单片机之data flash的使用(五)
  13. 多张图片合成PDF .
  14. 卷积神经网络(人马分类)
  15. Office2010Toolkit 免费下载,有效时间久!
  16. mysql_error_trace.inc 后台地址_警惕:织梦dedecm漏洞data/mysql_error_trace.inc暴露后台信息...
  17. 为什么C和C++牛人多?都是被逼的啊!
  18. 升级镁光M4固态硬盘的固件
  19. 数字孪生技术助力汽车制造产业链
  20. Java-Swing-JTable(DefaultTableModel)

热门文章

  1. dijkstra邻接表_[力扣743] 带权邻接表的单源最短路
  2. ashx获取input file 文件_通过Ajax方式上传文件(input file),使用FormData进行Ajax请求...
  3. mysql分组按天统计数据_MySql按周,按月,按日分组统计数据
  4. git21天打卡day12切换分支修改文件
  5. 普通的测试员和牛逼的测试员有什么区别?完成这两次跨越,你也可以
  6. 工作5年后我才发现:90%的技术问题,可以解决
  7. 我:一个女孩从软件测试工程师到主管的成长
  8. html5 怎么写动态图形设计,如何用SVG制作酷炫动态图标?(代码实例)
  9. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  10. ipconfig默认网关为空_网络工程师之IPCONFIG命令详解