ListView

  • list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="haha"/>
</LinearLayout>
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>
  • Bean.java
package com.example.mylistview;

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

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { private List<Bean> data = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); for (int i = 0; i < 100; i++) {
Bean bean = new Bean();
bean.setName("haha" + i);
data.add(bean);
} ListView listView = findViewById(R.id.lv);
listView.setAdapter(new MyAdapter(data, this));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Log.e("wmj", "onItemClick:" + i);
}
}); }
}
  • 普通版MyAdapter.java
package com.example.mylistview;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; import java.util.List; public class MyAdapter extends BaseAdapter { private List<Bean> data;
private Context context; public MyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
} @Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int i) {
return null;
} @Override
public long getItemId(int i) {
return i;
} // 每显示一个item都会调用一次
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null){
view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);
}
TextView textView = view.findViewById(R.id.tv);
textView.setText(data.get(i).getName()); Log.e("wmj", "getView:" + i); return view;
} }
  • 优化后的My Adapter.java,减少findviewbyid的时间
package com.example.mylistview;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; import java.util.List; public class MyAdapter extends BaseAdapter { private List<Bean> data;
private Context context; public MyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
} @Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int i) {
return null;
} @Override
public long getItemId(int i) {
return i;
} // 每显示一个item都会调用一次
@Override
public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if(view == null){
// viewHolder和view都只要创建一个就行,反复使用
viewHolder = new ViewHolder();
view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);
viewHolder.textView = view.findViewById(R.id.tv);
view.setTag(viewHolder);
}else{
// 如果view已存在,就从服用之前的viewHolder
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.textView.setText(data.get(i).getName()); Log.e("wmj", "getView:" + i); return view;
} private final class ViewHolder{
TextView textView;
}
}

RecyclerView

  • 在build.gradle中添加依赖:implementation 'androidx.recyclerview:recyclerview:1.1.0'
  • recyclerview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="30sp"
android:text="haha"/>
</LinearLayout>
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>
  • Bean.java
package com.example.myrecyclerview;

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

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager; import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.Toast; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { private List<Bean> data = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); for (int i = 0; i < 100; i++) {
Bean bean = new Bean();
bean.setName("haha" + i);
data.add(bean);
} RecyclerView recyclerView = findViewById(R.id.rv); // 设置布局
// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
// recyclerView.setLayoutManager(linearLayoutManager); // 参数2是指一行几个
// GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
// recyclerView.setLayoutManager(gridLayoutManager); StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager); MyAdapter myAdapter = new MyAdapter(data, this);
recyclerView.setAdapter(myAdapter);
myAdapter.setOnRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
@Override
public void onRecyclerItemClick(int position) {
Log.e("wmj", "onRecyclerItemClick:" + position);
Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_SHORT).show();
}
}); }
}
  • MyAdapter.java
package com.example.myrecyclerview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<Bean> data;
private Context context; public MyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
} @NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.recyclerview_item, null);
return new MyViewHolder(view);
} @Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
holder.tv.setText(data.get(position).getName());
} @Override
public int getItemCount() {
return data == null ? 0 : data.size();
} public class MyViewHolder extends RecyclerView.ViewHolder{ private TextView tv; public MyViewHolder(@NonNull View itemView) {
super(itemView); tv = itemView.findViewById(R.id.tv); itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(onRecyclerItemClickListener != null){
// 执行接口里的监听方法
onRecyclerItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
} // 点击监听
private OnRecyclerItemClickListener onRecyclerItemClickListener; // 给外部设置监听的方法
public void setOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerItemClickListener) {
this.onRecyclerItemClickListener = onRecyclerItemClickListener;
} public interface OnRecyclerItemClickListener{
void onRecyclerItemClick(int position);
}
}

单位和尺寸

package com.example.mylayoutparams;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); LinearLayout linearLayout = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
linearLayout.setLayoutParams(layoutParams); TextView textView = new TextView(this);
textView.setText("文本框");
textView.setBackgroundColor(0xffff0000);
// 单位默认是像素px
ViewGroup.LayoutParams textLayoutParams = new LinearLayout.LayoutParams(300,300);
// textView.setLayoutParams(textLayoutParams);
// linearLayout.addView(textView);
linearLayout.addView(textView, textLayoutParams); setContentView(linearLayout);
}
}

