ListView
| <?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> |
| <?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> |
| package com.example.mylistview; |
| |
| public class Bean { |
| String name; |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| } |
| 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); |
| } |
| }); |
| |
| } |
| } |
| 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; |
| } |
| |
| |
| @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; |
| } |
| |
| |
| @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.list_item, viewGroup, false); |
| viewHolder.textView = view.findViewById(R.id.tv); |
| view.setTag(viewHolder); |
| }else{ |
| |
| 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> |
| <?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> |
| package com.example.myrecyclerview; |
| |
| public class Bean { |
| String name; |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| } |
| 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); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| 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(); |
| } |
| }); |
| |
| } |
| } |
| 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); |
| |
| |
| 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); |
| |
| ViewGroup.LayoutParams textLayoutParams = new LinearLayout.LayoutParams(300,300); |
| |
| |
| linearLayout.addView(textView, textLayoutParams); |
| |
| setContentView(linearLayout); |
| } |
| } |
- 定义一个viewpager
- 为viewpager构建Adapter
| <?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> |
| <?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> |
| 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); |
| } |
| } |
| 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(); |
| } |
| |
| |
| @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)); |
| } |
| } |
- 添加依赖: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> |
| <?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> |
| 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); |
| } |
| } |
| 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); |
| } |
| |
| |
| @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)); |
| |
| 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); |
| } |
| } |
| } |
- 在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); |
| |
| 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(); |
| |
| finish(); |
| break; |
| default: |
| } |
| return true; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步