`
lufengdie
  • 浏览: 247875 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Android ListView 事件监听 || 关于ListView选中时显示的效果。

阅读更多
Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。


1,BaseAdapter:---数据来源于Arraylist-->MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:



@Override  
        public int getCount() {   
            // TODO Auto-generated method stub   
            System.out.println("the size is\t" +            MyArraylist.size());   
            return MyArraylist.size();   
        }  



getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.



public View getView(int position, View v, ViewGroup parent) {   
            // TODO Auto-generated method stub   
               
            View view;   
            if (v == null) {   
                view = mInflater.inflate(R.layout.track_list_item, null);   
            } else {   
                view = v;   
            }}  





通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。


2,SimpleCursorAdapter:---数据来源于数据库--->MyCursor
转自:http://blog.csdn.net/wong_judy/archive/2010/04/09/5466583.aspx

要实现bindView()和newView()这两个抽象方法需要实现的内容。

public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。

public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。



通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。


注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。

对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。

注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常。





==================================================================


关于ListView选中时显示的效果。



方法一:


通过给listview设置 android:listSelector这个属性,就可以对其下的所有item设定state_focused 时的背景变化

方法二:

实际上很简单,就是点击一下改变listviewitem的背景



public void changeBg(int position){

                isFocused[whichClick==-1?0:whichClick] = false;

                whichClick = position;

                isFocused[position] = true;

                notifyDataSetChanged();
        }





转载自: http://www.eoeandroid.com/thread-52160-1-1.html



package com.ui.demo;
import java.util.List;
import java.util.Map;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class MyArrayAdapter extends BaseAdapter{

        private static List<Map<String,String>> list;
        
        private LayoutInflater mInflater;
        
        private ViewHolder holder;
        //alertdialog 被选中初始化false
        private static boolean[] isFocused ;
        
        private static int whichClick = -1;
        Context mContext;
        public MyArrayAdapter(Context context,List<Map<String,String>> objects){
                
                list = objects;
                mContext = context;
                mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                
                isFocused = new boolean[objects.size()];
                
                for(int i=0;i<objects.size();i++){
                        
                        isFocused[i] = false;
                }
        }
        
        public int getCount() {
                
                return list.size();
        }

        public Object getItem(int position) {
                
                return list.get(position);
        }

        public long getItemId(int position) {
                
                return position;
        }

        public void changeBg(int position){
                
                isFocused[whichClick==-1?0:whichClick] = false;
                
                whichClick = position;
                
                isFocused[position] = true;
                
                notifyDataSetChanged();
        }
        
        public View getView(int position, View convertView, ViewGroup parent) {
                
                if (convertView == null) {
                        
            convertView = mInflater.inflate(R.layout.musiccategories, null);

            holder = new ViewHolder();
            
            holder.s_Name = (TextView) convertView.findViewById(R.id.s_name);
            holder.btnTest = (Button) convertView.findViewById(R.id.btnTest);
            holder.btnTest.setText("Kaden");
            holder.btnTest.setOnClickListener(new View.OnClickListener() {
                                
                                @Override
                                public void onClick(View v) {
                                        Toast.makeText(mContext, "Button clicked.", Toast.LENGTH_SHORT).show();
                                        
                                }
                        });
            
            convertView.setTag(holder);
        } else {
            // Get the ViewHolder back to get fast access to the TextView
            // and the ImageView.
            holder = (ViewHolder) convertView.getTag();
        }
                
                convertView.setBackgroundResource(isFocused[position]?R.drawable.btn_down_bg:R.drawable.btn_up_bg);
                
                //holder.s_Name.setText(list.get(position).get(WebTools.SON_GEMING));
                
                return convertView;
        }

        static class ViewHolder {
                
        TextView s_Name;
        Button btnTest;
        }
}






package com.ui.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

/**   
* @Title: ListviewTest.java
* @Package com.ui.demo
* @Description: TODO
* @author Kaden Kang E-mail:cumtkangyi@gmail.com
* @version Create date: 2010-11-29下午12:10:13
* @version V1.0   
*/

public class ListviewTest extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.my_listview);
                
                List<Map<String, String>> listItem = new ArrayList<Map<String, String>>();
                Map<String, String> map;
                map = new HashMap<String, String>();
                map.put("ItemTitle", "China");
                map.put("ItemInfo", "+86");
                listItem.add(map);
                map = new HashMap<String, String>();
                map.put("ItemTitle", "Iran");
                map.put("ItemInfo", "+98");
                listItem.add(map);
                map = new HashMap<String, String>();
                map.put("ItemTitle", "Iraq");
                map.put("ItemInfo", "+964");
                listItem.add(map);
                map = new HashMap<String, String>();
                map.put("ItemTitle", "Ireland");
                map.put("ItemInfo", "+353");
                listItem.add(map);
                map = new HashMap<String, String>();
                map.put("ItemTitle", "Israel");
                map.put("ItemInfo", "+972");
                listItem.add(map);
                map = new HashMap<String, String>();
                map.put("ItemTitle", "American");
                map.put("ItemInfo", "+001");
                listItem.add(map);
                
                ListView listView = (ListView)findViewById(R.id.mListView);
                final MyArrayAdapter adapter = new MyArrayAdapter(this, listItem);
                listView.setAdapter(adapter);
                
                listView.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                                adapter.changeBg(arg2);
                                
                        }
                });
        }

}














分享到:
评论

相关推荐

    android listView 改变选中行的 字体颜色和 图片

    要改变ListView选中行的字体颜色和图片,我们需要理解ListView的工作原理,以及如何自定义其Adapter和视图。以下是一些关键知识点的详细介绍: 1. **ListView的基本使用**: - ListView是一个视图容器,它能加载...

    listview的item侧滑事件监听

    4. **处理侧滑事件**:在识别到侧滑手势后,可以对ListView的当前选中项执行相应的操作,例如显示删除按钮或者直接执行删除操作。这个过程通常需要配合Adapter来完成,因为Adapter是连接ListView和数据源的桥梁。 5...

    Android中listView选中第一行,或任意一行,选中后能取消

    为了实现选中效果,我们可以自定义一个监听器,监听ListView的点击事件。这可以通过实现`OnItemClickListener`接口来完成: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @...

    Android ListView 选中效果 自定义

    此外,还可以通过监听ListView的OnItemClickListener和OnItemSelectedListener事件,动态改变选中项的状态。例如,当项被点击时,可以通过`setItemChecked()`方法来设置选中状态,并更新对应的背景。 总之,自定义...

    ListView默认Item选中状态

    ListView的默认行为是不设置任何项为选中状态,但有时我们希望在应用启动时,第一个Item能自动呈现出选中效果,以引导用户或者突出初始焦点。本教程将深入讲解如何实现ListView的第一个Item的默认选中状态。 首先,...

    Android完美解决listview中多个edittext显示混乱问题

    - 从文件名推断,这可能是一个关于进度条显示的示例,可能与EditText和ListView的交互有关,比如在用户输入时显示加载进度,或者处理网络请求等。 综上所述,解决Android ListView中多个EditText显示混乱的问题...

    Android ListView item 选中高亮显示

    本篇文章将详细探讨如何实现Android ListView item的选中高亮显示。 1. **自定义Adapter** 首先,你需要创建一个自定义的Adapter来填充ListView。Adapter是连接数据源和ListView的桥梁,通过它,我们可以将数据...

    Android】ListView监听上下滑动实现一键置顶

    本教程将深入讲解如何监听ListView的上下滑动事件,并实现下拉刷新、上拉加载以及一键置顶的功能。 首先,我们要理解ListView的工作原理。ListView通过复用视图(ViewHolder模式)来提高性能,当用户滚动时,不再...

    Android 双ListView 联动

    3. 协调滚动:为了保持联动效果,可能需要监听两个ListView的滚动事件,当一个ListView滚动时,同步调整另一个ListView的位置,确保展示的内容与用户选择的层级对应。 三、联动实现方式 1. 通过接口:定义一个接口...

    Android ListVIew复制粘贴的实现

    4. 设置ListView的OnItemClickListener,监听单击事件,当用户点击某一行时,获取选中行的数据,创建ClipData并调用ClipboardManager的setPrimaryClip()方法。 5. 为ListView注册长按事件,通过Override `...

    Android ListView选中高亮显示

    当我们需要在用户点击ListView的某一项时,让它有明显的视觉反馈,即“选中高亮显示”,这就需要用到ListView的选中状态处理。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解ListView的工作原理。...

    解决ListView嵌套CheckBox滑动时选中状态错乱

    在Android开发中,ListView是常用的数据展示控件,它可以有效地展示大量数据并实现滚动效果。然而,当ListView内部嵌套CheckBox等可交互组件时,常常会遇到一些问题,特别是滑动过程中选中状态错乱的现象。这个问题...

    android listView 单选 功能

    总之,要在Android中实现ListView的单选功能,关键在于创建一个带有选中状态的数据模型,自定义适配器以显示选中状态,以及设置点击事件来更新选中状态。在实际开发中,你可能还需要考虑其他因素,如动画效果、多...

    listview保留选中效果2

    以上就是实现ListView选中效果保留的一些常见方法。实际开发中,可能会结合使用多种技术来优化用户体验。记得在处理ListView时,考虑到性能问题,避免在getView()方法中执行昂贵的操作,如网络请求或数据库查询。...

    androidlistview里面使用radiobutton

    2. 在Adapter的getView方法中,根据position判断当前RadioButton是否应该被选中,避免因ListView的复用导致的显示问题。 3. 考虑使用RadioGroup包裹每个ListView项的RadioButton,这样可以自动处理单选逻辑,但可能...

    android listview 固定列头

    同时,它需要监听ListView的滚动事件,以便在用户滚动时保持列头的位置不变。 2. **列头布局**: 列头可以是一个自定义的布局,包含多个TextView或其他视图,用于显示列名。布局可以通过XML文件定义,也可以在代码...

    Listview选中效果

    默认情况下,ListView在选中某项时会自动高亮显示。你可以通过设置`android:listSelector`属性来定制选中状态下的背景颜色或图片。例如,在XML布局文件中,可以在ListView标签内添加以下代码: ```xml &lt;ListView...

    ListView选中item颜色改变

    "ListView选中item颜色改变"是常见的需求,它涉及到ListView的交互设计,使得用户可以通过视觉反馈感知到所选中的条目。本篇文章将深入探讨如何实现这个功能。 首先,我们需要了解ListView的基本工作原理。ListView...

    Android中ListView结合CheckBox获取选中项.rar

    本示例"Android中ListView结合CheckBox获取选中项.rar"旨在教授如何在ListView中集成CheckBox,并有效地获取用户选择的数据。 1. **ListView基本使用** - ListView是一个可以滚动的视图,它能显示一行行的数据。...

    android ListView简单示例

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据的列表,通常用于实现滚动效果。本示例将深入探讨如何在Android应用中使用ListView,包括它的基本使用、适配器(Adapter)机制以及一些高级特性...

Global site tag (gtag.js) - Google Analytics