ViewPager

  1. 定义一个viewpager
  2. 为viewpager构建Adapter
  • layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="#00ff00"
xmlns:android="http://schemas.android.com/apk/res/android"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="layout1"
android:textSize="30sp"/> </LinearLayout>
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <androidx.viewpager.widget.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
  • MainActivity.java
package com.example.myviewpager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); LayoutInflater lf = getLayoutInflater().from(this);
View view1 = lf.inflate(R.layout.layout1, null);
View view2 = lf.inflate(R.layout.layout2, null);
View view3 = lf.inflate(R.layout.layout3, null); List<View> viewList = new ArrayList<>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3); ViewPager viewPager = findViewById(R.id.vp);
MyAdapter myAdapter = new MyAdapter(viewList);
viewPager.setAdapter(myAdapter);
}
}
  • MyAdapter.java
package com.example.myviewpager;

import android.view.View;
import android.view.ViewGroup; import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter; import java.util.List; public class MyAdapter extends PagerAdapter { List<View> mListView; public MyAdapter(List<View> mListView) {
this.mListView = mListView;
} @Override
public int getCount() {
return mListView.size();
} // 将给定位置的view添加到viewgroup容器中,创建并显示出来
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(mListView.get(position), 0);
return mListView.get(position);
} @Override
public boolean isViewFromObject(View view,Object object) {
return view == object;
} @Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(mListView.get(position));
}
}

ViewPager2

  • 添加依赖:implementation 'androidx.viewpager2:viewpager2:1.0.0'
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"> <androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp"
android:background="#ffff00"
android:layout_width="match_parent"
android:layout_height="match_parent"/> </LinearLayout>
  • item_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:id="@+id/tvTitle"
android:text="haha"
android:textColor="#ff0000"/> </RelativeLayout>
  • MainActivity.java
package com.example.myviewpager2;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ViewPager2 viewPager = findViewById(R.id.vp);
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter();
viewPager.setAdapter(viewPagerAdapter);
}
}
  • ViewPagerAdapter.java
package com.example.myviewpager2;

import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList;
import java.util.List; public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder> { private List<String> titles = new ArrayList<>();
private List<Integer> colors = new ArrayList<>(); public ViewPagerAdapter(){
titles.add("haha");
titles.add("xixi");
titles.add("hehe");
titles.add("enen"); colors.add(R.color.white);
colors.add(R.color.purple_200);
colors.add(R.color.purple_500);
colors.add(R.color.purple_700);
} // 子布局必须是march_parent,否则这个函数不会执行
@NonNull
@Override
public ViewPagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pager, parent, false)
return new ViewPagerViewHolder(view);
} @Override
public void onBindViewHolder(@NonNull ViewPagerViewHolder holder, int position) {
holder.mTv.setText(titles.get(position));
// 填进去的是资源id
holder.mContainer.setBackgroundResource(colors.get(position));
} @Override
public int getItemCount() {
return 4;
} class ViewPagerViewHolder extends RecyclerView.ViewHolder{ private TextView mTv;
private RelativeLayout mContainer; public ViewPagerViewHolder(@NonNull View itemView) {
super(itemView);
mContainer = itemView.findViewById(R.id.container);
mTv = itemView.findViewById(R.id.tvTitle);
}
}
}

Menu

  • 在res中添加menu文件夹,新建menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
  • 在Activity中重写onCreateOptionsMenu(),快捷键ctrl+o
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
// 返回true表示允许创建的菜单显示出来
return true;
}
  • 重写onOptionsItemSelected()实现菜单按钮点击
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this, "add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "remove", Toast.LENGTH_SHORT).show();
// 等同于按下Back键
finish();
break;
default:
}
return true;
}

基础控件(ListView,RecyclerView,单位和尺寸,ViewPager,ViewPager2)的更多相关文章

  1. Android基础控件ListView基础操作

    1.简介 基于Android基础控件ListView和自定义BaseAdapter适配器情况下,对ListView的数据删除和添加操作: public boolean add(E e) {//添加数据 ...

  2. Android基础控件ListView和自定义BaseAdapter适配器

    1.简介 ListView用于列表显示,相当于OC中的TableView,和适配器一块使用,相关属性: footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条, ...

  3. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  4. Delphi一共封装(超类化)了8种Windows基础控件和17种复杂控件

    超类化源码: procedure TWinControl.CreateSubClass(var Params: TCreateParams; ControlClassName: PChar); con ...

  5. React Native环境搭建以及几个基础控件的使用

    之前写了几篇博客,但是没有从最基础的开始写,现在想了想感觉不太合适,所以现在把基础的一些东西给补上,也算是我从零开始学习RN的经验吧! 一.环境搭建 首先声明一下,本人现在用的编辑器是SublimeT ...

  6. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  7. Cocos2d-JS项目之二:studio基础控件的使用

    在studio里把几个基础控件往场景文件一拖,然后导出json格式的资源文件 逻辑代码如下: var HelloWorldLayer = cc.Layer.extend({ sprite:null, ...

  8. [iOS基础控件 - 6.9.1] 聊天界面Demo 代码

    框架:   所有代码文件:   Model: // // Message.h // QQChatDemo // // Created by hellovoidworld on 14/12/8. // ...

  9. Cocos2d-JS studio基础控件的使用

    在studio里把几个基础控件往场景文件一拖,然后导出json格式的资源文件 逻辑代码如下: 1 var HelloWorldLayer = cc.Layer.extend({ 2 sprite:nu ...

  10. Python Tkinter基础控件入门实例

    分享一个Python Tkinter基础控件用法的入门例子,包括窗口的显示.显示内置图片.弹出窗口.菜单等. 例子,Python Tkinter基础控件的用法 # -*- coding: utf-8 ...

随机推荐

  1. 使用pybind11为Python编写一个简单的C语言扩展模块

    相关: 为Python编写一个简单的C语言扩展模块 在Pybind11 出现之前为Python编写扩展模块的方法有多种,但是并没有哪种方法被认为一定比其他的好,因此也就变得在为Python编写扩展模块 ...

  2. 常用的php方法

    /* * http 封装网络请求方法 */ /* * get method */ function get($url, $param=array()){ if(!is_array($param)){ ...

  3. 如何让您的 .NET应用程序更智能-- 请参加 8.20 的 .NET Conf -- Focus on AI

    Microsoft 将于 2024 年 8 月 20 日举办免费的 .NET Conf: Focus on AI.该虚拟活动为开发人员提供了如何集成 .NET 和 AI 以增强应用程序开发和用户体验的 ...

  4. 2.3 Exception model

    2.3.1 异常状态 2.3.1 异常类型

  5. java_Web

    开始进入学习java web部分 一.Socket技术 字节流传输 使用bytes[] 封装字节进行传输数据 文件传输 浏览器访问 使用http协议进行访问 二.MySQL数据库 环境 Phpstyd ...

  6. 编译 Qt 项目

    参考:Qt 编程指南 一个最小化工作示例:qt-minimal | GitHub 源文件 main.cpp #include <QApplication> #include <QLa ...

  7. Python新手爬虫四:爬取视频

    老样子,先上最后成功源码(在D盘下创建'好看视频'文件夹,直接运行即可获取视频): import sys import re,os import requests from you_get impor ...

  8. 用描述程序的方式emo,扎心了...

    用描述程序的方式emo,扎心了... 众所周知写程序是个枯燥无聊的过程,再加上生活的不顺与坎坷,当程序语言与emo结合起来,看谁还说程序员不懂感情! 首当其冲的就是循环语句了 世界上最寂寞的感觉,是我 ...

  9. 随机读取数组中n个元素

    需求 随机不重复的显示一系列图片 分析 可使用Math.random(),其作用是返回介于 0(包含) ~ 1(不包含) 之间的一个随机数.先获取到图片路径,将图片路径放入数组中,再随机从数组中读取n ...

  10. 欢迎加入d3shop,一个DDD实战项目

    背景 整个<老肖的领域驱动设计之路>系列关于认知的核心部分已经基本闭环,但纸上得来终觉浅,还是需要通过实际操作来体会和验证我们的观点,接下来,我将通过一个实战项目来带着大家一起体验从需求到 ...