android 项目学习随笔十七(ListViewGridView显示组图)

Posted ecollab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 项目学习随笔十七(ListViewGridView显示组图)相关的知识,希望对你有一定的参考价值。

ListView、GridView显示组图,处理机制相同

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="@drawable/pic_list_item_bg"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="match_parent"
            android:layout_height="160dp"
            android:scaleType="centerCrop"
            android:src="@drawable/news_pic_default" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:singleLine="true"
            android:text="标题"
            android:textColor="#000"
            android:textSize="18sp" />
    </LinearLayout>

</LinearLayout>
list_item_photo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ListView
            android:id="@+id/lv_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="#fff"
            android:divider="@null" >
        </ListView>

        <GridView
            android:id="@+id/gv_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:numColumns="2"
            android:visibility="gone" >
        </GridView>
    </FrameLayout>

</LinearLayout>
pager_menu_detail_photo.xml
import java.util.ArrayList;

/**
 * 组图对象封装
 * 
 */
public class PhotoBean {
    public int retcode;
    public PhotoData data;

    public class PhotoData {
        public ArrayList<PhotoNewsData> news;
    }

    public class PhotoNewsData {
        public String id;
        public String listimage;
        public String pubdate;
        public String title;
        public String url;
    }
}
PhotoBean
import java.util.ArrayList;

import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.itheima.zhsh66.R;
import com.itheima.zhsh66.base.BaseMenuDetailPager;
import com.itheima.zhsh66.domain.PhotoBean;
import com.itheima.zhsh66.domain.PhotoBean.PhotoNewsData;
import com.itheima.zhsh66.global.Constants;
import com.itheima.zhsh66.utils.CacheUtils;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
 * 菜单详情页-组图
 * 
 */
public class PhotosMenuDetailPager extends BaseMenuDetailPager implements
        OnClickListener {

    @ViewInject(R.id.lv_list)
    private ListView lvList;
    @ViewInject(R.id.gv_list)
    private GridView gvList;

    private ArrayList<PhotoNewsData> mPhotoList;

    private boolean isList = true;// 当前界面状态

    private ImageButton btnDisplay;

    public PhotosMenuDetailPager(Activity activity, ImageButton btnDisplay) {
        super(activity);
        this.btnDisplay = btnDisplay;
        btnDisplay.setOnClickListener(this);
    }

    @Override
    public View initView() {
        View view = View.inflate(mActivity, R.layout.pager_menu_detail_photo,
                null);
        ViewUtils.inject(this, view);
        return view;
    }

    @Override
    public void initData() {
        String cache = CacheUtils.getCache(Constants.PHOTOS_URL, mActivity);
        if (!TextUtils.isEmpty(cache)) {
            processResult(cache);
        }

        getDataFromServer();
    }

    private void getDataFromServer() {
        HttpUtils utils = new HttpUtils();
        utils.send(HttpMethod.GET, Constants.PHOTOS_URL,
                new RequestCallBack<String>() {

                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        processResult(responseInfo.result);

                        CacheUtils.setCache(Constants.PHOTOS_URL,
                                responseInfo.result, mActivity);
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        error.printStackTrace();
                        Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
                                .show();
                    }
                });
    }

    protected void processResult(String result) {
        Gson gson = new Gson();
        PhotoBean photoBean = gson.fromJson(result, PhotoBean.class);
        mPhotoList = photoBean.data.news;

        lvList.setAdapter(new PhotoAdapter());
        gvList.setAdapter(new PhotoAdapter());
    }

    class PhotoAdapter extends BaseAdapter {

        private BitmapUtils mBitmapUtils;

        public PhotoAdapter() {
            mBitmapUtils = new BitmapUtils(mActivity);
            mBitmapUtils.configDefaultLoadingImage(R.drawable.news_pic_default);
        }

        @Override
        public int getCount() {
            return mPhotoList.size();
        }

        @Override
        public PhotoNewsData getItem(int position) {
            return mPhotoList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = View.inflate(mActivity, R.layout.list_item_photo,
                        null);
                holder = new ViewHolder();
                holder.tvTitle = (TextView) convertView
                        .findViewById(R.id.tv_title);
                holder.ivIcon = (ImageView) convertView
                        .findViewById(R.id.iv_icon);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            PhotoNewsData item = getItem(position);

            holder.tvTitle.setText(item.title);
            mBitmapUtils.display(holder.ivIcon, item.listimage);

            return convertView;
        }

    }

    static class ViewHolder {
        public TextView tvTitle;
        public ImageView ivIcon;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_display:
            // 如果当前是列表, 要切换成grid, 如果是grid,就切换成列表
            if (isList) {
                isList = false;

                lvList.setVisibility(View.GONE);
                gvList.setVisibility(View.VISIBLE);

                btnDisplay.setImageResource(R.drawable.icon_pic_list_type);
            } else {
                isList = true;

                lvList.setVisibility(View.VISIBLE);
                gvList.setVisibility(View.GONE);

                btnDisplay.setImageResource(R.drawable.icon_pic_grid_type);
            }

            break;

        default:
            break;
        }
    }
}
PhotosMenuDetailPager

