Android ListView常用用法(二)
2013-02-20 21:51
746 查看
来自:51CTO论坛
原帖:http://mobile.51cto.com/android-254823.htm
Android开发:实现带图片和checkbox的listview
项目要用到一个listview,要求是可以显示图片,后面还有有复选框。
先新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,我这儿由于是测试的,所以把数据写死了。
Java代码
上面类中要注意getView()方法中对数据的处理。
接下要新建一个list.xml文件,这个就是布局image、textview、checkbox。
Java代码
android:layout_weight="1"这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。
这三句很重要,如果不加就会出现错误。
由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。
接下来在main.xml中添加Listview组件
Java代码
接下来就是在activity中调用:
Java代码
最新看一下效果图:
要获取哪些项目被选择了,可以这样测试:
Java代码
总结:
1、数据可以在Activity中获取,在初始化Adapter的时候当做参数传递过去,这样就可以是list编程动态的。
2、对MyAdapter中getview的理解不够,尤其是convertView.setTag(holder),如果您对getview有什么新的使用心得可以发Email:zhousn@51cto.com,51CTO将与您一起分享!
【编辑推荐】
Android 抱怨它还是拥抱它?
Android触屏textview及listview对比验证
Android ListView复杂使用方式简单理解
来自:http://zkl-1987.iteye.com/blog/1051311
android上改变listView的选中颜色
ListView选中时默认是***,很多时候会和我们软件的配色不符合,那么我就教你如何修改默认的ListView配色,改变ListView选中颜色有两个方法:
1. 在程序中:
2. 在xml里面的ListView标签下添加:
记录和恢复ListView滚动的位置
有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码:
接下来就是还原位置,放在ListView加载之后:
关于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 是一个图片资源
ListView拖动时背景黑色的问题
我们知道在Android中ListView是一个比较常用的UI控件,我们在大部分开发中都需要用到它,因此Android为我们提供了ListView的多种实现方法,通过自定义显示布局让显示的内容更加美观,但是我们会发现这样一个问题,当我们操作ListView的时候,如果不使用手机上下按键的时候,直接用触摸拖动视图的方式,会发现ListView的背景一片黑色,而且所有被选中的文字都变成一片漆黑。
其实这个问题发生的原因在于ListView存在缓存颜色机制,因此我们可以通过设定缓存颜色为透明的方法来解决这个问题。ATAAW.COM提供两个解决方法供大家使用,如下所示:
A、通过布局属性来设定(ListView的属性中直接定义)
android:cacheColorHint=”#00000000″
B、在代码中直接设定
listView.setCacheColorHint(Color.TRANSPARENT);
这样就可以解决黑色出现的问题了。
ListView 中添加按钮,动态删除添加ItemView的操作
要实现添加按钮的操作,必须自定义Adapter,使用Button View的setTag()方法,将Button所属的位置设置到tag当中
要实现动态添加删除ItemView的操作,必须首先调整调整Adapter所绑定的数据源,然后调用Adapter的notifyDataSetChanged()方法
以下为实现的一个实例
Android ListView 清单与其Trigger 触发事件
Android ListView 清单与其选择时的触发事件,
可以参考下面的程式范例 :
Android中的ListView内容刷新问题
最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来。在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案。对于ListView与数据库的同步,高手们建议使用ContentProvider对象。但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法。这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法:
这里涉及到了Android中的MVC模式概念,如何存储数据,控制和显示。
你可以认为ListView是一个View,那么mode是什么呢?显然是SimpleAdapter对象,而Control又是什么呢?那只能是notifyDataSetChanged()了。当数据变化时,也就是SimpleAdapter所处理的数据变化了,那么我们就需要调用 notifyDataSetChanged 去通知View作出改变。
原帖:http://mobile.51cto.com/android-254823.htm
Android开发:实现带图片和checkbox的listview
项目要用到一个listview,要求是可以显示图片,后面还有有复选框。
先新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,我这儿由于是测试的,所以把数据写死了。
Java代码
package com.zwq.umeng; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<Map<String, Object>> mData; public static Map<Integer, Boolean> isSelected; public MyAdapter(Context context) { mInflater = LayoutInflater.from(context); init(); } //初始化 private void init() { mData=new ArrayList<Map<String, Object>>(); for (int i = 0; i < 5; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("img", R.drawable.icon); map.put("title", "第" + (i + 1) + "行的标题"); mData.add(map); } //这儿定义isSelected这个map是记录每个listitem的状态,初始状态全部为false。 isSelected = new HashMap<Integer, Boolean>(); for (int i = 0; i < mData.size(); i++) { isSelected.put(i, false); } } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; //convertView为null的时候初始化convertView。 if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.vlist, null); holder.img = (ImageView) convertView.findViewById(R.id.img); holder.title = (TextView) convertView.findViewById(R.id.title); holder.cBox = (CheckBox) convertView.findViewById(R.id.cb); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img.setBackgroundResource((Integer) mData.get(position).get( "img")); holder.title.setText(mData.get(position).get("title").toString()); holder.cBox.setChecked(isSelected.get(position)); return convertView; } public final class ViewHolder { public ImageView img; public TextView title; public CheckBox cBox; } }
上面类中要注意getView()方法中对数据的处理。
接下要新建一个list.xml文件,这个就是布局image、textview、checkbox。
Java代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical"/> <TextView android:id="@+id/title" android:textSize="18dip" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:checkMark="?android:attr/listChoiceIndicatorMultiple"/> </LinearLayout>
android:layout_weight="1"这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。
android:focusable="false" android:focusableInTouchMode="false" android:clickable="false"
这三句很重要,如果不加就会出现错误。
由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。
接下来在main.xml中添加Listview组件
Java代码
<ListView android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
接下来就是在activity中调用:
Java代码
list=(ListView)findViewById(R.id.lv); MyAdapter adapter=new MyAdapter(this); list.setAdapter(adapter); list.setItemsCanFocus(false); list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); list.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ViewHolder vHollder = (ViewHolder) view.getTag(); //在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。 vHollder.cBox.toggle(); MyAdapter.isSelected.put(position, vHollder.cBox.isChecked()); } });
最新看一下效果图:
要获取哪些项目被选择了,可以这样测试:
Java代码
OnClickListener bPop = new OnClickListener() { @Override public void onClick(View v) { for(int i=0;i<list.getCount();i++){ if(MyAdapter.isSelected.get(i)){ ViewHolder vHollder = (ViewHolder) list.getChildAt(i).getTag(); Log.i(TAG, "--onClick --"+vHollder.title.getText()); } } } };
总结:
1、数据可以在Activity中获取,在初始化Adapter的时候当做参数传递过去,这样就可以是list编程动态的。
2、对MyAdapter中getview的理解不够,尤其是convertView.setTag(holder),如果您对getview有什么新的使用心得可以发Email:zhousn@51cto.com,51CTO将与您一起分享!
【编辑推荐】
Android 抱怨它还是拥抱它?
Android触屏textview及listview对比验证
Android ListView复杂使用方式简单理解
来自:http://zkl-1987.iteye.com/blog/1051311
android上改变listView的选中颜色
ListView选中时默认是***,很多时候会和我们软件的配色不符合,那么我就教你如何修改默认的ListView配色,改变ListView选中颜色有两个方法:
1. 在程序中:
Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback); ListView.setSelector(drawable);
2. 在xml里面的ListView标签下添加:
android:listSelector=”#00000000″ //后面的颜色可以自己定这样写是透明的
记录和恢复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);
关于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 是一个图片资源
ListView拖动时背景黑色的问题
我们知道在Android中ListView是一个比较常用的UI控件,我们在大部分开发中都需要用到它,因此Android为我们提供了ListView的多种实现方法,通过自定义显示布局让显示的内容更加美观,但是我们会发现这样一个问题,当我们操作ListView的时候,如果不使用手机上下按键的时候,直接用触摸拖动视图的方式,会发现ListView的背景一片黑色,而且所有被选中的文字都变成一片漆黑。
其实这个问题发生的原因在于ListView存在缓存颜色机制,因此我们可以通过设定缓存颜色为透明的方法来解决这个问题。ATAAW.COM提供两个解决方法供大家使用,如下所示:
A、通过布局属性来设定(ListView的属性中直接定义)
android:cacheColorHint=”#00000000″
B、在代码中直接设定
listView.setCacheColorHint(Color.TRANSPARENT);
这样就可以解决黑色出现的问题了。
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; } } }
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); } }
Android中的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作出改变。
相关文章推荐
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法
- Android ListView 常用用法(一)
- Android ListView常用用法
- 【Android成长之路】最常用和最难用的控件——ListView的浅谈(ListView 的简单用法)
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法
- Android ListView常用用法 (实现文字图片和按钮)
- Android ListView常用用法【转】
- Android ListView常用用法
- Android ListView 常用用法(三)
- Android ListView常用用法
- Android ListView常用用法
- 【转】主题:Android ListView常用用法(加入点击和长按响应)
- Android常用控件之GridView与ExpandableListView的用法
- Android ListView 常用用法
- Android ListView 常用用法(一)
- Android常用控件之GridView与ExpandableListView的用法