zoukankan      html  css  js  c++  java
  • Android_自定义适配器

    目录

    一、自定义Adapter

    二、在布局文件中添加ListView标签

    三、编写行布局文件

    四、在Activity中编写代码

    五、ListView Item点击长按事件

    六、ListView 优化

    七、页面跳转传值

    一、在java/com.ryan.test下创建MyAdapter类,继承类BaseAdapter类

    public class MyAdapter extends BaseAdapter{
    
        //数据集合
        List<Map<String,Object>> list;
        //反射器
        LayoutInflater inflater;
    
        //构造器
        public MyAdapter(Context context) {
            this.inflater = LayoutInflater.from(context);
        }
    
        public void setList(List<Map<String, Object>> list) {
            this.list = list;
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            return list.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
    
        //实现getView方法
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //反射行布局
            View view = inflater.inflate(R.layout.item,null);
    
            //获取各个控件
            ImageView logo = (ImageView) convertView.findViewById(R.id.logo);
            TextView title = (TextView) convertView.findViewById(R.id.title);
            TextView version = (TextView) convertView.findViewById(R.id.version);
            TextView size = (TextView) convertView.findViewById(R.id.size);
    
            //给控件赋值
            Map map = list.get(position);
            logo.setImageResource((Integer) map.get("logo"));
            title.setText((String) map.get("title"));
            version.setText((String) map.get("version"));
            size.setText((String) map.get("size"));
    
            return view;
        }
    }

     

    二、在布局文件中添加ListView标签(main.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.ryan.test.MainActivity">
    
        <ListView
            android:listSelector="@drawable/item_selector"
            android:id="@+id/list_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    注:用Selector背景选择器实现Item项选中后的背景颜色改变

    res/drawable下item_selector.xml文件设置选中和未选中的颜色 透明色为#00000000

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/transparent" android:state_pressed="false"/>
        <item android:drawable="@color/choose" android:state_pressed="true"/>
    </selector>
    View Code

     

     

    三、编写行布局文件(item.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        android:descendantFocusability="blocksDescendants"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:padding="5dp"
            android:layout_margin="5dp"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical">
            <ImageView
                android:id="@+id/logo"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:src="@drawable/danger"
                />
            <LinearLayout
                android:layout_weight="1"
                android:orientation="vertical"
                android:layout_marginLeft="5dp"
                android:padding="5dp"
                android:layout_width="0dp"
                android:layout_height="wrap_content">
                <TextView
                    android:id="@+id/title"
                    android:layout_marginTop="3dp"
                    android:textSize="18sp"
                    android:text="危险品"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:id="@+id/version"
                    android:layout_marginTop="3dp"
                    android:textSize="12sp"
                    android:text="版本:1.0"
                    android:textColor="#999"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <TextView
                    android:id="@+id/size"
                    android:layout_marginTop="3dp"
                    android:textSize="12sp"
                    android:text="占用空间:20M"
                    android:textColor="#999"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            </LinearLayout>
                <Button
                android:text="卸载"
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="@drawable/btn_selector"
                android:textColor="#fff"
                android:textSize="18sp"
                />
        </LinearLayout>
    </LinearLayout>

    注:

    问题: 当点击某一行的时候, 没有背景色的变化
    原因: 行中包含了按钮, 按钮抢夺了焦点
    解决方案: 夺回焦点,在行布局中设置descendantFocusability属性



    四、在Activity中编写代码

    //1.获取ListView对象
    ListView list_main = (ListView) findViewById(R.id.list_main);
    
    
    //2.数据源
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("logo", R.drawable.danger);
    map.put("title", "千千静听");
    map.put("version", "版本: 8.4.0");
    map.put("size", "大小: 32.81M");
    list.add(map);
    
    
    
    //3. 准备适配器Adapter
    MyAdapter adapter = new MyAdapter(this);
    adapter.setList(list);
    
    //4. 将适配器关联到ListView
    list_main.setAdapter(adapter);

     

    五、ListView Item点击长按事件

    //5.监听item事件
    list_main.setOnItemClickListener(this);
    list_main.setOnItemLongClickListener(this);
       @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(this,"点击"+position,Toast.LENGTH_SHORT).show();
           
        }
    
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(this,"长按"+position,Toast.LENGTH_SHORT).show();
            return true;
        }

    注:长按事件onItemLongClick需要返回值

    如果希望长按事件后,不再触发点击事件,则应将返回值设为true

    六、ListView 优化

        public class ViewHolder{
            ImageView logo;
            TextView title;
            TextView version;
            TextView size;
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
    
            if(convertView == null){
                convertView = inflater.inflate(R.layout.item,null);
                holder = new ViewHolder();
                holder.logo = (ImageView) convertView.findViewById(R.id.logo);
                holder.title = (TextView) convertView.findViewById(R.id.title);
                holder.version = (TextView) convertView.findViewById(R.id.version);
                holder.size = (TextView) convertView.findViewById(R.id.size);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder)convertView.getTag();
            }
            
            Map map = list.get(position);
    
            holder.logo.setImageResource((Integer) map.get("logo"));
            holder.title.setText((String) map.get("title"));
            holder.version.setText((String) map.get("version"));
            holder.size.setText((String) map.get("size"));
    
            return convertView;
        }

    七、页面跳转传值

    1.创建一个独立的Activity

    public class DetailActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.detail);
    
            String index = getIntent().getStringExtra("index");
            String title = getIntent().getStringExtra("title");
            TextView info = (TextView) findViewById(R.id.info);
            info.setText("编号:"+index+"   标题:"+title);
        }
    }

    2.编写item点击事件,实现跳转操作

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //1.创建Intent对象
            Intent intent = new Intent();
            //2.设置跳转界面
            intent.setClass(this,DetailActivity.class);
            //传值
            HashMap<String,Object> itemMap = (HashMap<String,Object>)parent.getItemAtPosition(position);
    
            intent.putExtra("index",""+position);
            intent.putExtra("title",""+itemMap.get("title"));
            //3.跳转
            startActivity(intent);
        }
  • 相关阅读:
    高级搜索
    Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到的值然后返回POJO对象呢?
    hibernate继承关系映射和java反射机制的运用
    eclipse启动停止--jdk环境变量配置
    visual studio 正则表达式 查找 替换
    常用正则表达式
    解决兼容的方法!
    JS的定时器和JS的执行机制
    2020年3月2日随笔
    2020年2月12日 线上笔记
  • 原文地址:https://www.cnblogs.com/Ryan344453696/p/6531422.html
Copyright © 2011-2022 走看看