实现可滑动,能在外部动态控制ListView显示个数的Android项目

步骤:

这里是用一个RelativeLayout实现ListView的一个title,在title中有一个Image通过点击这个image,来控制ListView的显示个数。

第一步:

新建两个类分别继承RelativeLayout和ListView(title的layout我就不写了,只要是开发的都会写)

public class SettingListView extends ListView {
    public SettingListView(Context context) {
        super(context);
    }

    public SettingListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SettingListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    /**
     * @param widthMeasureSpec horizontal space requirements as imposed by the parent.
     *                         The requirements are encoded with
     *                         {@link MeasureSpec}.
     * @param heightMeasureSpec vertical space requirements as imposed by the parent.
     *                         The requirements are encoded with
     *                         {@link MeasureSpec}.
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

onMeasure()函数是为了让ListView能够适应ScrollView,不然只能显示一行。

public class TitleSetting extends RelativeLayout {

    protected LayoutInflater layoutInflater;
    private ImageView title_pack_up;
    protected TextView listview_title_text_dire, title_text_show;
    private boolean showListViewAll = true;
    private SettingAdapter mSettingAdapter;//持有外部类声明


    public TitleSetting(Context context) {
        super(context);
        initView(context);
    }

    public TitleSetting(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public TitleSetting(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    private void initView(Context context) {
        mSettingAdapter=new SettingAdapter(context);

        layoutInflater = LayoutInflater.from(context);
        layoutInflater.inflate(R.layout.apus_listview_title_setting, this);

        listview_title_text_dire = (TextView) findViewById(R.id.listview_title_text_dire);
        title_text_show = (TextView) findViewById(R.id.title_text_show);
        title_pack_up = (ImageView) findViewById(R.id.title_pack_up);
        title_pack_up.setBackgroundResource(R.drawable.down);
        title_pack_up.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (showListViewAll) {
                    //show all listview(add item)
                    mSettingAdapter.addData();
                    title_pack_up.setBackgroundResource(R.drawable.up);
                    Log.i("TitleSetting","图片替换完毕");
                    showListViewAll=false;
                } else {
                    //show part(delete item)
                    mSettingAdapter.deleteData();//回调
                    title_pack_up.setBackgroundResource(R.drawable.down);
                    showListViewAll=true;
                }
            }
        });
    }
}

第二步:建立布局文件

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/screen_contain"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="none">
    <!--all View-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@color/background"
        android:orientation="vertical"
        android:paddingLeft="@dimen/screen_left"
        android:paddingRight="@dimen/screen_right"
        tools:context="com.zcl.myapp.MainActivity">
                <!-- show setting-->
        <com.zcl.myapp.allAdapter.TitleSetting
            android:id="@+id/listview_title_setting"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:visibility="visible"
            />

        <com.zcl.myapp.allAdapter.SettingListView
            android:id="@+id/listView_settings"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:divider="@drawable/apus_divider_list"
            android:dividerHeight="12dp"
            android:visibility="visible"/>
 </LinearLayout>
</ScrollView>

第三步:编写ListView对应的Adapter


import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.apus.searchdesign.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by zcl 
 */

public class SettingAdapter extends BaseAdapter {


    private LayoutInflater mInflater;
    private List<Map<String, Object>> mData;
    protected Resources res;
    protected static List<Map<String, Object>> list;
    

    private static class SettingViewHolder {
        private ImageView settings_img;
        private TextView settings_text_middle, settings_text_right;
    }

    public SettingAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
        res = context.getResources();
        mData = getData();
        //刷新ListView
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        SettingViewHolder holder = null;
        if (convertView == null) {
            holder = new SettingViewHolder();
            convertView = mInflater.inflate(R.layout.listitem_settings, null);
            //设置item的宽和高度,120是执行了dp到px计算之后的数字,1dp=2px
            convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 120));

            holder.settings_img = (ImageView) convertView.findViewById(R.id.settings_img);
            holder.settings_text_middle = (TextView) convertView.findViewById(R.id.settings_text_middle);
            holder.settings_text_right = (TextView) convertView.findViewById(R.id.settings_text_right);
            convertView.setTag(holder);
        } else {
            holder = (SettingViewHolder) convertView.getTag();
        }
        holder.settings_img.setBackgroundResource((Integer) mData.get(position).get("settings_img"));
        holder.settings_text_middle.setText((String) mData.get(position).get("settings_text_middle"));
        holder.settings_text_right.setText((String) mData.get(position).get("settings_text_right"));
        return convertView;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    private List<Map<String, Object>> getData() {
        list = new ArrayList<Map<String, Object>>();

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("settings_img", R.drawable.setting);
        map.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[0]);
        map.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[0]);
        list.add(map);
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("settings_img", R.drawable.setting);
        map1.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[1]);
        map1.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[1]);
        list.add(map1);
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("settings_img", R.drawable.setting);
        map2.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[2]);
        map2.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[2]);
        list.add(map2);
        return list;
    }
    protected void addData() {
        Log.i("Setting", "增加之前" + list.size());
        //待增加数据
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("settings_img", R.drawable.setting);
        map3.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[3]);
        map3.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[3]);
        list.add(map3);
        Map<String, Object> map4 = new HashMap<String, Object>();
        map4.put("settings_img", R.drawable.setting);
        map4.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[4]);
        map4.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[4]);
        list.add(map4);
        Map<String, Object> map5 = new HashMap<String, Object>();
        map5.put("settings_img", R.drawable.setting);
        map5.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[5]);
        map5.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[5]);
        list.add(map5);
        Log.i("Setting", "增加之后" + list.size());
    }

    protected void deleteData() {
        Log.i("Setting", "删除之前" + list.size());
        //从末尾往前删除,所以如果倒过来的话长度肯定是不会到6的,也即是5这一行会出错
        list.remove(5);
        list.remove(4);
        list.remove(3);
        Log.i("Setting", "删除之后" + list.size());
    }

}


第四步:在MainActivity中实现绑定

//listView_settings
        listView_settings = (ListView) findViewById(R.id.listView_settings);
        SettingAdapter settingAdapter = new SettingAdapter(this);
        listView_settings.setAdapter(settingAdapter);




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值