共用一个Adapter

protected void processResult(String result) {
Gson gson = new Gson();
PhotoBean photoBean = gson.fromJson(result, PhotoBean.class);
mPhotoList = photoBean.data.news;

lvList.setAdapter(new PhotoAdapter());
gvList.setAdapter(new PhotoAdapter());
}

缓存到本地

public void initData() {
String cache = CacheUtils.getCache(Constants.PHOTOS_URL, mActivity);
if (!TextUtils.isEmpty(cache)) {
processResult(cache);
}

getDataFromServer();
}

------------------------------------------------------------------------------

初始化标题按钮(Base )

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <include layout="@layout/title_bar" />

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>

</LinearLayout>
View Code
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;

import com.itheima.zhsh66.MainActivity;
import com.itheima.zhsh66.R;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

/**
 * 五个标签页的基类
 * 
 */
public abstract class BasePager {

    public Activity mActivity;

    // 标签页面的根布局
    public View mRootView;

    public TextView tvTitle;
    public ImageButton btnMenu;
    // 帧布局容器, 将来要动态向里面添加内容
    public FrameLayout flContent;

    // 组图切换按钮
    public ImageButton btnDisplay;

    public BasePager(Activity activity) {
        mActivity = activity;
        initView();
    }

    /**
     * 初始化布局
     */
    public void initView() {
        mRootView = View.inflate(mActivity, R.layout.base_pager, null);
        tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);
        btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);
        flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);
        btnDisplay = (ImageButton) mRootView.findViewById(R.id.btn_display);

        btnMenu.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                toggle();
            }
        });
    }

    /**
     * 侧边栏展开或者收起的方法
     */
    private void toggle() {
        MainActivity mainUI = (MainActivity) mActivity;
        SlidingMenu slidingMenu = mainUI.getSlidingMenu();
        slidingMenu.toggle();// 开关(如果状态为开,它就关;如果状态为关,它就开)
    }

    /**
     * 初始化数据
     */
    public abstract void initData();
}
BasePager

------------------------------------------------------------------------------

对按钮的传递、调用

if (pager instanceof PhotosMenuDetailPager) {

import java.util.ArrayList;

import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

import com.google.gson.Gson;
import com.itheima.zhsh66.MainActivity;
import com.itheima.zhsh66.base.BaseMenuDetailPager;
import com.itheima.zhsh66.base.BasePager;
import com.itheima.zhsh66.base.impl.menudetail.InteractMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.NewsMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.PhotosMenuDetailPager;
import com.itheima.zhsh66.base.impl.menudetail.TopicMenuDetailPager;
import com.itheima.zhsh66.domain.NewsMenuData;
import com.itheima.zhsh66.global.Constants;
import com.itheima.zhsh66.utils.CacheUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;

/**
 * 新闻中心
 * 
 */
public class NewsCenterPager extends BasePager {

    // 菜单详情页集合
    private ArrayList<BaseMenuDetailPager> mMenuDetailPagers;
    private NewsMenuData mNewsMenuData;// 新闻分类信息网络数据

    public NewsCenterPager(Activity activity) {
        super(activity);
    }

    @Override
    public void initData() {
        System.out.println("新闻中心初始化...");
        tvTitle.setText("新闻");

        // 1.首先先看本地有没有缓存
        // 2.有缓存,直接加载缓存
        String cache = CacheUtils.getCache(Constants.CATEGORIES_URL, mActivity);
        if (!TextUtils.isEmpty(cache)) {
            // 有缓存
            System.out.println("发现缓存....");
            processResult(cache);
        }

        // 即使发现有缓存,仍继续调用网络, 获取最新数据
        getDataFromServer();
    }

    /**
     * 从服务器获取数据 需要权限: <uses-permission
     * android:name="android.permission.INTERNET"/>
     */
    private void getDataFromServer() {
        HttpUtils utils = new HttpUtils();
        utils.send(HttpMethod.GET, Constants.CATEGORIES_URL,
                new RequestCallBack<String>() {

                    @Override
                    public void onSuccess(ResponseInfo<String> responseInfo) {
                        // 请求成功
                        String result = responseInfo.result;// 获取json字符串
                        // System.out.println("result:" + result);
                        processResult(result);
                        // 写缓存
                        CacheUtils.setCache(Constants.CATEGORIES_URL, result,
                                mActivity);
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        // 请求失败
                        error.printStackTrace();
                        Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
                                .show();
                    }
                });
    }

    /**
     * 解析json数据
     * 
     * @param result
     */
    protected void processResult(String result) {
        // gson->json
        Gson gson = new Gson();
        mNewsMenuData = gson.fromJson(result, NewsMenuData.class);
        System.out.println("解析结果:" + mNewsMenuData);

        // 获取侧边栏对象
        MainActivity mainUI = (MainActivity) mActivity;
        LeftMenuFragment leftMenuFragment = mainUI.getLeftMenuFragment();
        // 将网络数据设置给侧边栏
        leftMenuFragment.setData(mNewsMenuData.data);

        // 初始化4个菜单详情页
        mMenuDetailPagers = new ArrayList<BaseMenuDetailPager>();
        mMenuDetailPagers.add(new NewsMenuDetailPager(mActivity,
                mNewsMenuData.data.get(0).children));
        mMenuDetailPagers.add(new TopicMenuDetailPager(mActivity));
        mMenuDetailPagers.add(new PhotosMenuDetailPager(mActivity, btnDisplay));
        mMenuDetailPagers.add(new InteractMenuDetailPager(mActivity));

        // 菜单详情页-新闻作为初始页面
        setCurrentMenuDetailPager(0);
    }

    // 给新闻中心页面的FrameLayout填充布局
    protected void setCurrentMenuDetailPager(int position) {
        BaseMenuDetailPager pager = mMenuDetailPagers.get(position);
        // 移除之前所有的view对象, 清理屏幕
        flContent.removeAllViews();
        flContent.addView(pager.mRootView);
        pager.initData();// 初始化数据

        // 更改标题
        tvTitle.setText(mNewsMenuData.data.get(position).title);

        // 组图页面需要显示切换按钮
        if (pager instanceof PhotosMenuDetailPager) {
            btnDisplay.setVisibility(View.VISIBLE);
        } else {
            btnDisplay.setVisibility(View.GONE);
        }
    }

}
NewsCenterPager

 

以上是关于android 项目学习随笔十七(ListViewGridView显示组图)的主要内容,如果未能解决你的问题,请参考以下文章

《Android开发艺术探索》之Android性能优化ListView和RecyclerView(十七)

android 项目学习随笔三(Fragment )

android 项目学习随笔十六( 广告轮播条播放)

android 项目学习随笔八(xUtils的BitmapUtils模块)

Android项目实战(二十七):数据交互(信息编辑)填写总结

android 学习随笔