使用HorizontalScrollView实现侧滑ListView

C++构建高并发在线判题系统:负载均衡、安全沙盒与分布式架构实战 在线判题系统(Online Judge,简称OJ)是用于自动编译、运行并评判用户提交代码的核心平台,其本质是一个高并发、高可靠性的分布式任务处理系统。其核心原理在于通过负载均衡技术,将海量用户提交的计算任务公平、高效地分发到后端判题机集群,从而实现资源的合理利用与快速响应。在技术实现上,系统需要解决进程控制、资源隔离、状态同步等关键问题,以确保在多用户并发场景下的服务稳定与安全。其技术价值在于,它不仅是算法练习平台,更是深入理解后端高并发架构、网络编程和系统安全的绝佳实践项目。典型的应用场景包括编程竞赛、在 阅读详情

1.需求

1.1实现一个类似QQ的ListView侧滑菜单,

分析一下都有哪些要求:

  1. 可以侧滑拉出菜单
  2. 点击时如果不是点击已经打开的item需关闭之前的item
  3. 点击时如果是已经打开的item,则可以继续拉动

这里写图片描述

2.实现

2.1先继承HorizontalScrollView实现一个类,便于布局

package com.example.scrolllistview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ScrollListView extends HorizontalScrollView{

    //记录各个宽度
    private int wScreen;
    private int wButton;

    private boolean once;

    private Button leftbtn;
    private Button rightbtn;
    private TextView tx;

    //构造方法
    public ScrollListView(Context context) {
        super(context,null);
    }

    public ScrollListView(Context context ,AttributeSet set)
    {
        super(context,set,0);
    }

    public ScrollListView(Context context ,AttributeSet set ,int defStyle) {
        super(context,set,defStyle);
    }

    //重载测量方法
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if(!once)
        {
            //获得第一个布局
            LinearLayout linearlayout = (LinearLayout)getChildAt(0);
            leftbtn = (Button)linearlayout.getChildAt(0);
            tx = (TextView)linearlayout.getChildAt(1);
            rightbtn = (Button)linearlayout.getChildAt(2);

            //获得屏幕的宽度
            WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
            //Onmeasure方法会被多次使用,造成频繁的创建销毁对象,为了ui的性能建议不要这样使用
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            wScreen = outMetrics.widthPixels;

            wButton = wScreen/2;

            //设置个子控件的宽度
            leftbtn.getLayoutParams().width = wButton;
            tx.getLayoutParams().width = wScreen;
            rightbtn.getLayoutParams().width = wButton;
            this.getParent();

        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    //重载布局
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        //如果改变
        if(changed)
        {
            //将view滑动到(x,y)处 坐标原点parentview 左上角
            this.scrollTo(wButton, 0);
            once = true;
        }

    }



    @Override
    public boolean performClick() {
        return super.performClick();
    }

    public void close()
    {
        this.scrollTo(wButton, 0);
    }

    public void open()
    {
        this.scrollTo(wButton+wScreen, 0);
    }

}

2.2编写listview的item布局

<com.example.scrolllistview.ScrollListView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80sp">

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

        <Button
            android:id="@+id/leftbtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#303F9F"
            android:text="@string/leftbtn"/>

        <TextView
            android:id="@+id/context"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@string/context"/>        

        <Button
            android:id="@+id/rightbtn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="#303F9F"
            android:text="@string/rightbtn"/>

    </LinearLayout>

</com.example.scrolllistview.ScrollListView>

2.3编写适配器类

