• Android开发 ---基本UI组件6 :只定义一个listView组件,然后通过BaseAdapter适配器根据数据的多少自行添加多个ListView显示数据


    效果图:

      

    1、activity_main.xml

      描述:

        定义了一个按钮

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="ListView_1"
            android:onClick="test_1"/>
    </LinearLayout>

    2、MainActivity.java

      描述:

        进行了页面跳转

    package com.example.android_ui_3;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void test_1(View view){
            Intent intent=new Intent(this,ListView_BaseAdapterActivity.class);
            startActivity(intent);
        }
    }

    3、activity_list_view_base_adapter.xml

      描述:

        定义了一个显示内容的ListView组件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/activity_list_view__base_adapter"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ListView
            android:id="@+id/listView_1"
            android:listSelector="@color/colorAccent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    4、ListView_BaseAdapterActivity.java

    package com.example.android_ui_3;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ListView_BaseAdapterActivity extends Activity {
      //获取到ListView组件
        private ListView listView_1;
      //声明了一个全局的集合
    private List<Map<String,Object>> list;
      //声明了一个适配器
    private MyBaseAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view__base_adapter);
    listView_1
    =(ListView)findViewById(R.id.listView_1); //获取数据源 loadData();
         //构建适配器
         //适配器中传入数据源 adapter
    =new MyBaseAdapter(list,this);
         //给listView绑定适配器 listView_1.setAdapter(adapter); }
    //构建数据源 private void loadData(){
         //实例化集合 list
    =new ArrayList<Map<String,Object>>();
         //通过循环向每个Map中添加数据
    for(int i=1;i<=10;i++){ Map<String,Object> map=new HashMap<String,Object>(); map.put("userImage",R.mipmap.ic_launcher); map.put("userName","小明"+i); map.put("userInfo","这是第"+i+"个小明"); list.add(map); } } //构建一个适配器内部类
      //adapter是view和数据的桥梁
      //在一个ListView或者GridView中,你不可能手动给每一个格子都新建一个view,所以这时候就需要Adapter的帮忙,它会帮你自动绘制view并且填充数据。
      //新建一个java文件MyBaseAdapter,继承自BaseAdapter,并且实现它的4个基础方法。
      /*
        getCount : 要绑定的条目的数目,比如格子的数量
        getItem : 根据一个索引(位置)获得该位置的对象
        getItemId : 获取条目的id
        getView : 获取该条目要显示的界面
      */
      //继承BaseAdapter class MyBaseAdapter extends BaseAdapter{ //接收将要绑定给UI的数据源
         //全局数据源变成了局部数据源了 private List<Map<String,Object>> list; //数据绑定给谁 private Context context; //构造方法
         //初始化数据源和上下文对象 MyBaseAdapter(List<Map<String,Object>> list,Context context){ this.list=list; this.context=context; }       
         //该类继承了BaseAdapter必须重写四个方法  @Override
    public int getCount() {
           //如果list中存在数据
    if(list!=null)
              //返回list中数据的条数
    return list.size();
           //否则返回0
    return 0; } @Override public Object getItem(int i) { if(list!=null)
              //传入一个i,获取你好检索的数据位置
    return list.get(i); return null; } @Override public long getItemId(int i) { if(list!=null) return i; return 0; } /** * 构建每一个Item,多次调用,每次构建一项 * @param i 当前第几项 * @param view 上一次构建的项 * @param viewGroup * @return */ @Override public View getView(final int i, View view, ViewGroup viewGroup) { if(list!=null){ Log.i("create view","创建第"+i+"项"); //获取要绑定数据的UI[UI描绘在XML文件中,需要将XML解析成一个View对象] view=View.inflate(context,R.layout.layout_userlist,null); ImageView userImage=(ImageView)view.findViewById(R.id.userImage); TextView userName=(TextView)view.findViewById(R.id.userName); TextView userInfo=(TextView)view.findViewById(R.id.userInfo); TextView delete=(TextView)view.findViewById(R.id.deleteText); //为UI绑定数据 final Map<String,Object> map=list.get(i); userImage.setImageResource((Integer) map.get("userImage")); userName.setText(map.get("userName").toString()); userInfo.setText(map.get("userInfo").toString()); //为UI绑定事件 delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Toast.makeText(context,"将要删除:"+map.get("userName").toString(),Toast.LENGTH_SHORT).show(); list.remove(i);
                  //有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView
                  //即更新listVieww adapter.notifyDataSetChanged(); } });
    return view; } return null; } } }

     5、layout_userlist.xml

    描述:

      只画好一个框架,里面没有数据,需要通过适配器自己去填入数据

      

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="5dp"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/userImage"
                android:layout_width="60dp"
                android:layout_height="70dp" />
            <LinearLayout
                android:orientation="horizontal"
                android:layout_marginLeft="3dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_weight="5"
                    android:layout_width="0dp"
                    android:layout_height="match_parent">
                    <TextView
                        android:id="@+id/userName"
                        android:textSize="28sp"
                        android:layout_width="match_parent"
                        android:layout_height="40dp" />
                    <TextView
                        android:id="@+id/userInfo"
                        android:textSize="20sp"
                        android:layout_width="match_parent"
                        android:layout_height="30dp" />
                </LinearLayout>
                <TextView
                    android:id="@+id/deleteText"
                    android:textSize="25sp"
                    android:gravity="center_horizontal|bottom"
                    android:text="删除"
                    android:layout_weight="1"
                    android:layout_gravity="right"
                    android:layout_width="0dp"
                    android:layout_height="match_parent" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    如果您发现博客内容有什么错误,请您下方留言
  • 相关阅读:
    JS中字符串的true转化为boolean类型的true
    jquery select change下拉框选项变化判断选中值
    C# 使用 NPOI 库读写 Excel 文件
    通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    SQL查询语句如何能够让指定的记录排在最后
    搞懂 JavaScript 继承原理
    基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
    SqlServer 使用sys.dm_tran_locks处理死锁问题
  • 原文地址:https://www.cnblogs.com/zn615/p/8205068.html
Copyright © 2020-2023  润新知