从零开始水安卓——高级UI组件2(ListView上)
目录
ListView
概述
列表视图,是Android中最为常见的一种视图组件,以垂直列表的形式列出需要显示的列表项。
基本属性
android:dividerHeight="30dp" listview item之间的间距
android:cacheColorHint="#000000000" 设置拖动背景色为透明
android:divider="" itm之间的背景色
android:fadingEdge="vertical" 上边和下边有黑色的阴影 none则没有
android:scrollbars="horizontal" 只有设置为horizontal才会显示滚动条
android:fastScrollEnabled="true" 快速滚动效果,为true时,将有一个小方块快速滚动的效果
android:entries="" 直接填充内容
android:listSelector="" 选中时的颜色
在values文件夹下新建资源文件arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="test">
<item>测试1</item>
<item>测试2</item>
<item>测试3</item>
<item>测试4</item>
<item>测试5</item>
<item>测试6</item>
</array>
</resources>
然后就可以通过entries属性进行简单的测试了
activity_main.xml部分代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"
android:dividerHeight="30dp"
android:divider="#FF9800"
android:fadingEdge="vertical"
android:fastScrollEnabled="true"
android:listSelector="#03A9F4"
android:entries="@array/test"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
效果图:
事件处理
和之前的处理类似,
1、private ListView
2、listView = findViewById(R.id.listview);
3、listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
4、对public void onItemClick(AdapterView<?> parent, View view, int position, long id)进行事件内容编写
package com.example.listview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) view;
Toast.makeText(MainActivity.this,tv.getText(),Toast.LENGTH_LONG).show();
}
});
}
}
ListActivity
概述
直接提供了一个ListActivity类,它可以绑定指定数据源,给用户提供选项选择。
默认布局是一个单一的再屏幕中心的全屏幕的列表,可以用setcontentview()在oncreate()设置自己的自定义屏幕布局视图。
还是新建activity并设置为默认activity....
修改继承关系...如下图????
完整代码:(必要的说明补在注释了)
package com.example.listview;
import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
public class Main2Activity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//三个参数,上下文,资源,布局文件
ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(this,R.array.test, android.R.layout.simple_list_item_1);
setListAdapter(arrayAdapter);
//布局也不需要设置
//setContentView(R.layout.activity_main2);
}
}
效果如下:(由于没有布局,所以界面是比较普通的)
点击事件
主要是 重写onListItemClick 只需要简单的加上一段重写onListItemClick的代码就好,如下:
package com.example.myapplication;
import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myapplication.R;
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//三个参数,上下文,资源,布局文件
ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(this, R.array.test, android.R.layout.simple_list_item_1);
setListAdapter(arrayAdapter);
//布局也不需要设置
//setContentView(R.layout.activity_main2);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Toast.makeText(this,((TextView)v).getText(),Toast.LENGTH_LONG).show();
}
}
单选和多选模式
activity_main.xml
(自备一个arrays.xml在values文件夹)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:id="@+id/listview"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
MainActivity
ArrayAdapter<String> a1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,arr);
有三个参数,分别是:
上下文,布局,资源数组
为了得到资源数组,定义一个arr数组,然后通过getResources来获取
String[] arr = getResources().getStringArray(R.array.test);
最后还需要设置成单选模式 即如下语句
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
完整代码如下:
package com.example.test317;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
String[] arr = getResources().getStringArray(R.array.test);
//单选
ArrayAdapter<String> a1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,arr);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setAdapter(a1);
}
}
效果
:
多选模式
多选模式基本一致 只需要进行少量修改即可 非常容易理解,就是像选择模式的地方从single->multiple
代码即效果图如下:
package com.example.test317;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
String[] arr = getResources().getStringArray(R.array.test);
//单选
/* ArrayAdapter<String> a1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,arr);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setAdapter(a1);
*/
//多选
ArrayAdapter<String> a1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setAdapter(a1);
}
}
实现图文列表
使用SimpleAdapter建立复杂的列表项
SimpleAdapter(参数1,参数2,参数3,参数4,参数5)
参数1:context 上下文
参数2:data 一个Map组成的list。在列表中的每个条目对应列表中的一行,每一个map应该包含所有在from参数参数中指定的键。
参数3:resource 一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID
参数4:from 一个将被添加到map映射上的键名
参数5:to 将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView
布局
activity_main.xml需要建立一个ListView细节不表,默认id为listview
单独定义一个布局文件listitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
tools:srcCompat="@tools:sample/avatars[0]" />
<TextView
android:id="@+id/textView"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="138dp"
android:layout_weight="1"
android:text="TextView" />
</LinearLayout>
MainActivity
package com.example.simpleadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
//准备一组数据 每一个HashMap是一条记录
HashMap<String,String> title1 = new HashMap<>();
title1.put("title","title-1");
HashMap<String,String> title2 = new HashMap<>();
title2.put("title","title-2");
HashMap<String,String> title3 = new HashMap<>();
title3.put("title","title-3");
//放入....List
ArrayList<Map<String,String>> List = new ArrayList<>();
List.add(title1);
List.add(title2);
List.add(title3);
//把数据填充到Adapter
SimpleAdapter sa = new SimpleAdapter(this,List,R.layout.listitem,new String[]{"title"},new int[]{R.id.textView});
listView.setAdapter(sa);
}
}
然后是效果 图片尺寸不太好,所以显示有点奇怪 (无视)
补充
在上面图文列表的基础上,进行一定的修改,刚才没有设置图片,默认把所有列表项的图片都用初始的了,现在也设置一下。
package com.example.simpleadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
//准备一组数据 每一个HashMap是一条记录
HashMap<String,Object> title1 = new HashMap<>();
title1.put("title","title-1");
title1.put("icon",R.drawable.if_pineapple_2003197);
HashMap<String,Object> title2 = new HashMap<>();
title2.put("title","title-2");
title2.put("icon",R.drawable.if_pear_2003196);
HashMap<String,Object> title3 = new HashMap<>();
title3.put("title","title-3");
title3.put("icon",R.drawable.if_grapes_2003194);
//放入....List
ArrayList<Map<String,Object>> List = new ArrayList<>();
List.add(title1);
List.add(title2);
List.add(title3);
//把数据填充到Adapter
SimpleAdapter sa = new SimpleAdapter(this,List,R.layout.listitem,new String[]{"title","icon"},new int[]{R.id.textView,R.id.imageView});
listView.setAdapter(sa);
}
}
效果如图: