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. Java栈溢出|内存泄漏|内存溢出

    Java虚拟机栈是线程私有的,它的生命周期和线程同步 一个线程每执行到一个方法,JVM就会创建一个栈帧(用于存储基本数据类型.对象指针和返回值等),并将栈帧压入栈中. 代码示例: public cla ...

  2. UE4打包后的游戏,无法打卡其他关卡的解决办法

    现象: 程序调试的时候可以通过主菜单打开其他关卡界面,但是打包之后就无法通过按钮打开,一直显示错误 Warning: Travel Failure: [ClientTravelFailure]: Fa ...

  3. Linux中登录mysql

    输入 mysql -u root -p 然后输入密码,就能登录 root@zrt2:/home/zrt2# mysql -u root -pEnter password: Welcome to the ...

  4. Atcoder ABC364 D-F

    Atcoder ABC364 D-F D - K-th Nearest 链接: D - K-th Nearest (atcoder.jp) 简要题意: 问题陈述 在一条数线上有 \(N+Q\) 个点 ...

  5. 【CMake系列】07-export与find

    为了将我们的库文件更方便地提供给他人使用,cmake 提供了一种方式,通过查找 .cmake 文件,将库导入项目中. 本节学习的内容,就是将我们的库导出一个 xxx.cmake 文件,以及 在项目中导 ...

  6. PyJWT 和 python-jose 在处理JWT令牌处理的时候的差异和具体使用

    PyJWT 和 python-jose 是两个用于处理 JSON Web Tokens (JWT) 的 Python 库.它们都有助于生成.解码.验证和管理 JWT,但它们在功能范围和设计哲学上有一些 ...

  7. 最详细STL(二)deque

    deque其实也是数组,也可以动态的添加和减少元素,但是和vector不同的是,deque可以快速的在头部和尾部添加减少元素(vector只能快速的在尾部添加),然而在插入元素的时候因为头部和尾部都可 ...

  8. 修改 Ubuntu 文件夹为英文

    如果你在安装 Ubuntu 时,语言选了中文,那么系统自动创建的文件夹也会是中文(下载.图片 等).有时这会造成不便.可以通过以下命令将文件夹改为英文: LANG=C LC_ALL=C xdg-use ...

  9. 开源项目管理工具 Plane 安装和使用教程

    说到项目管理工具,很多人脑海中第一个蹦出来的可能就是 Jira 了.没错,Jira 确实很强大,但是...它也有点太强大了,既复杂又昂贵,而且目前也不再提供私有化部署版本了. 再说说飞书,作为国产之光 ...

  10. Chrome 浏览器插件获取网页 window 对象(方案三)

    前言 最近有个需求,是在浏览器插件中获取 window 对象下的某个数据,当时觉得很简单,和 document 一样,直接通过嵌入 content_scripts 直接获取,然后使用 sendMess ...