本节主要讲述的内容为以下几点:
常用属性
Adapter 接口
Demo 演示
以下为内容及相关的详细代码部分:
新建包:java - com.skypan - New - Package
在包中新建 : listView - New - JavaClass
其中 Name:ListViewActivity Activity名字
Superclass: android.app.Activity 父类
ListView.java 文件
//重写方法
@Override
projected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
}
在 layout中 new 一个 listview 的布局文件activity_listview.xml
其中 File name : activity_listview 布局名称
Root element: LinearLayout 布局父类
<ListView
android:id="@+id/lv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
注:自己写的类需要在 AndroidMainFest.xml文件中声明:
<activity android:name="com.skypan.helloworld.listview.ListViewActivity"></activity>
其中 com.skypan.helloworld.listview.ListViewActivity 为完整路径,等同于.listview.ListViewActivity
list文件夹 - New - Java Class new一个接口类
Name :MyListAdapter
Superclass : android.widget.BaseAdapter
MyListAdapter.java文件
public class MyListAdapter extends BaseAdapter {
//声明变量
private Context mContext;
private LayoutInflater mLayoutInflater;
//添加一个构造方法
public MyListAdapter(Content context){
this.mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount(){
return 0;
}
@Override
public Object getItem(int position){
return null;
}
@Override
public long getItemId(int position){
return 0;
}
static class ViewHolder{
public ImageView imageViewl
public TextView tvTitlt, tvTime, tvContent;
}
//*该方法很重要
// 用于设置列表每一行长什么样子
@Override
public view getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
contentView - mLayoutInflater.inflate(R.layout.Layout_List_item, null);
holder= new ViewHolder();
//找到控件
holder.imageView = (ImageView) convertView.findViewById(R.id.iv);
holder.tvTitle = (TextView) findViewById(R.id.tv_title);
holder.tvTime = (TextView) findViewById(R.id.tv_time);
holder.tvContent = (TextView) findViewById(R.id.tv_content);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
//给控件赋值
holder.tvTitle.setText("这是标题");
holder.tvTime.setText("2088-08-08");
holder.tvContent.setText("这是内容");
Glide.with(mContext).load("https://www.baidu.com/img/baidu_jgylogo3.gif").load(holder.imageView);
}
return convertView;
}
}
画一个布局(每一行长什么样子)
layout文件夹 - New - Layout resource File 创建一个新的布局文件
File name:Layout_list_item
Root element:LinearLayout
Layout_list_item.xml
<LinearLayout xmlns:android="http://..."
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="10dp"
android:paddingBottom="10dp">
<ImageView
android:id="@+id/iv_1"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="fitCenter"
android:background="#000"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"
android:textSize="20dp"
android:textColor="@color/colorBlack"/> //引用color文件中设置的color
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2019-12-14"
android:textSize="18dp"
android:layout_marginTop="10dp"
android:textColor="@color/colorGrayDark"/>
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="@color/colorGrayDark"
android:textSize="18dp"
android:text="这是内容..."/>
</LinearLayout>
</LinearLayout>
values-color.xml文件设置颜色
<resources>
<color name="colorPrimary">#3f51b5</color>
<color name="colorPrimaryDark">#303f9f</color>
<color name="colorAccent">#ff4081</color>
<color name="colorBlack">#000000</color>
<color name="colorGray">#d5d5d5</color>
<color name="colorGrayDark">#a9a9a9</color>
<color name="colorWhite">#ffffff</color>
<color name="colorTransparent">#00000000</color> //透明的颜色
</resources>
ListViewActivity.java 文件完整代码如下:
public class ListViewActivity extend Activity {
//声明控件
private ListView mLv1;
//重写方法
@Override
projected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
//找到控件
mLv1 = (ListView) findViewById(R.id.lv_1);
mLv1.setAdapter(new MyListAdapter(ListViewActivity.this));
//设置点击事件
mLv1.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
Toast.makeText(ListViewActivity.this, "点击 pos:"+position, Toast.LENGTH_SHORT).show(); //position 当前点击的是第几条(索引从0开始)
//跳转
}
});
//设置长按事件
mLv1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id){
Toast.makeText(ListViewActivity.this, "长按 pos:"+position, Toast.LENGTH_SHORT).show(); //position 当前点击的是第几条(索引从0开始)
return false; //此时表示运行到此处还未处理完,接下来继续执行相关代码。显示效果为:长按先实现长按toast,松开显示点击toast
return true; //此时表示运行到此已处理完成,不进行后续代码的运行。显示效果为:只显示长按toast,不会在松开后继续显示点击toast
}
});
}
}
activity_listview.xml布局文件完整代码:
<LinearLayout xmlns:android="http:schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="" //行间分割线的设置
android:dividerHeight="" //行间分割线的高度
android:listSelector="@drawable/list_item"/>
</LinearLayout>
res - New - Drawable resource File 新建一个 selector 选择器,设置选中效果
File name:list_item
Root element: selector
list_item.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:drawable="@color/colorAccent"/>
<item android:state_pressed="true"
android:drawable="@color/colorAccent"/>
<item android:state_focused="true"
android:drawable="@color/colorAccent"/>
<item android:drawable="@color/colorTransparent"/>
</selector>
注:
state_selected:选中
state_pressed:按压
state_focused:获取焦点
不写state_selected、state_pressed、state_focused等属性时默认为未选中、未按压、未获取焦点,效果等同于设置state_selected=“true”
注:起初编写完全部代码运行了几次都会出现闪退的问题,听说可能是ImageView的id没对应上,修改后依然闪退,看错误信息也没看出什么门道,最后在万能的百度找到了答案,原来是我太大意了, MyListAdapter.java 文件中的 getView( ) 方法返回值未修改,使用了默认的 return null; 返回值为空,所以会出现闪退现象,将其修改为 return convertView; 后程序方可正常运行!!