读书人

android listView的运用

发布时间: 2012-09-02 21:00:34 作者: rapoo

android listView的使用

记录和恢复ListView滚动的位置
有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码:

Java代码 android listView的运用android listView的运用
  1. //列表滚动
  2. private OnScrollListener ScrollLis = new OnScrollListener() {
  3. @Override
  4. public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
  5. }
  6. @Override
  7. public void onScrollStateChanged(AbsListView view, int scrollState) {
  8. if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
  9. ListPos=list.getFirstVisiblePosition(); //ListPos记录当前可见的List顶端的一行的位置
  10. }
  11. }
  12. };




接下来就是还原位置,放在ListView加载之后:


Java代码 android listView的运用android listView的运用
  1. 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()方法

以下为实现的一个实例

Java代码 android listView的运用android listView的运用
  1. package com.jason.joysmsyd;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import android.app.ListActivity;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.view.Window;
  13. import android.view.View.OnClickListener;
  14. import android.widget.BaseAdapter;
  15. import android.widget.Button;
  16. import android.widget.EditText;
  17. import android.widget.TextView;
  18. public class SendMain extends ListActivity implements OnClickListener{
  19. Button buttonMessage,buttonContact,buttonHistory;
  20. EditText textMessage;
  21. List<map> contacts = new ArrayList<map>();
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. // TODO Auto-generated method stub
  25. super.onCreate(savedInstanceState);
  26. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  27. this.setContentView(R.layout.layout_send);
  28. buttonMessage = (Button) this.findViewById(R.id.ButtonMessage);
  29. buttonContact = (Button) this.findViewById(R.id.ButtonContact);
  30. buttonHistory = (Button) this.findViewById(R.id.ButtonHistory);
  31. textMessage = (EditText)this.findViewById(R.id.EditTextMessage);
  32. textMessage.setText(this.getIntent().getExtras().getString("message"));
  33. }
  34. public void onClick(View v) {
  35. // TODO Auto-generated method stub
  36. switch(v.getId()){
  37. case R.id.ButtonMessage:
  38. this.finish();
  39. break;
  40. case R.id.ButtonContact:
  41. {
  42. Intent intent = new Intent();
  43. intent.setAction("com.jason.action.contact");
  44. this.startActivityForResult(intent, 0);
  45. }
  46. break;
  47. case R.id.ButtonHistory:
  48. {
  49. Intent intent = new Intent();
  50. intent.setAction("com.jason.action.history");
  51. this.startActivityForResult(intent, 1);
  52. }
  53. break;
  54. }
  55. }
  56. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  57. // TODO Auto-generated method stub
  58. super.onActivityResult(requestCode, resultCode, data);
  59. if (requestCode == 0 && resultCode == RESULT_OK) {
  60. this.getcontactFromString(data.getExtras().getString(
  61. UserSelectActivity.RETURN_LIST));
  62. bindDataToList();
  63. }
  64. }
  65. private void getcontactFromString(String data) {
  66. if (data == null || data.length() == 0) {
  67. return;
  68. }
  69. String[] arrayContact = data.split("#");
  70. for (String singleContact : arrayContact) {
  71. if (singleContact != null && singleContact.length() > 0) {
  72. String[] props = singleContact.split(":");
  73. if (props.length == 2) {
  74. Map contact = new HashMap();
  75. contact.put("name", props[0]);
  76. contact.put("phone", props[1]);
  77. contacts.add(contact);
  78. }
  79. }
  80. }
  81. }
  82. private void bindDataToList(){
  83. this.setListAdapter(new MyAdapter());
  84. }
  85. public class MyAdapter extends BaseAdapter{
  86. public int getCount() {
  87. // TODO Auto-generated method stub
  88. return contacts.size();
  89. }
  90. public Object getItem(int position) {
  91. // TODO Auto-generated method stub
  92. return contacts.get(position);
  93. }
  94. public long getItemId(int position) {
  95. // TODO Auto-generated method stub
  96. return position;
  97. }
  98. public View getView(int position, View convertView, ViewGroup parent) {
  99. // TODO Auto-generated method stub
  100. LayoutInflater inflater = SendMain.this.getLayoutInflater();
  101. final View view = inflater.inflate(R.layout.layout_user_item, null);
  102. final TextView textPhone = (TextView) view.findViewById(R.id.text1);
  103. final TextView textName = (TextView) view.findViewById(R.id.text2);
  104. Button button = (Button)view.findViewById(R.id.buttonDelete);
  105. textPhone.setText(contacts.get(position).get("phone"));
  106. textName.setText(contacts.get(position).get("name"));
  107. button.setTag( position);
  108. button.setOnClickListener(new OnClickListener(){
  109. public void onClick(View v) {
  110. // TODO Auto-generated method stub
  111. int position = Integer.parseInt(v.getTag().toString());
  112. contacts.remove(position);
  113. MyAdapter.this.notifyDataSetChanged();
  114. // SendMain.this.getListView().refreshDrawableState();
  115. }});
  116. return view;
  117. }
  118. }
  119. }



Android ListView 清单与其Trigger 触发事件

Android ListView 清单与其选择时的触发事件,

可以参考下面的程式范例 :

Java代码 android listView的运用android listView的运用
  1. public class helloWorld extends Activity {
  2. String[] vData = null;
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. // 要做为ArrayAdapter的资料来源
  6. vData = new String[]{"足球","棒球","篮球"};
  7. // 建立"阵列接收器"
  8. ArrayAdapter arrayData = new ArrayAdapter(
  9. this
  10. , android.R.layout.simple_list_item_1
  11. , vData
  12. );
  13. // 建立ListView 物件
  14. ListView lv = new ListView(this);
  15. // 设定ListView 的接收器, 做为选项的来源
  16. lv . setAdapter ( arrayData );
  17. // ListView 设定Trigger
  18. lv . setOnItemClickListener ( new OnItemClickListener() {
  19. public void onItemClick (AdapterView arg0, View arg1, int arg2,
  20. long arg3) {
  21. // TODO Auto-generated method stub
  22. setTitle( getResources().getString(R.string.app_name) + ": " + vData [ arg2 ]);
  23. }
  24. });
  25. // 设定ListView 为ContentView
  26. setContentView(lv);
  27. }
  28. }


android listView的运用
android listView的运用
android listView的运用


Android中的ListView内容刷新问题

最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来。在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案。对于ListView与数据库的同步,高手们建议使用 ContentProvider对象。但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法。这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法:

Java代码 android listView的运用android listView的运用
  1. OnClickListener listener2 = new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. Map m = new HashMap();
  6. String tiString = tv.getText().toString(); // 注意这里我为什么要取出这个EditText的内容
  7. m.put("prod_na", tiString); // 而不这样写 m.put("prod_na", tv.getText());
  8. m.put("prod_type", tiString); // 因为tv.getText()返回的是Editable对象,真正的数据是被缓存的,
  9. // 也就是说你后续的EditText改动都会影响之前添加的Item
  10. coll.add(m);
  11. // 取回Adapter对象,用于调用notifyDataSetChanged方法。
  12. SimpleAdapter sAdapter = (SimpleAdapter)lv.getAdapter();
  13. sAdapter.notifyDataSetChanged();
  14. }
  15. };



这里涉及到了Android中的MVC模式概念,如何存储数据,控制和显示。

你可以认为ListView是一个View,那么mode是什么呢?显然是SimpleAdapter对象,而Control又是什么呢?那只能是notifyDataSetChanged()了。当数据变化时,也就是SimpleAdapter所处理的数据变化了,那么我们就需要调用 notifyDataSetChanged 去通知View作出改变。


读书人网 >Android

热点推荐