实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
package com.tmnw; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AutoCompleteTextView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnScrollListener, OnItemClickListener { private static final String TAG = "gjj"; private EditText edit_search; /*----ListView MVC实现----*/ // model List<String> data;//所有的List List<String> newList;//输入关键字后新的list // view ListView lv; // controller MyAdapter adapter; MainAdapter adapter2; View header; View footer; Button scrollInfo; Thread currentThread; int size = 1; AutoCompleteTextView cardNumAuto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWidget(); initData(); lv.setOnScrollListener(this); lv.setOnItemClickListener(this); } // 初始化组件 private void initWidget() { lv = (ListView) findViewById(R.id.list); scrollInfo = (Button) findViewById(R.id.scroll_info); header = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) header.findViewById(R.id.text1)).setText("这是一个头部"); footer = getLayoutInflater().inflate(R.layout.simple_text, null); ((TextView) footer.findViewById(R.id.text1)).setText("加载中..."); edit_search = (EditText) findViewById(R.id.EditText01); //为输入添加TextWatcher监听文字的变化 edit_search.addTextChangedListener(watcher); //myQuery(null,null); } // 初始化绑定数据 private void initData() { if (lv == null) return; // 第一步:获取数据源(model) data = new ArrayList<String>(); appendData(); // 第二步:new一个适配器(controller) // 参数1:Context // 参数2:listview的item布局 // 参数3:数据填充在item布局下的那个控件id // 参数4:填充的数据 // adapter = new ArrayAdapter<String>(this, R.layout.simple_text, // R.id.text1, data); adapter = new MyAdapter(); // 第三步:给listview设置适配器(view) // addHeaderView和addFooterView一定要有一个在setAdapter之前调用 lv.addHeaderView(header, "header", true); lv.setAdapter(adapter); // 这里的参数null是数据,false说明是不能被选中的 // lv.addFooterView(footer, null, false); // 设置尾部无分割线,头部不想要分割线同理 lv.setFooterDividersEnabled(false); } //当editetext变化时调用的方法,来判断所输入是否包含在所属数据中 private List<String> getNewData(String input_info) { //遍历list newList= new ArrayList<String>(); for (int i = 0; i < data.size(); i ) { //如果遍历到的名字包含所输入字符串 if (data.get(i).contains(input_info)) { //将遍历到的元素重新组成一个list // newList= new ArrayList<String>(); newList.add(data.get(i)); } } return newList; } // 添加数据 private void appendData() { if (data == null) return; for (int i = 0; i < 10; i ) { data.add("" size ); } } TextWatcher watcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub Log.d("=================", "onTextChanged is called!"); if (edit_search.getText()!=null) { String input_info = edit_search.getText().toString(); newList = getNewData(input_info); Log.i("哈哈",newList.toString()); adapter2 = new MainAdapter(); lv.addHeaderView(header, "header", true); lv.setAdapter(adapter2); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub Log.d("===============", "beforTextChanged is called"); } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub Log.d("=================", "afterTextChanged is called!"); } }; // 模拟加载数据 class DataLoadThread extends Thread { @Override public void run() { try { Thread.sleep(2000); appendData(); // 因为Android控件只能通过主线程(ui线程)更新,所以用此方法 runOnUiThread(new Runnable() { @Override public void run() { // 加载完毕,移除尾部控件 lv.removeFooterView(footer); // 当数据改变时调用此方法通知view更新 adapter.notifyDataSetChanged(); } }); } catch (InterruptedException e) { e.printStackTrace(); } } } class MainAdapter extends BaseAdapter{ @Override public int getCount() { return newList.size(); } @Override public Object getItem(int position) { Log.i(TAG, "position:" position); return newList.get(position); } // itemId @Override public long getItemId(int position) { return position; } // lv显示几个item就会调用几次此方法,然后返回一个view对象显示 // position:位置 // convertView:如果lv不能显示全部的数据,那么滚动后会把从显示到不显示的View传进来复用 @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = getLayoutInflater().inflate(R.layout.simple_text, null); } else { view = convertView; } TextView tv = (TextView) view.findViewById(R.id.text1); tv.setText(newList.get(position)); // 隔行变色,可以随心所欲 // if ((position & 1) == 1) { // tv.setBackgroundResource(android.R.color.holo_green_light); // } else { // tv.setBackgroundResource(android.R.color.holo_red_light); // } return view; } } // 自定义基础适配器 class MyAdapter extends BaseAdapter { // listview显示的个数,如果有数据源有10条,而返回5,那么lv永远只能显示5条 // 所以最好就返回数据源的条数就好了 @Override public int getCount() { return data.size(); } // 获取item绑定的数据时调用 @Override public Object getItem(int position) { Log.i(TAG, "position:" position); return data.get(position); } // itemId @Override public long getItemId(int position) { return position; } // lv显示几个item就会调用几次此方法,然后返回一个view对象显示 // position:位置 // convertView:如果lv不能显示全部的数据,那么滚动后会把从显示到不显示的View传进来复用 @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = getLayoutInflater().inflate(R.layout.simple_text, null); } else { view = convertView; } TextView tv = (TextView) view.findViewById(R.id.text1); tv.setText(data.get(position)); // 隔行变色,可以随心所欲 // if ((position & 1) == 1) { // tv.setBackgroundResource(android.R.color.holo_green_light); // } else { // tv.setBackgroundResource(android.R.color.holo_red_light); // } return view; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText( this, "position:" position " item:" parent.getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show(); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // firstVisibleItem:第一个显示的item位置 // visibleItemCount:当前显示的item个数 // totalItemCount:listview的item总个数 scrollInfo.setText("first:" firstVisibleItem " visible:" visibleItemCount " total:" totalItemCount); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 手指接触屏幕滑动 case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 手指离开屏幕做惯性滑动 case OnScrollListener.SCROLL_STATE_FLING: // 当滑动要最后一行时加载数据 if (view.getLastVisiblePosition() >= view.getCount() - 2) { // 可以通过网络加载数据等。 // 判断是否还是在加载中 if (currentThread == null || !currentThread.isAlive()) { // 添加listview尾部控件加载中 lv.addFooterView(footer, null, false); // 启动线程加载数据 currentThread = new DataLoadThread(); currentThread.start(); } } break; // 不滑动 case OnScrollListener.SCROLL_STATE_IDLE: break; } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论