Android 入门第四讲01-列表ListView(用代码添加布局文件(添加控件+布局),ListView原理,ListView使用步骤,ListView填充数据案例,ListView填充多个数据)

Android 入门第四讲01-列表ListView(用代码添加布局文件(添加控件+布局),ListView的原理,ListView的使用步骤,ListView填充数据案例,ListView填充多个数据)


Android 入门第三讲03-Activity的生命周期(理论)(Activity生命周期中的方法,Activity生命周期(一个和两个activity的生命周期分析))

1.用代码添加布局文件

1.添加控件

第一步先给layout文件的布局添加一个id
在这里插入图片描述
第二步在activity里通过代码拿到布局再添加控件
在这里插入图片描述
第三步根据布局的属性来控制方位
在这里插入图片描述
提示:如果添加的控件覆盖了原来的控件,看谁在上面,这里拿按钮做例子,添加的按钮在上面,所以下面的按钮就失效了

1.添加布局

第一步先新建一个布局
在这里插入图片描述
第二步在activity添加布局
在这里插入图片描述

2.ListView的原理

1.运行程序时,屏幕显示几条条目,listview就加载几条
2.listview本身没有内容,需要adapter来添加内容

在这里插入图片描述

3.ListView的使用步骤

第一步在XML文件里新建
在这里插入图片描述

   <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
        

第二步新建一个item
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="33dp"
        android:layout_marginLeft="33dp"
        android:layout_marginTop="38dp"
        android:text="TextView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="65dp"
        android:layout_marginEnd="97dp"
        android:layout_marginRight="97dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

第二步添加一个adapter(BaseAdapter是一个抽象类,所以需要重写这个抽象类方法)
在这里插入图片描述
全选然后ok
在这里插入图片描述
在这里插入图片描述
提示:当屏幕有几条就加载几条,下拉出现新的条目才会再加载(比for循环更加优化)
代码


public class MainActivity extends AppCompatActivity {


    ListView mListView;//实例化
    @Override
    protected void onCreate(Bundle savedInstanceState) {//准备工作   页面不可见,当执行完onStart的方法才可见
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView=findViewById(R.id.listview);
        mListView.setAdapter(new MyAdapter());//填充数据

    }
    public class MyAdapter extends BaseAdapter{//BaseAdapter是一个抽象类,所以需要重写这个抽象类方法
        @Override
        public int getCount() {//产生的条目的数量
            return 10;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {//表示条目,相当于布局
            View view=View.inflate(MainActivity.this,R.layout.item,null);
            return view;
        }

    }

}

4.ListView填充数据案例

在这里插入图片描述
分析如下

  1. 构造数据
  2. 填充数据
  3. 获取条目数量大小
  4. 将填充的数据赋值给拿到的控件

在这里插入图片描述
代码


public class MainActivity extends AppCompatActivity {


