ExpandableListView 二级列表的一个简单案例

来源:互联网 发布:新网域名证书查询 编辑:程序博客网 时间:2024/06/09 14:01

Mainactivity


package com.bwie.demo;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.bwie.demo.adapter.MyExpandAdapter;
import com.bwie.demo.bean.Reason;
import com.bwie.demo.utils.StreamTools;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private ViewPager vp;
    private String[] urls = new String[] {
            "http://tnfs.tngou.net/image/lore/150829/75ddc66c2c011fc5471bde4d218f12e5.jpg",
            "http://tnfs.tngou.net/image/lore/150829/bfd758579579fee7cd0a3ba1231c1c2a.jpg",
            "http://zxpic.gtimg.com/infonew/0/wechat_pics_-214521.jpg/168" };
    private List<View> dotList;
    private List<ImageView> imageList;
    private ScheduledExecutorService sse;
    private int currentPosition = 0;
    // 圆点更换状态
    private int oldPosition = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        initView();
        getMenuData("秘制红烧肉");

    }

    private void initData() {
        // 初始化圆点
        dotList = new ArrayList<View>();
        dotList.add(findViewById(R.id.dot1));
        dotList.add(findViewById(R.id.dot2));
        dotList.add(findViewById(R.id.dot3));

        // 初始化Adapater所绑定的数据集合
        imageList = new ArrayList<ImageView>();
        for (int i = 0; i < urls.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setImageResource(R.drawable.ic_launcher);
            imageList.add(imageView);
        }

    }

    public void getMenuData(String menu) {
        try {
            //异步
            new AsyncTask<String, Void, String>() {

                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);

                    if (result != null) {

                        Gson gson = new Gson();
                        Reason reason = gson.fromJson(result, Reason.class);

                        //设置二级列表的适配器
                        expadnLv.setAdapter(new MyExpandAdapter(MainActivity.this, reason));
                    }

                }

                @Override
                protected String doInBackground(String... params) {
                    // 写网络耗时请求

                    try {
                        // 接收请求地址
                        String path = params[0];
                        HttpClient httpClient = new DefaultHttpClient();
                        HttpGet httpGet = new HttpGet(path);
                        HttpResponse response = httpClient.execute(httpGet);

                        int code = response.getStatusLine().getStatusCode();

                        if (code == HttpStatus.SC_OK) {
                            // 请求成功
                            InputStream is = response.getEntity().getContent();

                            String json = StreamTools.readFromNetWork(is);

                            return json;
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return null;
                }

            }.execute("http://apis.juhe.cn/cook/query?key=5de36998723a1ddf2fe292744b613b72&menu="
                    + URLEncoder.encode(menu, "utf-8"));

        } catch (Exception e) {

        }
    }

    @SuppressWarnings("deprecation")
    private void initView() {
        etName = (EditText) findViewById(R.id.etName);
        findViewById(R.id.btnSearch).setOnClickListener(this);
        expadnLv = (ExpandableListView) findViewById(R.id.expandLv);
        vp = (ViewPager) findViewById(R.id.vp);
        vp.setAdapter(new MyPagerAdapter());
        vp.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {

                dotList.get(arg0 % imageList.size()).setBackgroundResource(
                        R.drawable.dot_focus);
                dotList.get(oldPosition % imageList.size())
                        .setBackgroundResource(R.drawable.dot_normal);

                // 更新圆点的位置
                oldPosition = arg0;

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();

        sse = Executors.newSingleThreadScheduledExecutor();
        sse.scheduleAtFixedRate(new PagerTask(), 2, 3, TimeUnit.SECONDS);

    }

    class MyPagerAdapter extends PagerAdapter {

        private DisplayImageOptions options;

        public MyPagerAdapter() {
            options = new DisplayImageOptions.Builder().cacheInMemory(true)
                    .cacheOnDisk(true).build();
        }

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {

            container.removeView(imageList.get(position % imageList.size()));
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            ImageView imageView = imageList.get(position % imageList.size());
            // 判断image是否有父类
            if (imageView.getParent() != null) {
                ViewPager parent = (ViewPager) imageView.getParent();
                parent.removeView(imageView);
            }

            // 加载图片
            ImageLoader.getInstance().displayImage(
                    urls[position % imageList.size()], imageView, options);

            container.addView(imageView);

            return imageView;
        }

    }

    // 页面切换任务
    class PagerTask implements Runnable {

        @Override
        public void run() {

            // 当前切换的下个页面
            currentPosition += 1;

            // 子线程是不能更新UI

            // 发送消息,通知主线程更新UI
            handler.sendEmptyMessage(0);
        }

    }

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // 页面切换
            vp.setCurrentItem(currentPosition);
        };
    };
    private ExpandableListView expadnLv;
    private EditText etName;

    @Override
    public void onClick(View v) {
        
        switch (v.getId()) {
        case R.id.btnSearch:
        {
            //搜索 请求网络
            String content = etName.getText().toString().trim();
            if(!TextUtils.isEmpty(content)){
                getMenuData(content);
            }else{
                Toast.makeText(this, "输入的内容不能为空", Toast.LENGTH_LONG).show();
            }
            
        }
            break;

        default:
            break;
        }
        
    }

}

Myapplaction 缓存图片



import java.io.File;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;

import android.app.Application;

public class MyApplication extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        
        //初始化imageloader的动作
        
        File cacheDir = StorageUtils.getCacheDirectory(this);
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
        .memoryCacheExtraOptions(480, 800)//内存中缓存多大的图片//*
        .diskCacheExtraOptions(480, 800, null)//sdcard缓存多大的图片
        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))//*
        .memoryCacheSize(2*1024*1024)//内存缓存的最大值//*
        .memoryCacheSizePercentage(13)//设置占用内存的百分比
        .diskCache(new UnlimitedDiskCache(cacheDir))//设置自己的缓存目录
        .diskCacheSize(50*1024*1024)//*
        .build();
        
        //初始化imageLoader
        ImageLoader.getInstance().init(configuration);
        
        
    }

}


MyExpandAdapter 二级列表适配器



import com.bwie.demo.R;
import com.bwie.demo.bean.Reason;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyExpandAdapter extends BaseExpandableListAdapter {

    private Reason reason;
    private Context context;
    private DisplayImageOptions options;

    public MyExpandAdapter(Context context, Reason reason) {
        this.reason = reason;
        this.context = context;

        options = new DisplayImageOptions.Builder().cacheInMemory(true)
                .cacheOnDisk(true).build();

    }

    @Override
    public int getGroupCount() {
        // 拿到付条目的集合大小
        return reason.getResult().getData().size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        // 拿到一个子类的集合大小
        return reason.getResult().getData().get(groupPosition).getSteps()
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return reason.getResult().getData().get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return reason.getResult().getData().get(groupPosition).getSteps()
                .get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        // 去填充父布局

        if (convertView == null) {
            convertView = View.inflate(context, R.layout.group_item, null);
        }

        ImageView groupIcon = (ImageView) convertView
                .findViewById(R.id.groupIcon);
        TextView groupTvTitle = (TextView) convertView
                .findViewById(R.id.groupTvTitle);
        // 设置文本
        groupTvTitle.setText(reason.getResult().getData().get(groupPosition)
                .getTitle());

        // 加载图片
        //设置父条目图片
        ImageLoader.getInstance().displayImage(
                reason.getResult().getData().get(groupPosition).getAlbums()
                        .get(0), groupIcon, options);

        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        // 填充子布局
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.child_item, null);
        }

        ImageView childIcon = (ImageView) convertView
                .findViewById(R.id.childIcon);
        TextView childTvTitle = (TextView) convertView
                .findViewById(R.id.childTvTitle);

        // 设置文本
        childTvTitle.setText(reason.getResult().getData().get(groupPosition)
                .getSteps().get(childPosition).getStep());
        // 设置条目图片
        ImageLoader.getInstance().displayImage(
                reason.getResult().getData().get(groupPosition).getSteps()
                        .get(childPosition).getImg(), childIcon, options);

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

}




原创粉丝点击