`
zkl_1987
  • 浏览: 245746 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 笔记——listView应用

阅读更多
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作出改变。


分享到:
评论
2 楼 凌寒_微雨 2013-02-28  
总结的很好
1 楼 sunnyboyi 2011-11-03  
mark一下,学习了,很快就会用到,感谢楼主分享。

相关推荐

    Android学习笔记(十)——实现新闻列表

    【第一部分】历史文章: Android学习笔记(一)——创建第一个Android项目 ...Android学习笔记(六)——自定义ListView布局+AsyncTask异步任务 Android学习笔记(七)——数据存储(共享参数Share

    Android Training学习笔记——Navigation 参考源码(ListView版)

    总之,通过阅读和理解这篇“Android Training学习笔记——Navigation 参考源码(ListView版)”,开发者可以获得关于如何在Android应用中创建基于ListView的导航系统的宝贵经验。源码分析将加深对Navigation组件和...

    Android Training学习笔记——RecyclerView和CardView

    这篇“Android Training学习笔记”主要围绕这两个组件展开,旨在帮助开发者提升他们的Android应用设计能力。 RecyclerView是Android SDK提供的一种列表视图控件,取代了早期的ListView。RecyclerView的优势在于它的...

    Android学习笔记——Menu介绍(二)

    上下文菜单和上下文操作模式都是Android中增强用户体验的重要工具,它们可以根据应用的需求灵活地提供针对特定内容的操作选项。理解并熟练运用这些菜单类型,可以帮助开发者创建更加直观和功能丰富的用户界面。

    安卓Android源码——适合新手的简单记事本项目.zip

    这个压缩包文件“安卓Android源码——适合新手的简单记事本项目.zip”是一个专为初学者设计的Android应用项目,旨在帮助他们理解和学习Android应用开发的基础知识。项目中的源码是一个简单的记事本应用程序,它能...

    【安卓项目】——新闻资讯类项目

    Android学习笔记(六)——自定义ListView布局+AsyncTask异步任务 Android学习笔记(七)——数据存储(共享参数SharedPreferences) Android学习笔记(八)——数据存储(SD卡文件操作) Android学习笔记(九)——...

    免费 android 应用 源代码——记事本

    标题中的“免费 android 应用 源代码——记事本”表明这是一份关于Android应用开发的资源,特别是一个记事本应用的源代码。记事本应用是Android平台上常见的学习示例,它通常涉及到基础的用户界面设计、数据存储以及...

    Android学习笔记(十二)——数据存储(SQLite数据库)

    【第一部分】历史文章: Android学习笔记(一)——创建第一个Android项目 ...Android学习笔记(六)——自定义ListView布局+AsyncTask异步任务 Android学习笔记(七)——数据存储(共享参数Share

    Android项目源码本站第N个记事本简易笔记

    【Android项目源码详解——构建简易笔记应用】 在Android开发中,创建一个简易的笔记应用是初学者常常会遇到的任务,也是进阶开发者巩固基础知识的良好实践。本项目源码提供了这样一个平台,帮助开发者理解Android...

    Android学习笔记(四)源码

    这份学习笔记深入探讨了ListView的源码,对于理解Android UI框架的运作机制非常有帮助,有助于开发者编写更高效、流畅的ListView应用。在实际项目中,结合ListView的相关知识点,可以更好地优化用户体验,尤其是在...

    Android记事本程序代码

    在这个记事本应用中,我们可能会看到一个ListView用于显示所有笔记的标题,一个EditText用于输入新笔记的内容,以及一系列Button用于创建、编辑、删除和保存笔记。开发者可能使用XML布局文件来定义这些元素,并通过...

    android——自定义日历+记事本

    1. 数据存储:Android提供了SQLite数据库,可以创建一个笔记表,包含笔记标题、内容、日期等字段,用于存储用户创建的记事。 2. 内容编辑:使用EditText组件,让用户输入记事内容,结合Button组件实现保存和取消功能...

    Android 小应用程序

    【Android小应用程序——深入探索NotePad】 Android小应用程序是Android操作系统中的一种轻量级应用,它们通常具有特定的功能,如记事本应用NotePad。NotePad是一个基础的、用于记录和管理简单文本笔记的应用,它是...

    Android下拉刷新ListView——RTPullListView(demo)

    之前在我的文章《IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新》中介绍过如何在IOS上实现下拉刷新的功能。今天主要介绍下在Android上实现下拉刷新的Demo,下拉控件参考自Github上开源项目PullToRefresh,并...

    2011.09.23——— android sample之Notepad(context menu)

    标题中的“2011.09.23——— android sample之Notepad(context menu)”表明这是一个关于Android应用开发的示例项目,具体是针对Notepad应用的上下文菜单(Context Menu)功能的实践。在Android开发中,上下文菜单是...

    阅读txt文本的计事本、批量删除等功的android源码NotesApp

    【Android源码解析——NotesApp应用开发】 在Android开发中,NotesApp是一个常见的示例应用,它涵盖了多种基本功能,如阅读TXT文本、记事本功能以及批量删除操作。这个应用可以帮助开发者理解Android应用程序的基本...

    android开发笔记

    此外,可能会涉及到更复杂的用户交互,如Dialog、PopupWindow、ListView、RecyclerView等,这些都是Android应用中常见的组件。同时,会讲解Adapter模式在数据展示中的应用,以及如何自定义Adapter。 在数据存储方面...

    android开发资料大全

    新版Android开发教程及笔记-完整版 《Android中文教程》中文版 《android基础教程合集》 Android实例教程 会员贡献索引贴 实用Android开发工具和资源精选 APK权限大全 - Android必懂知识 最无私的Android资料...

Global site tag (gtag.js) - Google Analytics