    //构造数据结构
    List<String> lists=new ArrayList<>();
    ListView mListView;//实例化
    @Override
    protected void onCreate(Bundle savedInstanceState) {//准备工作   页面不可见,当执行完onStart的方法才可见
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView=findViewById(R.id.listview);
        for (int i=0;i<66;i++){
            lists.add("这是第"+ i +"条数据");
        }
        mListView.setAdapter(new MyAdapter());//填充数据

    }
    public class MyAdapter extends BaseAdapter{//BaseAdapter是一个抽象类,所以需要重写这个抽象类方法
        @Override
        public int getCount() {//产生的条目的数量
            return lists.size();//获取lists的大小
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {//表示条目,相当于布局
            String s = lists.get(position);//获取条目的位置
            View view=View.inflate(MainActivity.this,R.layout.item,null);
            //拿到文本的引用(直接用findViewById只能拿到activity对应布局文件下的控件,所以要加一个view
            TextView textView=view.findViewById(R.id.textView2);
            textView.setText(s);
            return view;
        }

    }

}

5.ListView填充多个数据

第一步创建对象
在这里插入图片描述
第二步填充与取值
在这里插入图片描述
代码


public class MainActivity extends AppCompatActivity {
    //构造数据结构
    List<Student> lists=new ArrayList<>();
    ListView mListView;//实例化
    @Override
    protected void onCreate(Bundle savedInstanceState) {//准备工作   页面不可见,当执行完onStart的方法才可见
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView=findViewById(R.id.listview);
        for (int i=0;i<66;i++){
           Student student=new Student();
           student.name="高冷小王子"+i;
           student.sex="男"+i;
           student.age="18"+i;
           lists.add(student);
        }
        mListView.setAdapter(new MyAdapter());//填充数据
    }
    public class MyAdapter extends BaseAdapter{//BaseAdapter是一个抽象类,所以需要重写这个抽象类方法
        @Override
        public int getCount() {//产生的条目的数量
            return lists.size();//获取lists的大小
        }
        @Override
        public Object getItem(int position) { return null; }
        @Override
        public long getItemId(int position) { return 0; }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {//表示条目,相当于布局
            Student s = lists.get(position);//获取条目的位置
            View view=View.inflate(MainActivity.this,R.layout.item,null);
            //拿到文本的引用(直接用findViewById只能拿到activity对应布局文件下的控件,所以要加一个view
            TextView textView=view.findViewById(R.id.textView2);
            textView.setText(s.name);
            TextView textView1=view.findViewById(R.id.textView3);
            textView1.setText(s.sex);
            TextView textView2=view.findViewById(R.id.textView4);
            textView2.setText(s.age);
            return view;
        }

    }

}

嘿嘿嘿,本讲的内容就先讲到这里啦,谢谢您的阅读,下一讲更加精彩哦。
Android 入门第四讲02-列表ListView(ListView item高度问题,ListView控件缺点,ListView控件优化(面试常问问题),ListView控件二次优化)
博主为了可以学到更多的Android知识,创建了一个安卓知识交流群,欢迎大佬入群,当然也欢迎和我一样的安卓小白,我们可以一起交流,最重要的是快乐水群,记得定个小目标,冲击bat

在这里插入图片描述

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的使用 `ListView` 实现播放列表和音乐播放器的代码布局代码使用单一布局布局代码 `activity_main.xml`: ```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"> <!-- 播放器控制区域 --> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 播放/暂停按钮 --> <Button android:id="@+id/btn_play_pause" android:text="Play" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <!-- 歌曲名称和时间 --> <TextView android:id="@+id/tv_song_name" android:text="Song Name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <TextView android:id="@+id/tv_song_time" android:text="00:00 / 00:00" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <!-- 播放列表 --> <ListView android:id="@+id/listview_playlist" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:dividerHeight="1dp"/> </LinearLayout> ``` Java 代码 `MainActivity.java`: ```java import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity implements AdapterView.OnItemClickListener, MediaPlayer.OnCompletionListener { private List<String> songList = new ArrayList<String>(); private ListView listView; private ArrayAdapter<String> adapter; private MediaPlayer mediaPlayer = new MediaPlayer(); private Button playPauseButton; private TextView songNameTextView; private TextView songTimeTextView; private int currentSongIndex = -1; private boolean isPlaying = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化播放列表 songList.add("Song 1"); songList.add("Song 2"); songList.add("Song 3"); // 初始化ListView listView = (ListView) findViewById(R.id.listview_playlist); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, songList); listView.setAdapter(adapter); listView.setOnItemClickListener(this); // 初始化播放器控制区域 playPauseButton = (Button) findViewById(R.id.btn_play_pause); songNameTextView = (TextView) findViewById(R.id.tv_song_name); songTimeTextView = (TextView) findViewById(R.id.tv_song_time); playPauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (isPlaying) { pause(); } else { play(); } } }); mediaPlayer.setOnCompletionListener(this); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { currentSongIndex = i; playSong(currentSongIndex); updateUI(); } @Override public void onCompletion(MediaPlayer mediaPlayer) { currentSongIndex++; if (currentSongIndex >= songList.size()) { currentSongIndex = 0; } playSong(currentSongIndex); updateUI(); } private void play() { if (mediaPlayer.isPlaying()) { return; } if (currentSongIndex == -1) { currentSongIndex = 0; playSong(currentSongIndex); } else { mediaPlayer.start(); } isPlaying = true; playPauseButton.setText("Pause"); } private void pause() { if (!mediaPlayer.isPlaying()) { return; } mediaPlayer.pause(); isPlaying = false; playPauseButton.setText("Play"); } private void playSong(int index) { mediaPlayer.reset(); try { mediaPlayer.setDataSource("/path/to/" + songList.get(index) + ".mp3"); mediaPlayer.prepare(); mediaPlayer.start(); isPlaying = true; } catch (IOException e) { e.printStackTrace(); } } private void updateUI() { songNameTextView.setText(songList.get(currentSongIndex)); int duration = mediaPlayer.getDuration(); int currentPosition = mediaPlayer.getCurrentPosition(); int minutes = currentPosition / 1000 / 60; int seconds = (currentPosition / 1000) % 60; String currentPositionString = String.format("%d:%02d", minutes, seconds); minutes = duration / 1000 / 60; seconds = (duration / 1000) % 60; String durationString = String.format("%d:%02d", minutes, seconds); songTimeTextView.setText(currentPositionString + " / " + durationString); } } ``` 需要注意的是,需要在 AndroidManifest.xml 文件添加读取存储权限,以便访问音乐文件。同时,获取音乐文件的播放时长需要在 `MediaPlayer` 对象准备好后才能获取,可以使用 `setOnPreparedListener` 方法来监听。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rose J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值