流式布局+搜索框+数据库

Android 组件 —— 流式布局 这是一个Android流式布局,根据鸿翔大神之前写的FlowLayout设计思路结合Material库中的ChipGroup设计架构衍生而来,全新的流式布局组件。 阅读详情
implementation 'com.hjm:BottomTabBar:1.1.1'
    //okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.5.0'
    //gson
    implementation 'com.google.code.gson:gson:2.6.2'
    //流式布局
    implementation 'com.fynn.fluidlayout:fluidlayout:1.0'
    implementation 'com.jcodecraeer:xrecyclerview:1.3.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
    implementation 'com.xhb:xbanner:1.2.2'
    implementation 'com.github.bumptech.glide:glide:3.7.0'
// 一般依赖:
    implementation 'com.facebook.fresco:fresco:0.14.1'
    // 如果需要支持gif,再添加:
//依赖
implementation 'com.hjm:BottomTabBar:1.1.1'
    //okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.5.0'
    //gson
    implementation 'com.google.code.gson:gson:2.6.2'
    //流式布局
    implementation 'com.fynn.fluidlayout:fluidlayout:1.0'
    implementation 'com.jcodecraeer:xrecyclerview:1.3.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
    implementation 'com.xhb:xbanner:1.2.2'
    implementation 'com.github.bumptech.glide:glide:3.7.0'
// 一般依赖:
    implementation 'com.facebook.fresco:fresco:0.14.1'
    // 如果需要支持gif,再添加:
    implementation 'com.facebook.fresco:animated-gif:0.12.0'
    // 在 API < 14 上的机器支持 WebP 时,需要添加
    implementation 'com.facebook.fresco:animated-base-support:0.12.0'
    // 支持 WebP (静态图+动图),需要添加
    implementation 'com.facebook.fresco:animated-webp:0.12.0'
    implementation 'com.facebook.fresco:webpsupport:0.12.0'
    // 仅支持 WebP 静态图,需要添加
    implementation 'com.facebook.fresco:webpsupport:0.12.0'

    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.2'
    implementation 'com.youth.banner:banner:1.4.9'
    implementation 'org.greenrobot:eventbus:3.0.0'
    implementation files('libs/open_sdk_r5990_lite.jar')
    implementation 'com.fynn.fluidlayout:fluidlayout:1.0'
    compile 'com.github.bumptech.glide:glide:3.7.0'
//activity_main.xml
<FrameLayout 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:id="@+id/fg"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:gravity="center_horizontal"
            android:orientation="vertical"
            android:id="@+id/f1_erweima"
            android:layout_width="60dp"
            android:layout_height="wrap_content">

            <ImageView

                android:id="@+id/image_sao"
                android:background="#ffffff"
                android:src="@drawable/sao_hei"
                android:layout_width="24dp"
                android:layout_height="20dp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15sp"
                android:textColor="#ffffff"
                android:text="扫啊扫"/>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ssk"
            android:layout_marginLeft="3px"
            android:layout_marginRight="3px"
            android:background="@drawable/home_title_bar_search_corner_bg"
            android:gravity="center_vertical"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="40dp">

            <ImageView
                android:layout_marginLeft="5dp"
                android:src="@drawable/a_4"
                android:layout_width="20dp"
                android:layout_height="20dp" />

            <TextView
                android:id="@+id/sousuo"
                android:layout_marginLeft="5dp"
                android:gravity="center_vertical"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="30dp"
                android:textSize="15dp"
                android:text="运动户外超级品牌类日"
                />
            <ImageView
                android:layout_marginRight="5dp"
                android:src="@drawable/root"
                android:layout_width="20dp"
                android:layout_height="20dp" />
        </LinearLayout>

        <LinearLayout
            android:gravity="center_horizontal"
            android:orientation="vertical"
            android:layout_width="50dp"
            android:layout_height="wrap_content">

            <ImageView
                android:background="#ffffff"
                android:src="@drawable/a9v"
                android:layout_width="20dp"
                android:layout_height="20dp" />
            <TextView
                android:textColor="#ffffff"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15sp"
                android:text="消息"/>
        </LinearLayout>
    </LinearLayout>

</FrameLayout>
//MainActivity
package bwei.com.uuuuu0531;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private TextView sousuo;
    private LinearLayout ssk;

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

    }

    private void initView() {
        sousuo = (TextView) findViewById(R.id.sousuo);
        ssk = (LinearLayout) findViewById(R.id.ssk);
        sousuo.setOnClickListener(this);
        ssk.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.ssk:

                break;
            case R.id.sousuo:
                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
                break;
        }
    }

}
//Sql
//MySql
package bwei.com.uuuuu0531.SQl;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by mac on 2018/4/17.
 */

