精华内容
下载资源
问答
  • 列表框不响应点击事件
    2021-06-02 20:04:37

    点击列表项的事件ListView listView = (ListView) findViewById(R.id.listView);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override

    public void onItemClick(AdapterView> adapterView, View view, int i, long l) {

    Toast.makeText(MainActivity.this, ((TextView)view.findViewById(R.id.count)).getText().toString(), Toast.LENGTH_SHORT).show();

    }

    });

    点击列表项中某一控件的事件

    这个就要用 BaseAdapter 那个方法了,在其 getView 方法中,如下:holder.title.setText(articles.get(i).title);

    holder.author.setText(articles.get(i).author);

    holder.count.setText(articles.get(i).count + "");

    holder.title.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

    Toast.makeText(MainActivity.this, holder.count.getText().toString(), Toast.LENGTH_SHORT).show();

    }

    });

    主要就是 setOnClickListener 方法,前面三句代码这里写出来主要是告诉你这个 setOnClickListener 大概放在哪个位置。

    当然这种这种方式实际上也可以实现列表项事件,用 view.setOnClickListener() 即可。view 为 getView() 方法传入的参数。

    还有一种情况,就是这个点击事件要处理的事情在这里没办法完成,必须要跑到 Activity 类中去完成。怎么办?

    这样的话,就只有为 Adapter 添加一个 Callback 了。Android 中如何实现 callback?

    更多相关内容
  • 易语言禁止超级列表框调整列宽又可以响应表头单击源码,禁止超级列表框调整列宽又可以响应表头单击,禁调列宽响应点击,处理,排序子程序,SetWindowLong,CallWindowProc,SendMessage
  • 禁止超级列表框调整列宽又可以响应表头单击
  • 易语言源码禁止超级列表框调整列宽又可以响应表头单击.rar 易语言源码禁止超级列表框调整列宽又可以响应表头单击.rar 易语言源码禁止超级列表框调整列宽又可以响应表头单击.rar 易语言源码禁止超级列表框调整列宽...
  • 易语言超级列表框调整列宽源码,超级列表框调整列宽,禁调列宽响应点击,处理,排序子程序,SetWindowLong,CallWindowProc,SendMessage
  • 禁止超级列表框调整列宽又可以响应表头单击。@易语言学习论坛。
  • 列表框控件(ListBox)的常用属性 属性 说明 (Name) 列表框控件的名称 Appearance 是否用立体效果绘制,取值为:0 平面 1 3D(立体) BackColor 设置背景颜色,可从弹出的调色板选择。 该控件获得焦点时,失去焦点的控件...

    💗 大家好🤗🤗🤗,我是左手の明天!💗

    📆  最近更新:2022 年 5 月 24 日,左手の明天的第 244 篇原创博客

    📚 更新于专栏:Matlab GUI编程技巧


    目录

    🚩listbox控件用法和属性

    🚩 回调函数

    🚩添加/删除列表框中的项目

    ⭐️删除ListBox的某一项

    ⭐️添加ListBox的某一项

    ⭐️删除“空”项中的simpliest办法

    🚩listbox读取/添加不重复数据

    ⭐️读取数据

    ⭐️写入数据

    🚩创建列表框组件:uilistbox

    ⭐️语法

    ⭐️输入参数

    parent - 父容器

    Value - 值

    Items - 列表框项目

    ItemsData - 与 Items 属性值的每个元素关联的数据

    Multiselect - 多项目选择

    ValueChangedFcn - 值更改函数

    Position - 列表框的位置和大小

    ⭐️创建列表框

    ⭐️设置和访问列表框属性值 

    ⭐️显示列表框选项

    ⭐️显示列表框数据

    ⭐️允许选择多个项目的列表框


    🚩listbox控件用法和属性

    列表框是一种 UI 组件,用于显示列表中的项目。可通过属性控制列表框的外观和行为。使用圆点表示法引用特定的对象和属性:

    fig = uifigure;
    list = uilistbox(fig);
    list.Items = {'Red','Green','Blue'};

    属性列表:

    • Value - 值
    • Items - 列表框项目
    • ItemsData - 与 Items 属性值的每个元素关联的数据
    • FontName - 字体名称
    • FontSize - 字体大小
    • FontWeight - 字体粗细

    字体粗细,指定为下列值之一:

    1.  'normal' - 特定字体定义的默认粗细
    2. 'bold' - 字符轮廓比 'normal' 粗 并非所有字体都有加粗字体。对于非加粗字体,指定 'bold' 会得到普通字体。

    • FontAngle - 字体角度

    字体角度,指定为 'normal' 或 'italic'。并非所有字体都有倾斜字体角度。对于无斜体字体,指定 'italic' 后会使用常规字体角度。

    • FontColor - 字体颜色

    字体颜色,指定为 RGB 三元组、十六进制颜色代码或下表中列出的选项之一。

    RGB 三元组和十六进制颜色代码对于指定自定义颜色非常有用。

    1.  RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度值必须位于 [0,1] 范围内,例如 [0.4 0.6 0.7]
    2. 十六进制颜色代码是字符向量或字符串标量,以井号 (#) 开头,后跟三个或六个十六进制数字,范围可以是 0 到 F。这些值不区分大小写。因此,颜色代码   '#FF8800'   与   '#ff8800''#F80' 与 '#f80' 是等效的。

     下表列出了命名颜色选项、等效 RGB 三元组和十六进制颜色代码。

    颜色名称短名称RGB 三元组十六进制颜色代码
    'red''r'[1 0 0]'#FF0000'
    'green''g'[0 1 0]'#00FF00'
    'blue''b'[0 0 1]'#0000FF'
    'cyan''c'[0 1 1]'#00FFFF'
    'magenta''m'[1 0 1]'#FF00FF'
    'yellow''y'[1 1 0]'#FFFF00'
    'black''k'[0 0 0]'#000000'
    'white''w'[1 1 1]'#FFFFFF'
    • BackgroundColor - 背景色
    • Visible - 可见性状态

    可见性状态,指定为 'on' 或 'off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false

    1.  'on' - 显示对象。
    2.  'off' - 隐藏对象而不删除它。您仍然可以访问不可见 UI 组件的属性。
    •  Multiselect - 多项目选择
    • Enable - 工作状态
    • ContextMenu - 上下文菜单
    • Position - 列表框的位置和大小
    • InnerPosition - 列表框的内部位置和大小
    • OuterPosition - 列表框的外部位置和大小
    • Layout - 布局选项

    布局选项,指定为 GridLayoutOptions 对象。此属性为网格布局容器的子级组件指定选项。如果组件不是网格布局容器的子级(例如,它是图窗或面板的子级),则此属性为空且不起作用。但是,如果组件是网格布局容器的子级,则可以通过在 GridLayoutOptions 对象上设置 Row 和 Column 属性,将组件放置在网格的所需行和列中。

    例如,以下代码将一个列表框放置在其父网格的第三行第二列中。

    g = uigridlayout([4 3]);
    list = uilistbox(g);
    list.Layout.Row = 3;
    list.Layout.Column = 2;

    要使该列表框跨多个行或列,请将 Row 或 Column 属性指定为二元素向量。例如,此列表框跨列 2 到 3

    list.Layout.Column = [2 3];
    • Type - 图形对象的类型
    • Tag - 对象标识符
    • UserData - 用户数据

    🚩 回调函数

    (1)Callback - 用户与控件交互时执行的回调函数

    Note:''(默认) | 函数句柄 | 元胞数组 | 字符串

    此函数使控件响应用户输入,例如按钮点击、滑动条移动或复选框选中。

    (2)CreateFcn - 控件创建函数

    Note:函数句柄 | 元胞数组 | 字符串

    该属性指定要在 MATLAB 创建 uicontrol 时执行的回调函数。MATLAB 在执行 CreateFcn 回调之前初始化所有的控件属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。

    CreateFcn 代码中使用 [gcbo] 函数可以获得创建的控件的句柄。

    对现有控件设置 CreateFcn 属性没有任何作用。

    (3)DeleteFcn - 控件删除函数

    Note:函数句柄 | 元胞数组 | 字符串

    DeleteFcn 属性指定要在 MATLAB 删除控件时(例如,最终用户删除图形时)执行的回调函数。MATLAB 在销毁控件的属性之前执行 DeleteFcn 回调。如果不指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。

    在 DeleteFcn 代码中使用 gcbo 函数以获得删除的控件的句柄。

    (4)ValueChangedFcn - 值更改函数

    当用户从列表框中选择不同的项目时,将会执行此回调函数。如果以编程方式更改 Value 属性设置,将不会执行此回调函数。

    此回调函数可以访问有关用户与列表框的交互的特定信息。MATLAB 将 ValueChangedData 对象中的此信息作为第二个参数传递给回调函数。在 App 设计工具中,该参数名为 event。您可以使用圆点表示法查询对象属性。例如,event.PreviousValue 返回列表框的上一个值。ValueChangedData 对象不可用于指定为字符向量的回调函数。

    下表列出了 ValueChangedData 对象的属性。

    属性
    Value列表框在 App 用户最近一次与它交互之后的值
    PreviousValue列表框在 App 用户最近一次与它交互之前的值
    Source执行回调的组件
    EventName'ValueChanged'

    🚩添加/删除列表框中的项目

    实现的功能

    matlab中尝试创建一个列表框,可以动态添加或删除项目

    需要用到listboxhandle,可以用findobj来获得

    hMyListBox = findobj('type', 'listbos'); %如果你的GUI上只有一个listbox的话

    ⭐️删除ListBox的某一项

    oldString = get(hMyListBox, 'String'); 
    curPos = get(hMyListBox, 'Value'); 
    oldString(curPos) = []; 
    set(hMyListBox, 'String', oldString);

    当然也可以通过以下方式实现:

    n=get(handles.listbox,'value'); %获取选中的行号
    str=get(handles.listbox,'string'); %获取列表中的所有数据
    m=size(str1,1);
    k=0;
    for i=1:m
        for j=1:size(n,2)
            if(i~=n(j))
                k=k+1;
                str1(k,:)=str(i,:);
            end
        end
    end
    set(handles.listbox,'string',str1);

    ⭐️添加ListBox的某一项

    newItem={'This is a new string'}; 
    oldString = get(hMyListBox, 'String'); 
    curPos = get(hMyListBox, 'Value'); 
    numStrings = length(oldString); 
    newString = {oldString(1:curPos) newItem oldString(curPos:numStrings)}; 
    set(hMyListBox, 'String', newString);

    ⭐️删除“空”项中的simpliest办法

    删除“空”项中的simpliest办法就是更新listbox字符串与remainig项目。

    有三种可能性:

    • 第一个元素已被删除:新列表将为upd_list={existingItems{2:end}}
    • 最后一个元素已被删除:新列表将为upd_list={existingItems{1:end-1}}
    • ans中间元素已被删除:新列表将为upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}}

    还可以检查列表的所有元素都被删除,在这种情况下,禁用“删除”pushbutton;在这种情况下,您必须在“添加”callback中启用它。

    btnDeleteLabel_Callback相关代码可以为如下:

    % --- Executes on button press in btnDeleteLabel. 
    function btnDeleteLabel_Callback(hObject, eventdata, handles) 
    % hObject handle to btnDeleteLabel (see GCBO) 
    % eventdata reserved - to be defined in a future version of MATLAB 
    % handles structure with handles and user data (see GUIDATA) 
    
    selectedId = get(handles.listbox_labels, 'Value')  % get id of selectedLabelName 
    existingItems = get(handles.listbox_labels, 'String') % get current listbox list 
    % 
    % It is not necessary 
    % 
    % existingItems{selectedId} = []     % delete the id 
    
    % Identify the items: if in the list only one ites has been added the 
    % returned list is a char array 
    if(class(existingItems) == 'char') 
        upd_list='' 
        set(handles.listbox_labels, 'String', upd_list) 
    else 
        % If the returned list is a cell array there are three cases 
        n_items=length(existingItems) 
        if(selectedId == 1) 
         % The first element has been selected 
         upd_list={existingItems{2:end}} 
        elseif(selectedId == n_items) 
         % The last element has been selected 
         upd_list={existingItems{1:end-1}} 
         % Set the "Value" property to the previous element 
         set(handles.listbox_labels, 'Value', selectedId-1) 
        else 
         % And element in the list has been selected 
         upd_list={existingItems{1:selectedId-1} existingItems{selectedId+1:end}} 
        end 
    end 
    % Update the list 
    set(handles.listbox_labels, 'String', upd_list)  % restore cropped version of label list 
    
    % Disable the delete pushbutton if there are no more items 
    existingItems = get(handles.listbox_labels, 'String') 
    if(isempty(existingItems)) 
        handles.btnDeleteLabel.Enable='off' 
    end 

    🚩listbox读取/添加不重复数据

    ⭐️读取数据

    • 如果列表只有1个数据,则读取格式为char;
    • 如果列表有多于1个数据,则读取格式为cell;

    因此,为了统一,使用了str to cell转换函数cellstr()

    print_list = cellstr(get(handles.listbox2,'string'));

    ⭐️写入数据

    将new_print_list写入listbox中

    set(handles.listbox,'string',new_print_list);

    缺陷:以上方式会清空原来listbox中的数据,直接用new_print_list覆盖。

    如果想要保留原来listbox中的数据,而且满足 “如果新数据已经在列表中,则忽略;否则就加到列表中”,那么可以改为以下代码:

    % 先读取原list中的数据
    print_list = cellstr(get(handles.listbox,'string'));
    
    % 如果new_print_list是新数据,则加入列表;否则不加入
    if ~strcmp(cur_str, print_list)
    	new_print_list = [print_list; cellstr(cur_str)];
    	set(handles.listbox,'string',new_print_list);
    end

    🚩创建列表框组件:uilistbox

    ⭐️语法

    • lb = uilistbox :在新图窗窗口中创建一个列表框,并返回 ListBox 对象。
    • lb = uilistbox(parent) :在指定的父容器中创建列表框。父容器可以是使用uifigure函数创建的 Figure 或其子容器之一。
    • lb = uilistbox(___,Name,Value) :使用一个或多个 Name,Value 对组参数指定 ListBox 属性。

    ⭐️输入参数

    parent - 父容器

    指定为使用 uifigure 函数创建的 Figure 对象或其子容器之一:TabPanelButtonGroup 或 GridLayout。如果不指定父容器,MATLAB 会调用 uifigure 函数创建新 Figure 对象充当父容器。

    Value - 值

    指定为 Items 数组或 ItemsData 数组的元素,或指定为空元胞数组。默认情况下,Value 是 Items 中的第一个元素。

    要不指定任何选择,请将 Value 设置为空元胞数组。

    将 Value 指定为 Items 的元素,即可选择与该元素匹配的列表项。如果 ItemsData 非空,则 Value 必须设置为 ItemsData 的元素,而列表框将选中列表中的关联项目。

    Items - 列表框项目

    指定为字符向量元胞数组、字符串数组或一维分类数组。允许重复的元素。列表框显示的选项与 Items 数组中的元素数量一样多。如果将此属性指定为分类数组,MATLAB 将使用数组中的值,而不是完整的类别集。

    ItemsData - 与 Items 属性值的每个元素关联的数据

    与 Items 属性值的每个元素关联的数据,指定为 1×n 数值数组或 1×n 元胞数组。允许重复的元素。

    例如,如果您将 Items 值设置为员工姓名,则可以将 ItemsData 值设置为对应的员工 ID 号。ItemsData 值对 App 用户不可见。

    如果 ItemsData 值和 Items 值中的数组元素数量不匹配,将发生以下情况之一:

    • 如果 ItemsData 值为空,则 Items 值的所有元素都呈现给 App 用户。

    • 如果 ItemsData 值中的元素数大于 Items 值,则 Items 值的所有元素都呈现给 App 用户。MATLAB 将忽略多余的 ItemsData 元素。

    • 如果 ItemsData 值非空,但元素数少于 Items 值,只将在 ItemsData 值中具有对应元素的 Items 值的元素呈现给 App 用户。

    示例: {'One','Two','Three'}

    示例: [10 20 30 40]

    Multiselect - 多项目选择

    多项目选择,指定为 'off' 或 'on',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。

    ValueChangedFcn - 值更改函数

    当用户从列表框中选择不同的项目时,将会执行此回调函数。如果以编程方式更改 Value 属性设置,将不会执行此回调函数。

    此回调函数可以访问有关用户与列表框的交互的特定信息。MATLAB 将 ValueChangedData 对象中的此信息作为第二个参数传递给回调函数。在 App 设计工具中,该参数名为 event。您可以使用圆点表示法查询对象属性。例如,event.PreviousValue 返回列表框的上一个值。ValueChangedData 对象不可用于指定为字符向量的回调函数。

    下表列出了 ValueChangedData 对象的属性。

    属性
    Value列表框在 App 用户最近一次与它交互之后的值
    PreviousValue列表框在 App 用户最近一次与它交互之前的值
    Source执行回调的组件
    EventName'ValueChanged'

    Position - 列表框的位置和大小

    列表框相对于父容器的位置和大小,指定为向量 [left bottom width height]。下表介绍该向量中的每个元素。

    元素说明
    left父容器的内部左边缘与列表框的外部左边缘之间的距离
    bottom父容器的内部下边缘与列表框的外部下边缘之间的距离
    width列表框的左右外部边缘之间的距离
    height列表框的上下外部边缘之间的距离

    所有测量值都以像素为单位。

    Position 值相对于父容器的可绘制区域。可绘制区域是指容器边框内的区域,不包括装饰元素(如菜单栏或标题)所占的区域。

    示例: [100 100 100 200]

    ⭐️创建列表框

    在图窗窗口中创建一个列表框。

    fig = uifigure('Position', [100 100 300 250]);
    lbx = uilistbox(fig);

    ⭐️设置和访问列表框属性值 

    创建一个列表框。

    fig = uifigure;
    lbx = uilistbox(fig);

    确定列表框是否允许多选。

    multi = lbx.Multiselect
    
    multi =
    
         off

    允许多选。

    lbx.Multiselect = 'on';

    ⭐️显示列表框选项

    创建一个列表框,以便在用户选择列表中的某个项目时执行相应操作。

    将以下代码以 selectlistbox.m 文件保存到 MATLAB 路径上。

    此代码将创建一个 App,其中包含一个列表框和一个文本区域。ValueChangedFcn 回调将更新文本区域以显示列表框选项。

    function selectlistbox
    
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create text area
    txt = uitextarea(fig,...
        'Position',[125 90 100 22],...
        'Value','First');
    
    % Create list box
    lbox = uilistbox(fig,...
        'Position',[125 120 100 78],...
        'Items',{'First','Second','Third'},... 
        'ValueChangedFcn', @updateEditField); 
    
    % ValueChangedFcn callback
    function updateEditField(src,event) 
        txt.Value = src.Value;
    end
    
    end

    运行 selectlistbox 并从列表中选择一个选项。

    ⭐️显示列表框数据

    创建一个列表框,其中的每个项目都有关联的数值。当用户选择列表框中的项目时,编辑字段将显示关联的数值。

    将以下代码以 dataselection.m 文件保存到 MATLAB 路径上。此代码将创建一个 App,其中包含一个列表框和一个数值编辑字段。列表中的每一项都有与其关联的温度。当用户选择列表中的项目时,ValueChangedFcn 回调将在编辑字段中显示相应的温度。

    function dataselection
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create Numeric Edit Field
    ef = uieditfield(fig,'numeric',...
        'Position',[125 90 100 22]);
    
    % Create List Box
    lbox = uilistbox(fig,...
        'Items', {'Freezing', 'Warm', 'Hot', 'Boiling'},...
        'ItemsData', [0, 25, 40, 100],...
        'Position',[125 120 100 78],...
        'ValueChangedFcn', @selectionChanged);
    
    % ValueChangedFcn callback
    function selectionChanged(src,event)
        % Display list box data in edit field
        ef.Value = src.Value;
    end
    
    end

    运行 dataselection 并选择列表中的项目。数值编辑字段将更新以反映与所选项相关联的温度。

    ⭐️允许选择多个项目的列表框 

    创建一个 App,其中包含一个列表框,允许选择多个项目。编写 ValueChangedFcn 回调以便在列表框下方的文本区域中显示所选项。

    将以下代码以 multiselect.m 文件保存到 MATLAB 路径上。

    function multiselect
    fig = uifigure('Position',[100 100 350 275]);
    
    % Create Text Area
    txt = uitextarea(fig,...
        'Position',[125 80 100 50]);
    
    % Create List Box
    lbox = uilistbox(fig,...
        'Position',[125 150 100 78],...
        'Multiselect','on',...
        'ValueChangedFcn',@selectionChanged);
    
    % ValueChangedFcn callback
    function selectionChanged(src,event)
        txt.Value = src.Value;
    end
    
    end

    运行 multiselect,然后从列表中选择项目。文本区域显示您选择的内容。


    🌟全文共9567个字,码字总结不易,老铁们来个三连:点赞、关注、评论🌟

    🌟作者:左手の明天🌟

    🌟原创不易,转载请联系作者并注明出处🌟

    展开全文
  • ListView,安卓开发一大重点,实现列表数据加载与条目点击事件

    效果预览

    大概就是实现列表,列表中有诸多条目且可以触发点击事件。
    在这里插入图片描述

    基本构架

    activity_main.xml

    直接在任意布局里创建一个ListView就好了,但这个时候徒有其形,其中的条目内容是默认的,也无法互动。

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

    条目布局

    列表中的条目称之为item,这些item也有自己的布局,我们需要在res->layout文件夹中为其创建布局资源item_layout.xml。其中为每个条目中的布局情况,这里演示比较简单,就用线性布局,组件就只有一个文本,设置其id为text

    <?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="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"/>
    
    </LinearLayout>
    

    Bean类

    一般来说,item中的数据需要从别的渠道获取(比如联网),我们需要一个类来完成获取数据的操作,这个类就是Bean(我也不知道为啥要叫这个名字)。因为这里数据只有一个字符串,所以该类的成员变量只有一个String name,然后使用快捷键Alt+Insert,选择Getter and Setter就可以快速补全代码。
    在这里插入图片描述

    package com.example.mylistview;
    
    public class Bean {
        String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    

    数据获取

    因为还没有学联网,这里先本地自己造一些放进条目里的字符串,主要是演示一下怎么使用Bean类。

    先声明一个Bean类型的列表用来装数据:

    private List<Bean> data = new ArrayList<>();
    

    之后for循环,声明Bean类型的实例,设置其中的数据,然后存到列表里。

    		for(int i=0;i<100;++i){
                Bean bean = new Bean();
                bean.setName("ShadyPi"+i);
                data.add(bean);
            }
    

    MyAdapter类

    完成数据的获取之后,就需要将其放到ListView中,先通过findViewById找到我们的ListView,然后通过一个adapter将数据填充进去。

    		ListView list = findViewById(R.id.list);
            list.setAdapter(new MyAdapter(data, this));
    

    MyAdapter类继承自安卓提供的BaseAdapter类,使用Alt+Enter就可以补全需要实现的四个方法的框架。分别是获取条目数量、获取Item、获取ItemID和获取View。

    首先我们先把数据传入adapter中,这可以通过MyAdapter的构造方法来实现,分别传入data和context:

        private List<Bean> data;
        private Context context;
    
        public MyAdapter(List<Bean> data, Context context) {
            this.data = data;
            this.context = context;
        }
    

    而自动补全的几个方法也需要略改一下,比如说获取条目数量,我们需要返回data列表的大小:

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

    获取条目ID的时候我们直接返回i:

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

    而获取View就要复杂一些了,也是最关键的,每次在屏幕上显示某个item时都需要调用该函数。

    改方法的逻辑是,当某个View之前没有被获取过时,新建一个viewHolder,该类是用来储存view中的信息的,防止重复findViewById,算是一个优化,该类的成员就是每个item中的组件,在这里就是一个TextView:

    	private final class  ViewHolder{
            TextView textView;
        }
    

    用viewHolder将数据存储起来,之后用setTag()将其添加到view上,然后用之前写好的条目布局item_layout渲染出一个View,将其放到view里;如果该view之前就被创建过,我们就用getTag()将之前添加的数据拿回viewHolder里。
    最后,将对应条目的数据加载到viewHolder中,就完成了。

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder viewHolder;
            if(view == null){
                viewHolder = new ViewHolder();
                view = LayoutInflater.from(context).inflate(R.layout.item_layout, viewGroup, false);
                viewHolder.textView = view.findViewById(R.id.text);
                view.setTag(viewHolder);
            }
            else {
                viewHolder = (ViewHolder) view.getTag();
            }
            //TextView textview = view.findViewById(R.id.text);
            //textview.setText(data.get(i).getName());
            viewHolder.textView.setText(data.get(i).getName());
    
            Log.e("ShadyPi", "getView: "+i);
    
            return view;
        }
    

    条目点击事件

    这个跟按钮点击差不多,在MainActivity.java中设置一个监听及其点击响应函数即可:

    		list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Log.e("ShadyPi", "click:"+i);
                }
            });
    

    运行效果

    可以看到,随着屏幕滚动,条目不断被加载,一直在调用getView函数,而点击后响应事件也被触发了。
    在这里插入图片描述

    展开全文
  • MFC列表框控件的动态编辑

    千次阅读 2019-09-10 13:14:41
    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数。我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还容易。 最近看到一个文章...

    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数。我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还不容易。

    最近看到一个文章 https://blog.csdn.net/qingyang8513/article/details/50986455 ,这个直接用 listctrl 和 一个Edit 控件,很简单。所以我也测试一下,并记录在此。

    运行效果如下,点击一处列表框里内容即可编辑,但我剪辑图时剪辑不到编辑状态。

    我的运行环境是vc2010,下面开始讲解过程:

    重点内容:

          1)List Control控件NM_DCLICK消息响应事件;

          2)Edit Control的KillFocus消息响应;

          3)Edit Control的动态显示及隐藏;

          4)List Control获取指定行和列的编号,并获取指定行和列的内容及修改赋值。

    操作:

    1、创建基于对话框的MFC应用程序,删除原有的静态文本;

    2、添加一个List Control控件和一个Edit Control控件,并分别关联控制变量m_ListTem和m_EditTest(List Control控件适当调整大小,Edit Control大小不用调整);

    3、初始化对话框函数OnInitDialog中实现List Control控件和Edit Control控件的初始化,    InitList();    UpdateList();

    代码如下:

    BOOL CListCtrlTestDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    	InitList();
    	UpdateList();
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CListCtrlTestDlg::InitList(void)
    {
    	Clayer layer={"zhang",1.3,15.6,88};
    	m_layer.push_back(layer);
    	Clayer  layer1={"Li",22.3,25.6,288};
    	m_layer.push_back(layer1);
    	Clayer layer2={"Wang",32.33,35.6,388};
    	m_layer.push_back(layer2);
    
    	m_EditTest.ShowWindow(SW_HIDE);
    	CRect rect;
    	m_ListTem.GetClientRect(&rect);
    	int iLength = rect.Width();
    	m_ListTem.SetExtendedStyle(m_ListTem.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    	m_ListTem.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40);
    	m_ListTem.InsertColumn(1, _T("名字"), LVCFMT_CENTER, 80);
    	m_ListTem.InsertColumn(2, _T("x"), LVCFMT_CENTER, (iLength - 120)/3);
    	m_ListTem.InsertColumn(3, _T("y"), LVCFMT_CENTER, (iLength - 120)/3);
    	m_ListTem.InsertColumn(4, _T("旋转角度"), LVCFMT_CENTER, (iLength - 120)/3);
    
    
    }
    
    void CListCtrlTestDlg::UpdateList(void)
    {
    
    	CString index,x,y,z,name,count,rotate,blocks;
    	while(m_ListTem.GetItemCount()>0)
    		m_ListTem.DeleteItem(0);
    	for(int i=0;i<m_layer.size();i++)
    	{
    	
    		index.Format("%d",i);
    		Clayer& layer=m_layer[i];
    		name=layer.name;
    		x.Format("%.2f",layer.x);
    		y.Format("%.2f",layer.y);
    		count.Format("%d",layer.count);
    
    
    		m_ListTem.InsertItem(i,index);
    
    		m_ListTem.SetItemText(i,1,name);
    		m_ListTem.SetItemText(i,2,x);
    		m_ListTem.SetItemText(i,3,y);
    		m_ListTem.SetItemText(i,4,count);
    	}
    }

    在h 文件中定义层参数结构,并定义层参数向量m_layer.

    typedef struct {CString name;float x;float y;int count;} Clayer;

    std::vector<Clayer> m_layer;

    有上面,上面代码才不报错。这里完成了初始显示,应该可以得到开头的效果,但不能编辑。

    动态编辑的核心

    4、对话框头文件中添加int型变量m_Row和m_Col,用于保存双击时选中的行和列号,并初始化为-1(未选中状态);

    5、为List Control控件添加NM_DBLCLK消息响应,并添加代码如下:

    void CListCtrlTestDlg::OnDblclkList2(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    	// TODO: Add your control notification handler code here
    		CRect rc;
    	CString strTemp;
    	NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR;
    	m_Row = pNMListView->iItem;
    	m_Col = pNMListView->iSubItem;
     
    	if (pNMListView->iItem == -1)	//选择空白处
    		return;
     
    	if (m_Col != 0)	// 选择子项
    	{
    		m_ListTem.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc);
    		m_EditTest.SetParent(&m_ListTem);
    		m_EditTest.MoveWindow(rc);
    		m_EditTest.SetWindowText(m_ListTem.GetItemText(m_Row, m_Col));
    		m_EditTest.ShowWindow(SW_SHOW);
    		m_EditTest.SetFocus();//设置Edit焦点
    		m_EditTest.ShowCaret();//显示光标
    		m_EditTest.SetSel(0, -1);//全选
    	}
    
    	*pResult = 0;
    }
    

     

    6、为Edit Control控件添加EN_KILLFOCUS消息响应,并添加代码如下:

    void CListCtrlTestDlg::OnKillfocusEdit1()
    {
    	// TODO: Add your control notification handler code here
    	CString str;
    	m_EditTest.GetWindowText(str);
    	m_ListTem.SetItemText(m_Row, m_Col, str);
        //这里其实应该保存编辑结果,简化了,实际程序要有改变参数
    	m_EditTest.ShowWindow(SW_HIDE);
    }

    现在可以编译运行并测试程序了,应该就是我们开头的结果。

    改进

    输入完数据后,一般希望回车,就生效,可实际情况是要离开才生效,有点操作不方便。

    编辑框怎么相应回车呢?

    类精灵CListCtrlTestDlg里转到 Virtual function,点击添加 PreTranslateMessage

    编辑PreTranslateMessage函数如下:

    BOOL CListCtrlTestDlg::PreTranslateMessage(MSG* pMsg)
    {
    	 if (WM_KEYDOWN ==pMsg->message && VK_RETURN == pMsg->wParam)
    	 {
    		 if (m_EditTest.IsWindowVisible())
    		{
    			m_EditTest.ShowWindow(SW_HIDE);
    			return TRUE;
    		}
    	 }
    	return CDialogEx::PreTranslateMessage(pMsg);
    }
    

    这段代码的含义是:在按下回车键时, 如果编辑框是可见的,就让编辑框不显示。编辑框不显示就触发EN_KILLFOCUS消息。达到回车就保存的目的。

     

     

    展开全文
  • 本文链接:https://blog.csdn.net/smileiam/article/details/90643667遇到这样一个需求,一个RecyclerView布局(GridView九宫格样式),每点击一项,弹出一个气泡提示,再点击下一项的时候,上一项气泡提示消失,...
  • 1-3、React绑定属性和事件,以及事件响应。 大家好,我是Counterrr 忘初心,砥砺前行 本文目录 一、根据input以及列表渲染做了小项目展示; 二、form表单input初使用; 三、列表渲染; 四、小项目代码解读;...
  • VC6.0 MFC 列表框 列表控件 添加 修改 删除

    千次阅读 多人点赞 2020-06-28 15:46:24
    VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一、未卜先知 1、编译运行后,点击“学生档案信息”,界面如下图所示...
  • 列表框属性

    千次阅读 2019-11-22 14:01:41
    列表框的项能全部显示出来时,可以用滚动条来滚动显示。 1. 基础知识 默认的列表框只允许用户单选,需要多选时,须把列表框的风格定义为 LBS_ MULTIPLESEL 和 LBS_EXTENDEDSEL 。列表框提供的其他风格取值可以...
  • tkinter绘制组件(23)——列表框

    千次阅读 2022-02-26 10:45:28
    tkinter绘制组件(23)列表框
  • 主要介绍了JS实现单击输入框弹出选择效果的方法,涉及JavaScript响应鼠标事件动态操作页面元素与相关属性的实现技巧,需要的朋友可以参考下
  • 1 列表框 先了解列表框的相关内容。 1)新建基于对话框的项目。然后添加如下控件。空白的是列表框ListBox。 2)给编辑区控件添加value类型的CString类型变量。 3)给列表框添加Control类型的ListBox类型变量。 4...
  • UE4 开发之实现按钮事件响应

    千次阅读 2020-12-18 10:33:19
    电子游戏对大家来说应该是熟悉的能再熟悉的东西了,现在游戏已经慢慢的成为了大家生活中可或缺的伙伴,而说到游戏大家聚在一起讨论的可能就是这个游戏的画质如何,游戏的故事情节如何,以及动画的效果如何等等...
  • list control双击事件编辑列表框

    千次阅读 2018-06-01 11:21:06
    关于这点知识网上的资源其实非常多,这里给个讲的非常好的博客链接,希望你们少走点弯路点击打开链接这里我就多加赘述了,这篇博客希望可以让刚入门的人少走点弯路...
  • 两次单击会产生四个鼠标点击消息,如果第三个消息(第二次按下)和第二个消息(第一次弹起引发的WM_LBUTTONUP)间隔短于指定值,则把第三个消息处理成WM_LBUTTONDBLCLK消息;第四个消息照旧,WM_LBUTTONUP。 如果...
  • 本文要讲的是列表框控件(ListBox)及其使用实例。 Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、...
  • Java列表和组合

    2021-03-13 10:47:19
    列表列表(JList)在界面中表现为列表框,是JList类或它的子类的对象。程序可以在列表框中加入多个文本选择项条目。列表事件事件源有两种:一是鼠标双击某个选项:双击选项是动作事件,与该事件相关的接口是...
  • 组合框和列表框都可以在界面上同时显示多项内容,并且允许用户选中其中的某项内容,列表框还允许同时选择多项。这两种控件的使用,有很多相似之处;2.3.1 技术要点: Windows 中预先定义了一系列“CB_ ”开头的消息...
  • 列表列表(JList)在界面中表现为列表框,是JList类或它的子类的对象。程序可以在列表框中加入多个文本选择项条目。列表事件事件源有两种:一是鼠标双击某个选项:双击选项是动作事件,与该事件相关的接口是...
  • 常用控件:列表框控件ListBox

    千次阅读 2017-09-29 10:10:18
    列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。  列表框也会向父窗口发送通知消息。这些通知消息含义如下:  LBN_DBLCLK:用户...
  • 响应式图文资料列表系统后台应用中心可安装 模板、扫码打赏插件、手机版与电脑版智能管理插件、屏蔽复制与鼠标右键插件、老y文章系统数据迁移至天人工具、OK3W文章系统数据迁移至天人工具、用户注册后自动登录插件、...
  • win32程序创建按钮并响应点击

    万次阅读 多人点赞 2017-10-29 15:26:06
    其实,这按钮与菜单项一样,单击点击后,WindowProc会收到WM_COMMAND消息,和菜单一样。 wParam:低字节位表示ID号,高字节位表示控件通知,比如用户单击了按钮,通知码为BN_CLICKED,这样我们就可以了解到用户...
  • 列表框控件简介   列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。...LBN_ERRSPACE :列表框不能申请足够的动态内存来满足需要 LBN_KILLFOCUS :列表框失去输入焦点 LBN_
  • java swing 实现下拉列表点击事件

    千次阅读 2018-05-18 16:18:01
    1、通过netbeans向页面中添加组合,然后右击组合,选择定制代码 2、 tankNumber.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ //如果选中了一个 if (e.getStateChange...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,560
精华内容 43,424
热门标签
关键字:

列表框不响应点击事件