Android ListView
瀑布流的实现
-
创建ListView
-
<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>
-
-
给每一个Item(项目)创建布局
-
给Item 加一个文本框
-
<TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30dp"/>
-
-
给Item设置数据
-
创建一个Java bean类
-
public class Bean { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
-
在 activity_main 通过for循环产生数据
-
private List<Bean> data = new ArrayList<>(); for(int i=0;i<100;i++){ Bean bean = new Bean(); bean.setName("消息" + i); data.add(bean); }
-
-
拿到ListView 对象 ,准备操作ListView
-
ListView listView = findViewById(R.id.Lv);
-
-
数据怎么填充到ListView? 有一个辅助类BaseAdaptor'
-
四个方法
- 获取总共的数目
- 获取Item
- 获取ItemId
- 返回的View
-
public class MyAdapter extends BaseAdapter { @Override public int getCount() { return 0; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } }
-
首先把数据放进 Adaptor
-
创建Adaptor的构造方法(存放数据,context放进去) 关于Context的知识点这里
-
public MyAdapter(List<Bean> data, Context context) { this.data = data; this.context = context; }
-
-
添加data,this
-
listView.setAdapter(new MyAdapter(data,this));
-
-
继续完善 adaptor
-
@Override public int getCount() { return data.size(); } @Override public long getItemId(int position) { return position; }
-
getView 返回每一个Item 给它设值,并显示在界面上(重要方法)每显示一个 Item 就会调用以便 getView
-
public View getView (int position, View convertView, ViewGroup parent)
-
拿到Item的布局 给 convertView
-
convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
-
滑动的时候 convertView 会复用,防止convertView不断创建,设置一个判断,为空才创建
-
if(convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); }
-
在 convertView 中拿到 textView
-
TextView textView = convertView.findViewById(R.id.tv);
-
把值传递到每一个Item的textView上面
-
textView.setText(data.get(poistion).getName())
-
然后 设置好的 converView
-
return convertView;
-
-
-
-
-
实现ListView点击
-
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.e("leo","onItemClick"+position); } });
-
-
优化
-
每次在调用 getView的时候,都会去findViewbyId 找 textView,比较耗时
-
extView textView = convertView.findViewById(R.id.tv);
-
创建 ViewHolder这个类 , listView 有几个子控件,就在这里面填充几个子控件
-
private final class ViewHolder{ TextView textView; }
-
-
在getView 里面创建 ViewHolder对象
-
if(convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); viewHolder.textView = convertView.findViewById(R.id.tv); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.textView.setText(data.get(position).getName())
-
-
-
-
-
Android RecycleView
在build. gradle下添加Recycle 的依赖包
implementtation 'androidx.recycleview:recycleview:1.1.0'
创建Adapter 继承 Recyclerview.adaoter
Public class Myadapter extends RecyclerView<MyAdapter.MyViewHolder>{}
Recyle 必须使用 优化的ViewHolder控制子控件
Recyleview 提供了 网格布局 和 瀑布流布局 ,网格对齐,瀑布流根据item大小自适应