ListView示例(附详解+源码)

2022-05-05 20:23:38 浏览数 (1)

ListView示例

  • 效果图
  • 代码部分
    • ListViewActivity(显示ListView的Activity)
    • 相对应的xml文件(activity_list_view.xml)
      • ListView属性介绍
    • MyData数据源
    • MyAdapter适配器类
    • 单个View条目xml(list_view_adapter.xml)
    • 加载进度所需要的进度条(storage_bar.xml)
  • 下载项目源码

效果图

代码部分

ListViewActivity(显示ListView的Activity)

代码语言:javascript复制
package com.gaojc.activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import com.gaojc.adapter.MyAdapter;
import com.gaojc.data.MyData;
import com.gaojc.text.R;
import java.util.ArrayList;

public class ListViewActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);

        ListView myListView = findViewById(R.id.myListView);
        // 创建数据源
        ArrayList<MyData> myData = new ArrayList<>();
        // 适配器类(用来给ListView填充数据)
        MyAdapter myAdapter = new MyAdapter(ListViewActivity.this,myData);

        /**
         * 添加假数据
         */
        for (int i = 0; i < 15; i  ) {
            myAdapter.add(new MyData(0.1   i   "",10   i   "%"));
        }

        // 设置创建生成的数据适配器
        myListView.setAdapter(myAdapter);
    }
}

相对应的xml文件(activity_list_view.xml)

代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.gaojc.activity.ListViewActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ListView示例"
        android:gravity="center"
        android:textSize="30dp"/>

    <ListView
        android:id="@ id/myListView"
        android:layout_width="300dp"
        android:layout_height="450dp"
        android:layout_gravity="center"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="15dp"
        android:paddingBottom="20dp"
        android:divider="@null"
        android:dividerHeight="5dp"
        android:background="@drawable/every_day_get_money_bg1"/>

</FrameLayout>

ListView属性介绍

代码语言:javascript复制
android:divider="@null" :不显示分割线
android:dividerHeight="5dp" :指定分割线的高
android:scrollbars="none" :隐藏滚动条

MyData数据源

代码语言:javascript复制
package com.gaojc.data;

public class MyData {

    public String money; //显示金额
    public String ratio; //比例

    public MyData(String money, String ratio) {
        this.money = money;
        this.ratio = ratio;
    }

    public String getRatio() {
        return ratio;
    }
}

MyAdapter适配器类

代码语言:javascript复制
package com.gaojc.adapter;

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.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.gaojc.data.MyData;
import com.gaojc.text.R;
import com.gaojc.text.Utils.LogUtil;
import java.util.ArrayList;

/**
 * 适配器类(用来给ListView填充数据)
 *      需要继承 BaseAdapter
 */
public class MyAdapter extends BaseAdapter {

    public Context context;
    public ArrayList<MyData> myData;

    public MyAdapter(Context context, ArrayList<MyData> myData) {
        this.context = context;
        this.myData = myData;
    }

    /**
     * @return:要绑定的条目的数目(格子的数量)
     */
    @Override
    public int getCount() {
        return myData.size();
    }

    /**
     * 根据索引(位置)获得该位置的对象
     * @param i:索引
     * @return:获取该位置的对象
     */
    @Override
    public MyData getItem(int i) {
        // 这里的返回类型改为自己的数据类
        return myData.get(i);
    }

    /**
     * @return: 返回条目的id
     */
    @Override
    public long getItemId(int i) {
        return i;
    }

    /**
     * 获取该条目要显示的界面
     * @param i:当前条目
     * @param convertView:绘制好的视图
     * @param viewGroup:对应的xml文件(单个条目 list_view_adapter.xml)
     * @return
     */
    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        MyData myData = getItem(i); //获取当前位置的对象
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            // 把xml布局文件解析成View
            view = LayoutInflater.from(context).inflate(R.layout.list_view_adapter, viewGroup, false);
            // 添加数据  setTag:监听相对应的事件
            viewHolder = new ViewHolder();
            viewHolder.textMoney = view.findViewById(R.id.textMoney);
            viewHolder.textMoneyTwo = view.findViewById(R.id.textMoneyTwo);
            viewHolder.listViewProBar = view.findViewById(R.id.listViewProBar);
            viewHolder.ratio = view.findViewById(R.id.ratio);
            viewHolder.getButton = view.findViewById(R.id.getButton);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag(); //重新获取ViewHolder
        }

        viewHolder.getButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LogUtil.e("点击了领取按钮");
                // 获取比例
                String ratio = myData.getRatio();
                LogUtil.e("比例是:"   ratio);
                if (ratio.equals("100%")) {
                    Toast.makeText(context, "可以提现", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "不能提现", Toast.LENGTH_SHORT).show();
                }
            }
        });

        // 设置各节点内容
        viewHolder.textMoney.setText(myData.money   "元");
        viewHolder.textMoneyTwo.setText(myData.money   "元奖励进度");
        String ratio = myData.ratio.replace("%", "");
        viewHolder.listViewProBar.setProgress(Integer.parseInt(ratio));
        viewHolder.ratio.setText(myData.ratio);

        return view;
    }

    // 需要的数据
    private class ViewHolder {
        TextView textMoney; //红包金额
        TextView textMoneyTwo; //金额奖励进度
        ProgressBar listViewProBar; //进度比例
        TextView ratio; //显示的进度比例数
        Button getButton; //领取按钮
    }

    // 添加数据方法
    public void add(MyData data){
        if (myData == null){
            myData = new ArrayList<>();
        }
        myData.add(data);
    }
}

单个View条目xml(list_view_adapter.xml)

代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="@drawable/every_day_get_money_listview_item_background">
    
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2.5"
            android:background="@drawable/red_package"/>
        <TextView
            android:id="@ id/textMoney"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="0.3元"
            android:background="@drawable/red_package_2"
            android:gravity="center"
            android:textColor="#FF0000"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:orientation="vertical">
        <TextView
            android:id="@ id/textMoneyTwo"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="0.3元奖励进度"
            android:gravity="center"/>
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_marginBottom="5dp">
            <ProgressBar
                android:id="@ id/listViewProBar"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/progress_bg"
                android:progress="60"
                android:progressDrawable="@drawable/storage_bar" />
            <TextView
                android:id="@ id/ratio"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="60%"
                android:gravity="center"
                android:textColor="#FFFFFF"/>
        </FrameLayout>
    </LinearLayout>

    <Button
        android:id="@ id/getButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.1"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:background="@drawable/receive"/>

</LinearLayout>

加载进度所需要的进度条(storage_bar.xml)

代码语言:javascript复制
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--    绿色进度条-->
    <item
        android:id="@android:id/progress">
        <scale
            android:scaleWidth="100%">
            <shape>
                <corners android:radius="15dip"/>
                <solid android:color="#66CC08"/>
            </shape>
        </scale>

    </item>
</layer-list>

下载项目源码

0 人点赞