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

来源:互联网 发布:mac版wifi共享软件 编辑:程序博客网 时间:2024/06/05 10:22

步骤:

这里是用一个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);




阅读全文
0 0