ListView 资源整理
来源:互联网 发布:java身份证中提取性别 编辑:程序博客网 时间:2024/05/15 23:49
1.ListView中让onClick和onItemClick事件共存
将具有点击事件控件的android:focusable属性置成false就可以了。
2.listView的选中颜色
ListView选中时默认是黄色,很多时候会和我们软件的配色不符合,那么我就教你如何修改默认的ListView配色,改变ListView选中颜色有两个方法:
(1). 在程序中:
- Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback);
- ListView.setSelector(drawable);
(2). 在xml里面的ListView标签下添加:
- android:listSelector=”#00000000″ //后面的颜色可以自己定这样写是透明的
3.记录和恢复ListView滚动的位置
有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码:
- //列表滚动
- private OnScrollListener ScrollLis = new OnScrollListener() {
- @Override
- public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
- }
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
- ListPos=list.getFirstVisiblePosition(); //ListPos记录当前可见的List顶端的一行的位置
- }
- }
- };
接下来就是还原位置,放在ListView加载之后:
- list.setSelection(ListPos);
4.关于android ListView的美化
用心的朋友应该会发现,listview中在设置了背景之后。会有些问题。
1.、listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。
2 、listview的上边和下边有黑色的阴影。
3、lsitview的每一项之间需要设置一个图片做为间隔。
针对以上问题 在listview的xml文件中设置一下语句。
问题1 有如下代码结解决 android:scrollingCache=”false” 或 android:cacheColorHint=”#00000000″
问题2 用如下代码解决:android:fadingEdge=”none”
问题3 用如下代码解决: android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源
5.ListView 中添加按钮,动态删除添加ItemView的操作
要实现添加按钮的操作,必须自定义Adapter,使用Button View的setTag()方法,将Button所属的位置设置到tag当中
要实现动态添加删除ItemView的操作,必须首先调整调整Adapter所绑定的数据源,然后调用Adapter的notifyDataSetChanged()方法
以下为实现的一个实例
- package com.jason.joysmsyd;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.ListActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.Window;
- import android.view.View.OnClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class SendMain extends ListActivity implements OnClickListener{
- Button buttonMessage,buttonContact,buttonHistory;
- EditText textMessage;
- List<Map<String,String>> contacts = new ArrayList<Map<String,String>>();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- this.setContentView(R.layout.layout_send);
- buttonMessage = (Button) this.findViewById(R.id.ButtonMessage);
- buttonContact = (Button) this.findViewById(R.id.ButtonContact);
- buttonHistory = (Button) this.findViewById(R.id.ButtonHistory);
- textMessage = (EditText)this.findViewById(R.id.EditTextMessage);
- textMessage.setText(this.getIntent().getExtras().getString("message"));
- }
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch(v.getId()){
- case R.id.ButtonMessage:
- this.finish();
- break;
- case R.id.ButtonContact:
- {
- Intent intent = new Intent();
- intent.setAction("com.jason.action.contact");
- this.startActivityForResult(intent, 0);
- }
- break;
- case R.id.ButtonHistory:
- {
- Intent intent = new Intent();
- intent.setAction("com.jason.action.history");
- this.startActivityForResult(intent, 1);
- }
- break;
- }
- }
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == 0 && resultCode == RESULT_OK) {
- this.getcontactFromString(data.getExtras().getString(
- UserSelectActivity.RETURN_LIST));
- bindDataToList();
- }
- }
- private void getcontactFromString(String data) {
- if (data == null || data.length() == 0) {
- return;
- }
- String[] arrayContact = data.split("#");
- for (String singleContact : arrayContact) {
- if (singleContact != null && singleContact.length() > 0) {
- String[] props = singleContact.split(":");
- if (props.length == 2) {
- Map<String,String> contact = new HashMap<String,String>();
- contact.put("name", props[0]);
- contact.put("phone", props[1]);
- contacts.add(contact);
- }
- }
- }
- }
- private void bindDataToList(){
- this.setListAdapter(new MyAdapter());
- }
- public class MyAdapter extends BaseAdapter{
- public int getCount() {
- // TODO Auto-generated method stub
- return contacts.size();
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return contacts.get(position);
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- LayoutInflater inflater = SendMain.this.getLayoutInflater();
- final View view = inflater.inflate(R.layout.layout_user_item, null);
- final TextView textPhone = (TextView) view.findViewById(R.id.text1);
- final TextView textName = (TextView) view.findViewById(R.id.text2);
- Button button = (Button)view.findViewById(R.id.buttonDelete);
- textPhone.setText(contacts.get(position).get("phone"));
- textName.setText(contacts.get(position).get("name"));
- button.setTag( position);
- button.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- // TODO Auto-generated method stub
- int position = Integer.parseInt(v.getTag().toString());
- contacts.remove(position);
- MyAdapter.this.notifyDataSetChanged();
- // SendMain.this.getListView().refreshDrawableState();
- }});
- return view;
- }
- }
- }
6.Android ListView 清单与其Trigger 触发事件
Android ListView 清单与其选择时的触发事件,
可以参考下面的程式范例 :
- public class helloWorld extends Activity {
- String[] vData = null;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 要做为ArrayAdapter的资料来源
- vData = new String[]{"足球","棒球","篮球"};
- // 建立"阵列接收器"
- ArrayAdapter<String> arrayData = new ArrayAdapter<String>(
- this
- , android.R.layout.simple_list_item_1
- , vData
- );
- // 建立ListView 物件
- ListView lv = new ListView(this);
- // 设定ListView 的接收器, 做为选项的来源
- lv . setAdapter ( arrayData );
- // ListView 设定Trigger
- lv . setOnItemClickListener ( new OnItemClickListener() {
- public void onItemClick (AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
- // TODO Auto-generated method stub
- setTitle( getResources().getString(R.string.app_name) + ": " + vData [ arg2 ]);
- }
- });
- // 设定ListView 为ContentView
- setContentView(lv);
- }
- }
7.ListView内容刷新问题
最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来。在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案。对于ListView与数据库的同步,高手们建议使用ContentProvider对象。但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法。这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法:
- OnClickListener listener2 = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Map<String, Object> m = new HashMap<String, Object>();
- String tiString = tv.getText().toString(); // 注意这里我为什么要取出这个EditText的内容
- m.put("prod_na", tiString); // 而不这样写 m.put("prod_na", tv.getText());
- m.put("prod_type", tiString); // 因为tv.getText()返回的是Editable对象,真正的数据是被缓存的,
- // 也就是说你后续的EditText改动都会影响之前添加的Item
- coll.add(m);
- // 取回Adapter对象,用于调用notifyDataSetChanged方法。
- SimpleAdapter sAdapter = (SimpleAdapter)lv.getAdapter();
- sAdapter.notifyDataSetChanged();
- }
- };
这里涉及到了Android中的MVC模式概念,如何存储数据,控制和显示。
你可以认为ListView是一个View,那么mode是什么呢?显然是SimpleAdapter对象,而Control又是什么呢?那只能是notifyDataSetChanged()了。当数据变化时,也就是SimpleAdapter所处理的数据变化了,那么我们就需要调用 notifyDataSetChanged 去通知View作出改变。
8.checkBox的显示和隐藏。
在listView中,每个item都有一个ChexBox,当显示的时候在listView外面设置一个按钮,点击显示和隐藏listView中所有的checBox;
开始的我的实现方法为:
Button add = (Button)findViewById(R.id.add);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(flage){checkBox.setVisibility(View.VISIBLE);flage=!flage;}
else{checkBox.setVisibility(View.GONE);flage=!flage;}
}
});
后来发现,只能改变listView中第一个checBox,对listView中其他的item不起作用。
以上做法不对,正确的做法是在Adapter中的getView中设置隐藏和显示,做法如下:
在getView中,
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);
if(flage){checkBox.setVisibility(View.VISIBLE);}
else{checkBox.setVisibility(View.GONE);}
然后在按钮点击事件中:
@Override
public void onClick(View v) {
flage=!flage;
mySubscriptionsListAdapt.notifyDataSetChanged();
}
notifyDataSetChanged();是实现listView刷新的功能,不需要再次加载整个listView。
源代码见:http://henzil.googlecode.com/svn/trunk/android.ListAsyncActivty/
10.ListView隔行设置颜色
- import java.util.HashMap;
- import java.util.List;
- import android.content.Context;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.SimpleAdapter;
- public class SpecialAdapter extends SimpleAdapter {
- private int[] colors = new int[] { 0x30FF0000, 0x300000FF };
- public SpecialAdapter(Context context, List<HashMap<String, String>> items, int resource, String[] from, int[] to) {
- super(context, items, resource, from, to);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = super.getView(position, convertView, parent);
- int colorPos = position % colors.length;
- view.setBackgroundColor(colors[colorPos]);
- return view;
- }
- }
- SpecialAdapter adapter = new SpecialAdapter(this,fillMaps,R.layout.grid_item,from,to);
- ...
11.ListView横向移动
public class MyListView extends LinearLayout implements OnGestureListener {private GestureDetector mGestureDetector;
private ListView mListView;
public MyListView(Context context) {
super(context);
mGestureDetector = new GestureDetector(this);
mListView = new ListView(context);
String[] items = createStrings();
mListView.setAdapter(new ArrayAdapter<String>(context,
android.R.layout.simple_list_item_single_choice, items));
mListView.setCacheColorHint(Color.TRANSPARENT);
mListView.setScrollBarStyle(SCROLLBARS_OUTSIDE_INSET);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Log.i("info", "click");
}
});
this.addView(mListView, new LinearLayout.LayoutParams(350, LayoutParams.FILL_PARENT));
}
@Override
public boolean onDown(MotionEvent arg0) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//empty
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
int scrollWidth = mListView.getWidth() - this.getWidth();
if ((this.getScrollX() >= 0) && (this.getScrollX() <= scrollWidth) && (scrollWidth > 0)) {
int moveX = (int)distanceX;
if (((moveX + this.getScrollX()) >= 0) && ((Math.abs(moveX) + Math.abs(this.getScrollX())) <= scrollWidth)) {
this.scrollBy(moveX, 0);
}
else {
if (distanceX >= 0) {
this.scrollBy(scrollWidth - Math.max(Math.abs(moveX), Math.abs(this.getScrollX())), 0);
}
else {
this.scrollBy(-Math.min(Math.abs(moveX), Math.abs(this.getScrollX())), 0);
}
}
}
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//empty
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
mGestureDetector.onTouchEvent(ev);
super.dispatchTouchEvent(ev);
return true;
}
private String[] createStrings() {
return new String[] {
"Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
"Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
"Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
"Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
"Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
"Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
"Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
"Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
"Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
"Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
"Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
"Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
"Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
"Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
"Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
"Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
"Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
"Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
"Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
"Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
"Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
"Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo"
转自:http://blog.csdn.net/skydsai/article/details/6745277
- ListView 资源整理
- ListView 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- 资源整理
- listview --> OwnerData 整理
- listview常见问题整理
- 十四周实验报告1:学会使用函数的递归
- LINUX 查看CUP温度
- 分享一款wordpress个人博客主题模板快速制作利器(全傻瓜式制作)
- maven nexus 最佳实践
- 拓扑排序
- ListView 资源整理
- wamp包安装后无法运行:Exception Exception in module wampmanager.exe at 000F15A0.
- poj 2771 二分图最大独立集 学生出游
- AudioPlayer的处理流程
- Android的传感器HAL层的书写---基础篇
- 疯人院之大家别去美国,一个愚蠢而落后的国度
- sfkasnlkfaslkdasjkldjas;kdl
- 第二周实验报告(3-2)
- 将输入字符串转化为合法的文件名称