package com.example.scrolllistview;

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class ModelAdapter extends BaseAdapter{

    private boolean isMove;
    private int oldItem = -1;
    private ListView list;
    private boolean closed = true;
    private Context tx;
    private int resourceID;
    private List<Model> mlist;

    public ModelAdapter(Context tx, int resourceid ,List<Model> list ,ListView listview) {
        // TODO Auto-generated constructor stub
        this.tx = tx;
        this.resourceID = resourceid;
        this.mlist = list;
        this.list = listview;
    }

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

    @Override
    public Object getItem(int position) {
        return mlist.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder vh = null;
        Model m = (Model)getItem(position);
        if(convertView == null)
        {
            convertView = LayoutInflater.from(tx).inflate(this.resourceID, parent,false);
            vh = new ViewHolder();
            vh.leftbtn = (Button)convertView.findViewById(R.id.leftbtn);
            vh.context = (TextView)convertView.findViewById(R.id.context);
            vh.rightbtn = (Button)convertView.findViewById(R.id.rightbtn);
            convertView.setTag(vh);


        }
        else
        {
            vh = (ViewHolder)convertView.getTag();
        }

        vh.leftbtn.setText(m.getLeftText());
        vh.rightbtn.setText(m.getRigthText());
        vh.context.setText(m.getContext());

        //告知点击事件点击的是哪一个item
        vh.context.setTag(position);


        //点击事件
        convertView.setOnTouchListener(new OnTouchListener() {
            float oldX = 0;
            int f = 0;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    oldX = event.getX();

                    ViewHolder viewHolder = new ViewHolder();
                    viewHolder = (ViewHolder) v.getTag();

                    //获得点击的位置
                    //如果是全部关闭的可以移动
                    if(oldItem == (Integer)viewHolder.context.getTag() || closed)
                    {
                        isMove = true;
                        oldItem = (Integer)viewHolder.context.getTag();
                    }
                    else
                    {
                        isMove = false;
                    }
                    break;



                case MotionEvent.ACTION_MOVE:
                    //获得当前屏幕内可见的第一个
                    f = list.getFirstVisiblePosition();
                    //获得点击得位置
                    if(!isMove)
                    {
                        ((ScrollListView)list.getChildAt(oldItem-f)).close();
                        closed = true;
                        event.setAction(MotionEvent.ACTION_CANCEL);
                    }
                    else
                        closed = false;

                case MotionEvent.ACTION_UP:
                    float newX = event.getX();
                    if(oldX == newX)
                    {
                        ((ScrollListView)list.getChildAt(oldItem-f)).close();
                        closed = true;
                        event.setAction(MotionEvent.ACTION_CANCEL);
                    }



                default:
                    break;
                }
                return false;
            }
        });

        //按钮的单击事件
        vh.rightbtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //获得当前点击哪个item
                v.setBackgroundColor(Color.RED);


            }
        });
        return convertView;
    }

    class ViewHolder
    {
        public Button leftbtn;
        public TextView context;
        public Button rightbtn;
    }

}

2.4编写主页面的布局,就一个listview

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

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

</RelativeLayout>

2.5Activity

package com.example.scrolllistview;

import android.os.Bundle;

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

