android linearlayout代替listview实现

来源:互联网 发布:金利合软件 编辑:程序博客网 时间:2024/05/22 06:36

最近在写项目,遇到了一个问题,需要在一个页面中显示两个列表,如图


思路: 在scrollview 中写两个linearlayout , 用linearlayout 代替listview。

下面是如何实现linearlayout 代替Listview。


第一步:重写linearlayout


import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.widget.LinearLayout;public class MyLinearLayoutForListView extends LinearLayout {    private LinearLayoutBaseAdapter adapter;    private OnItemClickListener onItemClickListener;    public MyLinearLayoutForListView(Context context) {        super(context);    }    public MyLinearLayoutForListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public void setAdapter(LinearLayoutBaseAdapter adapter) {        this.adapter = adapter;        //绑定adapter中的监听        adapter.setNotifyDataSetChangedIF(changedIF);        // setAdapter 时添加 view        bindView();    }        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.onItemClickListener = onItemClickListener;    }    /**     * 初始化刷新监听     */    public MNotifyDataSetChangedIF changedIF = new MNotifyDataSetChangedIF() {@Overridepublic void changed() {removeAllViews();bindView();}};/** * 刷新页面时调用 * @author caipc */    public interface MNotifyDataSetChangedIF{    public void changed();    }    /**     * 绑定 adapter 中所有的 view     */    private void bindView() {        if (adapter == null) {            return;        }        for (int i = 0; i < adapter.getCount(); i++) {            final View v = adapter.getView(i);            final int tmp = i;            final Object obj = adapter.getItem(i);            // view 点击事件触发时回调我们自己的接口            v.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (onItemClickListener != null) {                        onItemClickListener.onItemClicked(v, obj, tmp);                    }                }            });            addView(v);        }    }    /**     *      * 回调接口     */    public interface OnItemClickListener {        /**         *          * @param v         *            点击的 view         * @param obj         *            点击的 view 所绑定的对象         * @param position         *            点击位置的 index         */        public void onItemClicked(View v, Object obj, int position);    }}

第二步:写一个linearlayout的adapter

package com.example.linearlayouttolistview;import java.util.List;import com.example.linearlayouttolistview.MyLinearLayoutForListView.MNotifyDataSetChangedIF;import android.content.Context;import android.view.LayoutInflater;import android.view.View;public abstract class LinearLayoutBaseAdapter {    private List<? extends Object> list;    private Context context;    private MNotifyDataSetChangedIF changedIF;    public LinearLayoutBaseAdapter(Context context, List<? extends Object> list) {        this.context = context;        this.list = list;    }    public LayoutInflater getLayoutInflater() {        if (context != null) {            return LayoutInflater.from(context);        }        return null;    }    public int getCount() {        if (list != null) {            return list.size();        }        return 0;    };    public Object getItem(int position) {        if (list != null) {            return list.get(position);        }        return null;    };        /**     * 绑定adapter中的监听     * @param changedIF     */    public void setNotifyDataSetChangedIF(MNotifyDataSetChangedIF changedIF){    this.changedIF = changedIF;    }    /**     * 数据刷新     */    public void notifyDataSetChanged(){    if (changedIF != null) {    changedIF.changed();}    }    /**     * 供子类复写     *      * @param position     * @return     */    abstract View getView(int position);}

第三步:在activity中实现

package com.example.linearlayouttolistview;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.TextView;import com.example.linearlayouttolistview.MyLinearLayoutForListView.OnItemClickListener;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();final MyAdapter adapter = new MyAdapter(this, list);final MyLinearLayoutForListView forListView = (MyLinearLayoutForListView) findViewById(R.id.ll_list);forListView.setAdapter(adapter);forListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClicked(View v, Object obj, int position) {if (position == list.size() -1) {list.add("aaaaaaaaaaa");adapter.notifyDataSetChanged();}}});//final Handler handler = new Handler(){//@Override//public void handleMessage(Message msg) {//super.handleMessage(msg);//list.add("aaaaaaaaaaa");//list.add("bbbbbbbbbbb");//adapter.notifyDataSetChanged();//}//};//new Thread(){//public void run() {//try {//sleep(3000);//handler.sendEmptyMessage(1);//} catch (Exception e) {//// TODO: handle exception//}//};//}.start();}private List<String> list;private void initData(){list = new ArrayList<String>();for (int i = 0; i < 50; i++) {list.add(String.valueOf(i));}}class MyAdapter extends LinearLayoutBaseAdapter{public MyAdapter(Context context, List<? extends Object> list) {super(context, list);}@OverrideView getView(int position) {View view = getLayoutInflater().inflate(R.layout.item, null);TextView textView = (TextView) view.findViewById(R.id.textview);textView.setText((String) getItem(position));return view;}} }

相关xml文件

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <ScrollView        android:layout_width="fill_parent"        android:layout_height="fill_parent" >        <com.example.linearlayouttolistview.MyLinearLayoutForListView            android:id="@+id/ll_list"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:orientation="vertical" />    </ScrollView></RelativeLayout>

item.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" >            <LinearLayout         android:layout_width="fill_parent"        android:layout_height="50dp"        android:orientation="horizontal"        android:padding="10dp">            <TextView         android:id="@+id/textview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="测试"      />            </LinearLayout>    </LinearLayout>

效果图片:








0 0
原创粉丝点击