android linearlayout代替listview实现
2015-08-14 16:25
471 查看
最近在写项目,遇到了一个问题,需要在一个页面中显示两个列表,如图
思路: 在scrollview 中写两个linearlayout , 用linearlayout 代替listview。
下面是如何实现linearlayout 代替Listview。
第一步:重写linearlayout
第二步:写一个linearlayout的adapter
第三步:在activity中实现
相关xml文件
activity_main.xml
item.xml
效果图片:
思路: 在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() { @Override public 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 { @Override protected 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() { @Override public 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); } @Override View 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>
效果图片:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories