当前位置: 代码迷 >> Android >> Android ListView 事件监听 || 关于ListView选中时展示的效果
  详细解决方案

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

热度:53   发布时间:2016-05-01 16:41:59.0
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:[email protected]* @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);                                                        }                });        }}













  相关解决方案