public class MySql extends SQLiteOpenHelper {

    public MySql(Context context){
        super(context, "search.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        String sql = "create table search(id integer primary key autoincrement,name varchar(20))";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}
//MySqlDao
package bwei.com.uuuuu0531.SQl;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by mac on 2018/4/17.
 */

public class MySqlDao {
    private MySql mySQlite;
    private SQLiteDatabase db;

    public MySqlDao(Context context){
        mySQlite = new MySql(context);
        db = mySQlite.getReadableDatabase();
    }

    public void add(String name){
        ContentValues values = new ContentValues();
        values.put("name",name);
        db.insert("search",null,values);
    }

    public void delete(String name){
        db.delete("search","name=?",new String[]{name});
    }

    public void deleteAll(){
        db.execSQL("DELETE FROM search");
    }

    public List<String> select(){
        Cursor cursor = db.rawQuery("select * from search",null);
        List<String> list = new ArrayList<>();

        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            list.add(name);
        }

        return list;
    }

}
//activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
    android:orientation="vertical"
    tools:context=".Main2Activity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingTop="10dp"
        android:gravity="center_vertical">

        <RadioButton
            android:id="@+id/bt_quxiao"
            android:layout_width="52dp"
            android:layout_height="wrap_content"
            android:text="取消"
            android:button="@null"
            android:textColor="#999999"
            android:gravity="center"/>

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="35dp"
            android:layout_weight="1">

            <EditText
                android:id="@+id/search_edit2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/search_2"
                android:hint="        雷士京东超级品牌日, 2件8折"
                android:textSize="10sp"
                android:singleLine="true"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/search_2"
                android:layout_alignBottom="@id/search_edit2"
                android:layout_alignLeft="@id/search_edit2"
                android:layout_alignTop="@id/search_edit2"
                android:layout_marginLeft="10dp"/>
        </RelativeLayout>

        <RadioButton
            android:id="@+id/bt_search"
            android:layout_width="52dp"
            android:layout_height="wrap_content"
            android:text="搜索"
            android:button="@null"
            android:textColor="#999999"
            android:gravity="center"/>
    </LinearLayout>

    <ProgressBar
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="#cccccc"
        android:layout_marginTop="5dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="热搜"
        android:textColor="#000"
        android:layout_margin="10dp"/>

    <com.fynn.fluidlayout.FluidLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fl">
    </com.fynn.fluidlayout.FluidLayout>

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

    <RadioButton
        android:id="@+id/rb_clear"
        android:layout_width="200dp"
        android:layout_height="40dp"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:button="@null"
        android:background="@drawable/button_clean"
        android:textColor="#999999"
        android:text="清空历史搜索"/>

</LinearLayout>
//Main2Activity
package bwei.com.uuuuu0531;

import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;

import com.fynn.fluidlayout.FluidLayout;

import java.util.List;

import bwei.com.uuuuu0531.SQl.MySqlDao;

public class Main2Activity extends AppCompatActivity {

    MySqlDao mySQliteDao;
    EditText et;
    FluidLayout fluidLayout;
    Button bt_quxiao, bt_search;
    RadioButton rb_clear;
    ListView lv;
    List<String> list;
    MyAdapter myAdapter;

    String[] arrs = {
            "倩女幽魂", "单机斗地主", "天堂战记", "妖精的尾巴", "极限挑战", "我们相爱吧", "倚天屠龙记",
            "明星大侦探", "丰乳肥臀", "大主宰", "盗墓笔记", "鬼吹灯", "盘龙", "完美世界", "柠檬初上", "WIFI",
            "锁屏", "异术超能", "东方不败", "巅峰战舰", "小说", "污"};


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

        et = findViewById(R.id.search_edit2);
        bt_quxiao = findViewById(R.id.bt_quxiao);
        bt_search = findViewById(R.id.bt_search);
        rb_clear = findViewById(R.id.rb_clear);
        fluidLayout = findViewById(R.id.fl);
        lv = findViewById(R.id.search_lv);
//配置热搜流式布局
        for (int i = 0; i < arrs.length; i++) {
            String ss = arrs[i];
            TextView textView = new TextView(Main2Activity.this);
            textView.setText(ss);
            textView.setTextSize(13);
            textView.setBackgroundColor(Color.parseColor("#f5f5f5"));

            FluidLayout.LayoutParams params = new FluidLayout.LayoutParams(150, 50);
            params.setMargins(12, 12, 12, 12);

            fluidLayout.addView(textView, params);
        }

        //查询数据库,配置适配器,显示历史记录listview
        mySQliteDao = new MySqlDao(Main2Activity.this);
        list = mySQliteDao.select();
        myAdapter = new MyAdapter();
        lv.setAdapter(myAdapter);


        //点击事件,返回首页
        bt_quxiao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Main2Activity.this, MainActivity.class);
                startActivity(intent);
            }
        });
        //点击事件,添加搜索内容到数据库
        bt_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySQliteDao.add(et.getText().toString());

                list = mySQliteDao.select();
                myAdapter.notifyDataSetChanged();


                Intent intent = new Intent(Main2Activity.this,shopActivity.class);
                startActivity(intent);
            }
        });
        //点击事件,清空数据库中的搜索内容
        rb_clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySQliteDao.deleteAll();

                list.removeAll(list);
                myAdapter.notifyDataSetChanged();
            }
        });

    }

    //显示搜索内容listview的适配器
    class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int i) {
            return list.get(i);
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            TextView textView = new TextView(Main2Activity.this);
            textView.setText(list.get(i));
            textView.setPadding(15, 15, 15, 15);
            return textView;
        }
    }

}