import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

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

        ListView list = (ListView)findViewById(R.id.lview);

        //准备数据
        List<Model> mList = new ArrayList<Model>();
        for(int i=0;i<10;i++)
        {
            Model m = new Model("leftbtn"+i,"context"+i,"rightbtn"+i);
            mList.add(m);
        }


        //适配器
        ModelAdapter adapter = new ModelAdapter(MainActivity.this, R.layout.slistitem, mList,list);

        list.setAdapter(adapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

不提倡这样写,应该使用handler为主线程投递message,让主线程只负责布局。
C++算法竞赛实战:从赛题拆解到工程能力提升 在计算机编程领域,算法与数据结构是解决复杂问题的核心基础,其原理在于通过高效的数据组织和计算策略,将现实问题转化为可执行的数学模型。掌握这些技术不仅能提升代码性能,更是软件工程师解决高并发、大数据等实际工程挑战的关键能力,广泛应用于搜索引擎、推荐系统、金融分析等场景。本文以C++语言为例,结合vscode配置c/c++环境和visual c++ redistributable等工程实践热词,深入解析如何通过系统性拆解竞赛题目,构建从问题抽象、算法设计到代码实现与调试的完整能力闭环,为算法竞赛备赛和长期技术成 阅读详情

相关推荐

信息学奥赛一本通C++在线评测系统使用指南与刷题技巧

在线评测系统(Online Judge)是一种自动编译、运行并比对程序输出的技术平台,其核心原理包括代码接收、编译、沙箱运行和逐字符输出比对。在算法学习与编程竞赛中,OJ提供了即时反馈机制,能显著提升刷题效率。典型应用场景包括信息学奥赛备赛、数据结构与算法课程练习以及C++编程能力提升。信息学奥赛一本通C++版配套的在线评测系统正是这一技术的典型实践,掌握其使用流程与常见问题排查方法,是高效刷题的关键。

weixin_33816821的博客 380

使用HorizontalScrollView 实现ListView横向滑动

Android API中没有

a23qws的专栏 1264

OJ平台背后的技术揭秘:在线评测系统如何实现毫秒级判题

本文深入解析了OJ平台如何通过分布式架构、安全沙箱和智能调度实现毫秒级判题的技术奥秘。从负载均衡到Docker集群,再到资源限制和调度算法,揭示了LeetCode、Codeforces等平台高效处理海量代码提交的关键技术。特别探讨了C++等语言在判题系统中的优化策略,以及未来WebAssembly和AI辅助判题的发展趋势。

weixin_29021291的博客 1103

Android 自定义 HorizontalScrollView 实现ViewPager效果,打造再多图片(控件)也不怕 OOM

1. 效果上次实现了这个IOS Reveal效果,能够确保中间部分是彩色其余部分是灰色,但是也遗留了两个问题:   (1)如果把它做成ViewPager效果的方式可能会更好;   (2)HorizontalScrollView没有重用机制,虽然可能我们并不会加载很多的图片,但是一旦过多肯定会出现OOM问题;

z240336124的专栏 1万+

蓝桥杯成绩分析题解:C++在线处理算法与精度控制实战

在数据处理与算法竞赛中,在线处理(Online Processing)是一种高效处理流式数据的核心思想,它通过遍历数据时动态更新统计量,无需存储全部数据,从而将空间复杂度降至O(1)。其技术价值在于能够优雅地应对海量数据场景,提升程序性能。这一原理广泛应用于实时日志分析、用户行为统计和传感器数据聚合等场景。以C++实现时,需重点关注整数溢出、浮点数精度和格式化输出等基础问题。例如,在计算平均值时,必须将累加和转换为double类型以避免整数除法截断,并使用printf的%.2f或cout的fixed与set

weixin_30621959的博客 300

10大C++在线编译器深度评测:从原理到实战场景全解析

在线编译器是一种基于浏览器的集成开发环境,其核心原理是通过云端服务器创建隔离的容器(如Docker),调用预装的编译器(如GCC、Clang)对用户提交的源代码进行编译和执行,并将结果返回前端。这种架构通过安全沙箱技术限制资源使用和系统调用,保障了服务稳定性与安全性。其技术价值在于实现了跨平台、零配置的即时编程体验,极大降低了学习与验证代码的门槛。在应用场景上,它广泛适用于算法验证、教学演示、技术面试和跨设备代码同步等需求。本文聚焦于C++在线编译器,深度评测了包括Compiler Explorer、Rep

weixin_30376509的博客 376

Android 水平加载图片 自定义 HorizontalScrollView,防止一次性加载出现性能问题,防止OOM

本文是在 http://blog.youkuaiyun.com/lmj623565791/article/details/38140505 的基础上加工的,鸿洋_写的思路非常完美,夸张点就是无人出其右。 当然也存在问题,首先就是如果一屏不够,奔溃(小问题);还有很重要的问题,就是体验差,本人在他基础上改了,如果存在问题,非常欢迎大家指导,相互学习、相互交流。 大概思路: 1.定义一个adapter适配器

fei810711peng的博客 833

Uva编程经验:C++算法代码集合

Uva在线评判系统是一种为计算机编程竞赛而设计的网络平台,它允许参赛者提交代码并自动运行在多个测试用例上,以此来测试代码的正确性和效率。该系统广泛用于ACM国际大学生程序设计竞赛(ICPC)、区域竞赛以及个人练习等多种场合。

weixin_42506884的博客 767

结合HorizontalScrollView横向滑动实现多列项ListView

最近一个项目中要实现类似表格形式的东西,因为有多条数据而且数量不确定,所以只能采用ListView实现,但是表头中的内容却有七八列,屏幕肯定显示不下,于是就想到结合使用HorizontalScrollView,查了一些资料终于实现了,总结如下:             xml文件: <HorizontalScrollView android:layout_width=

u010313877的专栏 4887

HUSTOJ源码剖析:在线评测系统判题核心与部署实战

在线评测系统(OJ)是算法竞赛和编程教学中的基础工具,其核心在于安全地编译、运行用户提交的代码并判定结果。理解其工作原理,需要对系统架构、进程隔离、资源限制等底层机制有清晰认知。HUSTOJ作为经典的开源OJ项目,以简洁的PHP+C++架构完整展示了从提交到评测的全链路实现。它的判题核心通过沙箱机制限制用户程序权限,利用Linux系统调用完成资源管控,实现隔离运行,同时支持多种编程语言和特殊判题。在技术价值上,研究此类系统有助于掌握安全编程和系统设计方法,广泛应用于高校ACM集训、课程上机考试和企业算法考核

weixin_35972981的博客 199

横向滚动标题栏(HorizontalScrollView+GridView+ViewPager+自定义适配器)

实现横向标题滚动界面,相当于一些客户端,今日头条类似,可滑动标题栏,点击标题栏中的标题会改变状态,并且加入ViewPager控件,滑动界面会显示相对应的标题并且改变状态

教你使用HorizontalScrollView和ListView打造左右和上下都可以滑动的列表布局

在项目的进行中要用到左右滑动又能上下滑动的列表布局,现在使用一个HorizontalScrollView嵌套一个ListView可以很好的解决拓展的问题,这里提供一个思路,希望能帮到有需要的朋友。

菜鸟江涛的博客 9167

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

演讲笔记 | 深入浅出C++中的免等待算法 - CppCon 2024

本文介绍了C++中免等待(Wait-free)算法的设计与实现。首先回顾了并发算法的分类:阻塞、无锁和免等待,重点分析了免等待作为最高进度保证的特点。通过粘性计数器案例,对比了基于锁、无锁CAS循环的实现方案,指出传统无锁算法可能存在的线程饥饿问题。最后提出免等待的核心思想——协作式"帮助"机制,利用"窃取位"技术在线程间共享状态,确保所有操作都能在有限步骤内完成。文章还讨论了线性化在并发语义中的关键作用,为高并发场景下的算法设计提供了理论指导

qq_40005789的博客 744

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1054

BES (恒玄)HFP通话笔记

1.audio_developer 调试:SDK 需要打开某个算法,需要原厂打开对应宏定义编译出新的SDK,只要涉及到lib库里的功能都需要原厂手动修改编译。开发商和原厂FAE做起来都会比较累。如果没有原厂支持根本没法做,很少文档,SDK也很多问题,没法开箱即用如果要支持audio_developer上位机调试,还需改代码,如果对整个原理不清楚就没法做,没文档只能啃代码调试工具设计的也有待加强,串口通讯调试对耳机这类产品非常麻烦,本来板子就不大,还要焊接一堆线,调试还要拖着串口线。

飞天鱼 690

信息学奥赛一本通在线评测系统:C++刷题与竞赛进阶指南

在线评测系统(Online Judge)是一种基于自动化判题机制的编程练习平台,通过编译、运行和比对测试数据来验证代码正确性。其核心原理是将提交的代码与预设的输入输出进行逐字符匹配,并依据时间与空间限制判定AC、WA、TLE等结果。这种机制为C++学习者和算法竞赛选手提供了客观的反馈闭环,广泛应用于信息学奥赛训练、算法基础夯实及编程面试准备。信息学奥赛一本通在线评测系统正是这一技术的典型实践,它依托经典教材的题号体系,帮助用户从语法练习逐步进阶到动态规划等高级算法,是竞赛入门与能力提升的重要工具。

weixin_34174422的博客 339

Pluto SDR新手避坑指南:从环境配置到第一个MATLAB收发程序(附完整代码)

本文为Pluto SDR新手提供全面的避坑指南,从硬件连接到MATLAB环境配置,再到第一个信号收发程序的实现。详细介绍了驱动安装、常见问题排查以及关键参数设置,帮助用户快速上手软件定义无线电(SDR)技术,并附有完整代码示例。

weixin_33168937的博客 325

OJ题情况处理步骤C++

个人经验与总结

sparkle_soul的博客 1562

Zotero on Mac: 高效文献管理与引用指南

本文为Mac用户提供了一份全面的Zotero高效文献管理与引用指南。从安装配置、文献收集管理、PDF深度阅读与笔记,到在Word中无缝插入引用和生成参考文献,详细讲解了核心工作流。同时推荐了ZotFile、Better BibTeX等必备插件,并介绍了利用同步与WebDAV实现跨设备无缝衔接的方法,助力研究者构建个人数字知识库,极大提升学术研究效率。

weixin_29281941的博客 1179

X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (二) 摩尔纹的产生机理

1,横向摩尔纹的表现 2,纵向摩尔纹的表现 3,摩尔纹在pitch = 143μm(注:pitch为采样间隔/周期)的FPD上的表现。 4,摩尔纹的危害(严重的影响了临床诊断) 5,摩尔纹对胸片肺部肺纹理的破坏 6,滤线栅的频率(滤线栅生产厂家的产品参数)。判断摩尔纹产生的重要依据之一 7,DR平板探测器的采样频率/空间极限分辨率 l.........

松下J27录放机 4982

刷C++语法题的网站,记录刷题过程【C++语法题】

C++最最最最最最小白的刷题从零之旅

meeiuliuus的博客 419

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 768

C++在线OJ负载均衡实战:从单体架构到高可用集群的设计与实现

负载均衡是构建高并发、高可用后端服务的核心技术,其核心原理在于将用户请求智能分发到多个后端服务器,以提升系统整体吞吐量和容错能力。在工程实践中,负载均衡技术能有效解决单点性能瓶颈,是实现服务弹性伸缩的关键。对于在线评测系统这类计算密集型、有状态且对实时性要求高的应用场景,通用的负载均衡器往往难以满足其细粒度的资源调度和业务协议需求。本文深入探讨了如何为C++在线OJ系统自研一个专用的负载均衡调度中心,通过实时收集判题服务器的CPU、内存及队列长度等负载指标,并基于最小负载优先等策略进行动态任务分发。项目采用

weixin_30340819的博客 437

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从Dev-C++到云端:用快马AI平台打造新一代C++在线IDE

与Dev-C++的单色主题不同,云端编辑器支持自定义主题切换,夜间模式对开发者更友好。通过快马平台,我们还能获得AI实时辅助,这是本地工具难以实现的。的一键部署后,最惊喜的是省去了配置环境的繁琐步骤。相比Dev-C++的传统调试界面,云端版本可以实时显示内存数据可视化图表,这对指针和数据结构的学习特别有帮助。与Dev-C++的纯本地管理不同,所有项目自动云端存储,支持生成分享链接进行协作。作为一名长期使用Dev-C++的开发者,最近尝试将熟悉的开发环境搬到云端时,发现。能完美实现这个需求。

SunstoneLion34的博客 1097

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: startActivityForResult的使用
下一篇: Viewpager的基本使用
cst_code
博客等级 码龄10年 4粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值