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
- android linearlayout代替listview实现
- Android LinearLayout模拟ListView
- LinearLayout下多个ListView实现滚动
- Android中listview extends Linearlayout
- Android LinearLayout实现多行多列
- 索引之LinearLayout侧边栏+listview实现
- Android布局提示TextView可以代替LinearLayout警告的解决办法
- (转)用android LinearLayout和RelativeLayout实现listView的listItem布局
- Android自定义LinearLayout实现左右侧滑菜单,完美兼容ListView、ScrollView、ViewPager等滑动控件
- 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
- Android LinearLayout实现下拉刷新
- Android集成LinearLayout实现DoubleChoiceButton
- Android RecyclerView之代替ListView与GridView
- android用Adapter实现ListView的初始化报错android.widget.LinearLayout cannot be cast to android.widget.TextView
- ListView 自定义item布局 android.widget.LinearLayout$LayoutParams
- ListView 自定义item布局 android.widget.LinearLayout$LayoutParams
- Android开发ListView 和Linearlayout的分割线
- Android中利用LinearLayout继承实现ImageButton
- SQL当前的进程信息,当前的执行语句
- 【小结】AC自动机
- MDK 生成BIN文件 最简单方式
- 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析
- IOS 编程初体验 第一篇:自学和培训的选择
- android linearlayout代替listview实现
- TOMCAT修改jvm内存的方法
- 比较优秀的软件记录
- c++线程的创建
- CString类型的字符串写入文件,所遇到的问题
- zip, tar, tar.gz, tar.bz2, jar,7z等格式文件的压缩和解压方法
- 线程同步的五种方法
- 2015 多校联赛 ——HDU5372(树状数组)
- Yandex.Algorithm Online Round 3 Sunday, June 15, 2014