//创建ShopActivity点击进入页面







Android 音乐播放器的开发教程(九) 歌词的显示----- 小达 歌词的显示         现在的播放器已经能够切歌咯,进度条也可以自由的滑动,有没有觉得很爽滑~~~~,今天就来介绍怎么将歌词显示到屏幕上面,歌词的文件形式有很多种,例如lrc,trc,krc,,我手机上面是天天动听的播放器,其歌词的形式为.trc的,所以今天我们以这个为例,lrc是最简单解析的,下面第一章图就是TRC的格式,第二张为LRC格式的歌词,不难发现,TRC就是在LRC基础上 阅读详情

相关推荐

ESP-IDF 利用ESP32实现音乐播放器(六) ---------- 动态歌词滚动与UI优化

本文详细介绍了如何在ESP32上利用ESP-IDF和FreeRTOS实现音乐播放器的动态歌词滚动与UI优化。通过解析LRC歌词文件、使用FreeRTOS定时器实现精确同步,并结合LVGL图形库进行界面优化,打造流畅的歌词显示效果。文章还分享了内存管理、双缓冲技术等关键优化技巧,帮助开发者提升嵌入式音乐播放器的性能与用户体验。

weixin_33724046的博客 368

使用OkHttp流式请求OpenAI API(GPT API)接口

因为 GPT 流式请求的出色交互体验,我们打算做一个开源基础应用,方便开发者快速集成项目。 本应用集成 ChatGPT API,使用模型为 gpt-3.5-turbo,项目代码为 Kotlin 语言开发的安卓应用。 人机交互的趋势已经到来,本应用框架也希望能帮助更多开发者快速集成 ChatGPT 体验到人机交互的乐趣!至此,你应该已经完成了Chat机器人智能问答对接,一个智能QA机器人就实现了,后续我会继续进行AI能力的扩展,如多模态等。喜欢本文可以给开源项目一个 star~有问题可以留言或私信我。

gallonyin的博客 5742

Flutter与OpenHarmony音乐播放器歌词显示开发实践

跨平台开发框架Flutter结合OpenHarmony操作系统,为音乐播放器应用开发提供了高效解决方案。歌词显示作为音乐播放器的核心功能,涉及文件解析、时间同步和动画渲染等关键技术。通过Flutter的CustomPaint和动画系统,开发者可以实现高性能的歌词渲染与平滑滚动效果。在OpenHarmony平台上,还需考虑跨平台兼容性和性能优化,特别是针对低端设备的适配。本文以音乐播放器开发为切入点,详细解析了如何利用Flutter和OpenHarmony实现流畅的歌词显示功能,包括LRC文件解析、二分查找优

weixin_29015127的博客 343

Android 流式布局

