源码地址:https://github.com/ldy1993/ToolforAS.git
一、初步创建listView
我们首先在xml中创建一个listview控件,然后赋予id。
<?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"
android:background="#ffffff">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
然后在activity中找到这个控件,然后使用setAdapter注入数据。
这里提示我们要填一个ListAdapter对象,我们选择后发现他是adapter的一个接口类,要实现太多方法了,按control+H,可以看到安卓给我们实现了几个子类。如下:
常用的是arrayAdapter,simpleAdapter,或者继承了baseAdapter的自定义adapter。
我们简单以arrayAdapter为例,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_day7);
ListView listView=findViewById(R.id.listView);
//可以直接ArrayAdapter也可以ArrayAdapter<T>,安卓后面的版本加了范型,可以检测数据类型
//ArrayAdapter录入参数如右(@NonNull Context context, @LayoutRes int resource,@IdRes int textViewResourceId, @NonNull List<T> objects)
//resource:填资源文件id,为layout布局文件。里面放置条目的布局和控件
//textViewResourceId,填写条目控件,对于arrayAdapter只能是textView。其他的adapter可以使用其他控件。
//objects数据源
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,
R.layout.activity_day7_listview_item,R.id.textView, new String[]{"这是第一条", "这是第二条"});
listView.setAdapter(arrayAdapter);
}
R.layout.activity_day7_listview_item和R.id.textView如下
<?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"
android:background="#ffffff">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="100sp"
android:layout_gravity="center"
android:gravity="center"
android:textSize="50sp"></TextView>
</LinearLayout>
效果如下:
listView的点击事件和长按事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(Day7_Activity.this, "点击第"+position+"条", Toast.LENGTH_SHORT).show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(Day7_Activity.this, "长按第"+position+"条", Toast.LENGTH_SHORT).show();
//true处理该事件,false,不处理,传递给上一级
return true;
}
});
二、自定义listView--使用baseAdapter
从上文,我们可以轻易的对listview进行长按或者点击。但是如果我们想要左滑呢。我们确实可以通过onTouch去判断坐标系移动确定是否左滑了。但是一般左滑都是伴随ui的变化,比如滑出一个删除按钮。对此如果使用仅仅只能用textview的arrayAdapter就不能满足要求了。我们需要自定义一个Adapter,然后往上面放可以左滑的自定义控件。然后在注入数据。
首先我们要先创建一个自定义控件,这个控件可以完成左滑功能。这个源码是在github上面clone下来的。因为我们里面要考虑逻辑和界面的调整比较繁琐,我没有浪费时间在上面,看的懂可以调整既可。现在基本要实现的自定义控件git上都有,下下来改一下即可。
然后准备好数据,自定义View加view里面需要的数据
里面需要填一个图片和标题,创建一个数据类存放。
然后创建一个 leftSlideAdapter继承baseAdapter。然后实现他的方法
代码和注释如下
/**
* ================================================
* 作 者:刘东阳
* 版 本:
* 创建日期:2019/10/3
* 描 述:
* 修订历史:
* ================================================
*/
public class leftSlideAdapter extends BaseAdapter {
private ArrayList<leftSlideData> leftSlideDataList;
private Context context;
public leftSlideAdapter(Context context, ArrayList<leftSlideData> leftSlideDataList) {
this.leftSlideDataList=leftSlideDataList;
this.context=context;
}
//条目数量
@Override
public int getCount() {
return leftSlideDataList.size();
}
//根据索引值返回该条目内容,可以不写
@Override
public Object getItem(int position) {
return leftSlideDataList.get(position);
}
//获取条目id,可以不写
@Override
public long getItemId(int position) {
return position;
}
//获取当前条目的布局效果。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=View.inflate(context, R.layout.activity_day7_baseadapter_item,null);
TextView textView=view.findViewById(R.id.tv_name);
textView.setText(leftSlideDataList.get(position).title);
ImageView iv_icon=view.findViewById(R.id.iv_icon);
iv_icon.setImageDrawable( leftSlideDataList.get(position).drawable);
return view;
}
}
通过mainactivity把上下文和数据类传进来,然后在getView中设置。
效果如下
三、listView的优化
优化一:复用convertView
convertView其实是消失在屏幕中的 View view=View.inflate(context, R.layout.activity_day7_baseadapter_item,null);返回的view;因此不可空时可以复用。
优化二:复用控件
findViewById去找控件。第一屏的时候,我们可以把控件放到容器中,然后绑定上面的convertView,然后下滑的时候不断的复用convertView,同时复用convertView绑定的容器,所以就无需在去findViewById去找控件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder ;
if(convertView==null) {
convertView = View.inflate(context, R.layout.activity_day7_baseadapter_item, null);
viewHolder =new ViewHolder();
//将控件放到容器中
viewHolder.textView = convertView.findViewById(R.id.tv_name);
viewHolder.iv_icon = convertView.findViewById(R.id.iv_icon);
//绑定到convertView中
convertView.setTag("viewHolder");
}
else
{
//获取convertView中的容器
viewHolder= (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(leftSlideDataList.get(position).title);
viewHolder.iv_icon.setImageDrawable(leftSlideDataList.get(position).drawable);
return convertView;
}
class ViewHolder
{
TextView textView;
ImageView iv_icon;
}
下一节