实现效果 SearchHistoryFlowLayout自定义控件 自定义view继承ViewGroup,重写onMeasure(),onLayout()方法。可根据子元素宽度动态测量宽高 public class SearchHistoryFlowLayout extends ViewGroup { public SearchHistoryFlowLayout(Context context) { super(context); } public .

weixin_41993823的博客 412

别再只调音量了!利用AVRCP 1.6让你的App在车载大屏显示歌词和专辑封面

本文深入解析AVRCP 1.6协议在车载娱乐系统中的应用,详细介绍如何通过蓝牙技术实现歌词和专辑封面的同步显示。从协议版本对比、MediaSession配置到跨平台兼容性处理,为开发者提供完整的技术方案,助力打造沉浸式车载音乐体验。

weixin_26876073的博客 493

foobar2000歌词显示全链路解析:从OpenLyrics协议到Lyric Show Panel实战

歌词显示是数字音频播放器的基础功能,其背后涉及媒体元数据解析、时间轴同步、UI渲染与协议适配等多重技术环节。OpenLyrics作为开放歌词标准,定义了USLT、LRC、XML等格式的语义与时间戳规范;而Lyric Show Panel并非简单显示组件,实为协议翻译器,负责在foobar2000的Columns UI框架下完成数据加载、格式转换与动态渲染。该机制支撑精准毫秒级歌词滚动、多语言切换与CSS样式定制等工程能力,广泛应用于本地音乐管理、教学音频标注及无障碍听觉辅助等场景。本文深入拆解从LRC文件编

weixin_42548874的博客 314

从KTV到你的手机:LRC歌词格式的‘前世今生’与技术演进

本文深入探讨了LRC歌词格式从卡拉OK时代到智能手机流媒体平台的技术演进历程。作为纯文本时间轴标记系统,LRC凭借极简设计、高效存储和强大兼容性,在数字音乐发展中持续发挥核心作用,并适应流媒体时代需求进化出动态渲染、实时翻译等创新应用。

weixin_28704565的博客 162

PlayerCap 3.0:不截图不抠色的歌词捕捉工具详解

在数字音乐场景中,歌词的保存与整理长期依赖截图、抠色、OCR等图像处理手段,不仅效率低,而且受播放器皮肤、背景渐变和字体影响,结果难以复用。借助系统媒体接口与播放器元数据,现代工具可以直接从播放器读取歌曲名和歌词文本,将流程简化为“获取元数据→文本清洗→导出LRC”。这种基于结构化数据的歌词捕捉方式,在跨播放器兼容性、歌词准确率和自动化批量整理方面具备显著优势。无论是建立个人歌词库、制作双语字幕,还是维护本地音乐资料,都离不开稳定高效的歌词捕捉工具。PlayerCap 3.0 正是面向这一需求的设计,它不依

weixin_34384557的博客 358

仿百度/Google搜索输入框提示JS代码(PHP+MySql数据库版)

仿百度/Google搜索输入框提示JS代码(PHP+MySql数据库版)。

51单片机项目实战:如何给你的MP3播放器加上手机APP控制和歌词显示?

本文详细介绍了如何基于51单片机开发MP3播放器,并通过蓝牙模块实现手机APP控制和LCD屏幕歌词显示功能。从硬件选型、系统架构设计到蓝牙通信协议和歌词解析算法,提供了完整的实现方案和优化技巧,帮助开发者打造专业级的智能音乐播放器。

weixin_30632089的博客 367

前端实战:实现本地沉浸式双语歌词循环播放器

现代前端开发中,音频播放与视觉体验的融合是常见需求。HTMLAudioElement 负责基础播放,Web Audio API 实现音量渐变,LRC 歌词解析则让双语字幕同步渲染成为可能;配合 CSS 变量与毛玻璃效果,可营造出沉浸式界面。Vue3 的响应式状态管理让播放列表、循环模式和歌词高亮逻辑清晰可控。从概念到实战,本文阐述如何不依赖后端与第三方 API,仅用纯静态资源构建一个适合通勤与运动场景的本地音乐播放器,涵盖歌单数据建模、歌词同步、淡入淡出、主题定制等工程细节。无论是前端练手还是打造个人 BG

weixin_34161083的博客 430

jquery版搜索框自动补全,智能提示,可连接数据库(适用于.net,java,php等多种语言)

jquery版搜索框自动补全,智能提示,可连接数据库(适用于.net,java,php等多种语言)支持中,英文,数字智能提示

LRC歌词协议:轻量级时间同步技术原理与工程实践

LRC歌词是一种基于纯文本的实时时间同步协议,其本质是通过毫秒级时间戳与文本内容的严格映射,实现音频与文字的精准对齐。它不依赖渲染引擎或网络服务,仅需线性扫描即可解析,因而具备极强的跨平台兼容性与低算力适应性。该协议广泛应用于音乐播放器、播客剪辑、语言教学及智能音响等场景,尤其适合需要离线运行、高鲁棒性与快速定位的工程需求。随着Web Audio API原生支持和AI语音合成反向输出音素级LRC等新趋势出现,LRC正从基础歌词格式演进为通用音频事件标记基础设施。本文深入剖析LRC歌词结构、UTF-8编码规范

weixin_30444111的博客 231

Android中自定义View之流式布局

Android中自定义View之流式布局的Demo,代码中关键步骤并有注释原理解说,轻松掌握自定义View的onMeasure和onLayout的实现

ok流式选择框类库.rar

ok流式选择框类库.rar

ok类库集合

ok类库集合

android搜索热词(热门标签)流式布局的实现

很多时候需要用到流式布局。比如搜索的activity里有很多搜索热词。这种自定义布局的实现。

ok工具类 E4A类库

ok工具类E4A类库

上一篇: retrofit+rxjava+mvp网络请求数据
Androidoux98
博客等级 码龄9年 3粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值