期中作业
题目:
基于Notepad的优化
1.添加时间戳
核心代码:
添加一个显示时间的TextView
<TextView
android:id="@+id/text1_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:paddingLeft="5dip"
android:textColor="@color/colorBlack"/>
在NotePadProvider.java中添加显示时间的字段,在NoteList.java的PROJECTION中定义显示的时间,在dataColumns,viewIDs中补充时间部分:
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
//扩展 显示时间
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE,
};
String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE , NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE } ;
int[] viewIDs = { android.R.id.text1 , R.id.text1_time };
把时间戳改为以时间格式存入,改动地方分别为NotePadProvider中的insert方法和NoteEditor中的updateNote方法:
Long now = Long.valueOf(System.currentTimeMillis());
Date date = new Date(now);
SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
String dateTime = format.format(date);
2.添加搜索功能
核心代码:
在list_options_menu.xml中添加一个搜索的item
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"
android:icon="@android:drawable/ic_search_category_default"
android:showAsAction="always">
</item>
在NoteList中找到onOptionsItemSelected方法,在switch中添加搜索的case语句:
//添加搜素
case R.id.menu_search:
Intent intent = new Intent();
intent.setClass(NotesList.this,NoteSearch.class);
NotesList.this.startActivity(intent);
return true;
在layout中新建布局文件note_search_list.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:iconifiedByDefault="false"
android:queryHint="输入搜索内容..."
android:layout_alignParentTop="true">
</SearchView>
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
创建NoteSearch.java,继承ListView,实现SearchView.OnQueryTextListener接口:
public class NoteSearch extends ListActivity implements SearchView.OnQueryTextListener {
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
//扩展 显示时间
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_search_list);
Intent intent = getIntent();
if (intent.getData() == null) {
intent.setData(NotePad.Notes.CONTENT_URI);
}
SearchView searchview = (SearchView)findViewById(R.id.search_view);
//为查询文本框注册监听器
searchview.setOnQueryTextListener(NoteSearch.this);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
String selection = NotePad.Notes.COLUMN_NAME_TITLE + " Like ? ";
String[] selectionArgs = { "%"+newText+"%" };
Cursor cursor = managedQuery(
getIntent().getData(),
PROJECTION,
selection,
selectionArgs,
NotePad.Notes.DEFAULT_SORT_ORDER
);
String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE , NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE };
int[] viewIDs = { android.R.id.text1 , R.id.text1_time };
MyCursorAdapter adapter = new MyCursorAdapter(
this,
R.layout.noteslist_item,
cursor,
dataColumns,
viewIDs
);
setListAdapter(adapter);
return true;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
String action = getIntent().getAction();
if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) {
setResult(RESULT_OK, new Intent().setData(uri));
} else {
startActivity(new Intent(Intent.ACTION_EDIT, uri));
}
}
}
AndroidManifest.xml注册NoteSearch:
<activity
android:name="NoteSearch"
android:label="@string/title_notes_search">
</activity>
运行截图:
3.修改背景颜色
核心代码:
添加背景颜色字段,和时间戳类似不再重复描述,在系统中预定于好五种颜色,根据颜色对应不int值选择要显示的颜色,契约类中的定义:
public static final int DEFAULT_COLOR = 0; //白
public static final int YELLOW_COLOR = 1; //黄
public static final int BLUE_COLOR = 2; //蓝
public static final int GREEN_COLOR = 3; //绿
public static final int RED_COLOR = 4; //红
NotePadProvider中的insert:
// 新建笔记,背景默认为白色
if (values.containsKey(NotePad.Notes.COLUMN_NAME_BACK_COLOR) == false) {
values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.DEFAULT_COLOR);
}
自定义一个CursorAdapter继承SimpleCursorAdapter,既能完成cursor读取的数据库内容填充到item,又能将颜色填充,并将NoteList中用的SimpleCursorAdapter改使用MyCursorAdapter:
public class MyCursorAdapter extends SimpleCursorAdapter {
public MyCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
}
@Override
public void bindView(View view, Context context, Cursor cursor){
super.bindView(view, context, cursor);
//从数据库中读取的cursor中获取笔记列表对应的颜色数据,并设置笔记颜色
int x = cursor.getInt(cursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR));
switch (x){
case NotePad.Notes.DEFAULT_COLOR:
view.setBackgroundColor(Color.rgb(255, 255, 255));
break;
case NotePad.Notes.YELLOW_COLOR:
view.setBackgroundColor(Color.rgb(247, 216, 133));
break;
case NotePad.Notes.BLUE_COLOR:
view.setBackgroundColor(Color.rgb(165, 202, 237));
break;
case NotePad.Notes.GREEN_COLOR:
view.setBackgroundColor(Color.rgb(161, 214, 174));
break;
case NotePad.Notes.RED_COLOR:
view.setBackgroundColor(Color.rgb(244, 149, 133));
break;
default:
view.setBackgroundColor(Color.rgb(255, 255, 255));
break;
}
}
}
editor_options_menu.xml添加修改背景颜色选项,并且在NoteEditor中的onOptionsItemSelected()方法的switch中添加选项:
case R.id.menu_color:
changeColor();
break;
//跳转改变颜色的activity,将uri信息传到新的activity
private final void changeColor() {
Intent intent = new Intent(null,mUri);
intent.setClass(NoteEditor.this,NoteColor.class);
NoteEditor.this.startActivity(intent);
}
创建note_color.xml,NoteColor的Acitvity,用来选择颜色。在AndroidManifest.xml中将这个Acitvity主题定义为对话框样式:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
android:id="@+id/color_white"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@color/colorWhite"
android:onClick="white"/>
<ImageButton
android:id="@+id/color_yellow"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@color/colorYellow"
android:onClick="yellow"/>
<ImageButton
android:id="@+id/color_blue"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@color/colorBlue"
android:onClick="blue"/>
<ImageButton
android:id="@+id/color_green"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@color/colorGreen"
android:onClick="green"/>
<ImageButton
android:id="@+id/color_red"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@color/colorRed"
android:onClick="red"/>
</LinearLayout>
public class NoteColor extends Activity {
private Cursor mCursor;
private Uri mUri;
private int color;
private static final int COLUMN_INDEX_TITLE = 1;
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_BACK_COLOR,
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_color);
//从NoteEditor传入的uri
mUri = getIntent().getData();
mCursor = managedQuery(
mUri, // The URI for the note that is to be retrieved.
PROJECTION, // The columns to retrieve
null, // No selection criteria are used, so no where columns are needed.
null, // No where columns are used, so no where values are needed.
null // No sort order is needed.
);
}
@Override
protected void onResume(){
//执行顺序在onCreate之后
if (mCursor != null) {
mCursor.moveToFirst();
color = mCursor.getInt(COLUMN_INDEX_TITLE);
}
super.onResume();
}
@Override
protected void onPause() {
//执行顺序在finish()之后,将选择的颜色存入数据库
super.onPause();
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, color);
getContentResolver().update(mUri, values, null, null);
}
public void white(View view){
color = NotePad.Notes.DEFAULT_COLOR;
finish();
}
public void yellow(View view){
color = NotePad.Notes.YELLOW_COLOR;
finish();
}
public void blue(View view){
color = NotePad.Notes.BLUE_COLOR;
finish();
}
public void green(View view){
color = NotePad.Notes.GREEN_COLOR;
finish();
}
public void red(View view){
color = NotePad.Notes.RED_COLOR;
finish();
}
}
<activity android:name="NoteColor"
android:theme="@android:style/Theme.Holo.Light.Dialog"
android:label="ChangeColor"
android:windowSoftInputMode="stateVisible"/>
运行截图:
4.导出文件
核心代码:
在editor_options_menu.xml添加一个导出笔记的选项;
在NoteEditor中找到onOptionsItemSelected()方法并在菜单的switch中添加方法;
新建布局output_text.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="6dip"
android:paddingRight="6dip"
android:paddingBottom="3dip">
<EditText android:id="@+id/output_name"
android:maxLines="1"
android:layout_marginTop="2dp"
android:layout_marginBottom="15dp"
android:layout_width="wrap_content"
android:ems="25"
android:layout_height="wrap_content"
android:autoText="true"
android:capitalize="sentences"
android:scrollHorizontally="true" />
<Button android:id="@+id/output_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/output_ok"
android:onClick="OutputOk" />
</LinearLayout>
创建Output.java:
public class OutputText extends Activity {
//要使用的数据库中笔记的信息
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
NotePad.Notes.COLUMN_NAME_NOTE, // 2
NotePad.Notes.COLUMN_NAME_CREATE_DATE, // 3
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 4
};
//读取出的值放入这些变量
private String TITLE;
private String NOTE;
private String CREATE_DATE;
private String MODIFICATION_DATE;
//读取该笔记信息
private Cursor mCursor;
//导出文件的名字
private EditText mName;
//NoteEditor传入的uri,用于从数据库查出该笔记
private Uri mUri;
//关于返回与保存按钮的一个特殊标记,返回的话不执行导出,点击按钮才导出
private boolean flag = false;
private static final int COLUMN_INDEX_TITLE = 1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.output_text);
mUri = getIntent().getData();
mCursor = managedQuery(
mUri, // The URI for the note that is to be retrieved.
PROJECTION, // The columns to retrieve
null, // No selection criteria are used, so no where columns are needed.
null, // No where columns are used, so no where values are needed.
null // No sort order is needed.
);
mName = (EditText) findViewById(R.id.output_name);
}
@Override
protected void onResume(){
super.onResume();
if (mCursor != null) {
// The Cursor was just retrieved, so its index is set to one record *before* the first
// record retrieved. This moves it to the first record.
mCursor.moveToFirst();
//编辑框默认的文件名为标题,可自行更改
mName.setText(mCursor.getString(COLUMN_INDEX_TITLE));
}
}
@Override
protected void onPause() {
super.onPause();
if (mCursor != null) {
//从mCursor读取对应值
TITLE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_TITLE));
NOTE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_NOTE));
CREATE_DATE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_CREATE_DATE));
MODIFICATION_DATE = mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE));
//flag在点击导出按钮时会设置为true,执行写文件
if (flag == true) {
write();
}
flag = false;
}
}
public void OutputOk(View v){
flag = true;
finish();
}
private void write()
{
try
{
// 如果手机插入了SD卡,而且应用程序具有访问SD的权限
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 获取SD卡的目录
File sdCardDir = Environment.getExternalStorageDirectory();
//创建文件目录
File targetFile = new File(sdCardDir.getCanonicalPath() + "/" + mName.getText() + ".txt");
//写文件
PrintWriter ps = new PrintWriter(new OutputStreamWriter(new FileOutputStream(targetFile), "UTF-8"));
ps.println(TITLE);
ps.println(NOTE);
ps.println("创建时间:" + CREATE_DATE);
ps.println("最后一次修改时间:" + MODIFICATION_DATE);
ps.close();
Toast.makeText(this, "保存成功,保存位置:" + sdCardDir.getCanonicalPath() + "/" + mName.getText() + ".txt", Toast.LENGTH_LONG).show();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
在NoteList中添加权限方法,并在Oncreate方法中调用:
public void getPermission(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {//这里可以写个对话框之类的项向用户解释为什么要申请权限,并在对话框的确认键后续再次申请权限
} else {
//申请权限,字符串数组内是一个或多个要申请的权限,1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, 1);
}
}
}
在AndroidManifest.xml中将这个Acitvity主题定义为对话框样式,并且加入权限:
<activity android:name="OutputText"
android:label="@string/output_name"
android:theme="@android:style/Theme.Holo.Dialog"
android:windowSoftInputMode="stateVisible">
</activity>
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions,WrongManifestParent" />
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="WrongManifestParent" />
运行截图:
5.设置闹钟
核心代码:
在NoteEditor.java中添加控件,在NoteEditor.java中的OptionMenu中添加相应的选项,和选择事件的触发,以及在数据库中添加字段
创建DatePickerDialog和TimePickerDialog来进行时间与日期的选择
private void createDateDialog(){
final Calendar calendar=Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(this, AlertDialog.THEME_HOLO_DARK,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
String date=year+"-"+(month+1)+"-"+dayOfMonth;
if(time!=null){
dateButton.setText(date);
}else{
String text=calendar.get(Calendar.HOUR_OF_DAY)+":"+(calendar.get(Calendar.MINUTE)+5);
time=" "+text;//如果时间未指定,则默认为当前时间的5分钟后提醒
dateButton.setText(year+"-"+(month+1)+"-"+dayOfMonth+" "+text);
}
dateButton.setVisibility(View.VISIBLE);
}
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
dialog.getDatePicker().setMinDate(System.currentTimeMillis()-1000);//选择以当前时间开始,避免无效时间的选择
dialog.setTitle("日期:");
dialog.show();
}
private void createTimeDialog(){
final Calendar calendar=Calendar.getInstance();
TimePickerDialog dialog=new TimePickerDialog(this, AlertDialog.THEME_HOLO_DARK,new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String text=calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH)+1)+"-"+calendar.get(Calendar.DAY_OF_MONTH);
/*
* 判断时间的选择是否为无效时间,在当前的时间之前
* */
if(text.equals(date)||date==null){
if(hourOfDay<=calendar.get(Calendar.HOUR_OF_DAY))
time=" "+calendar.get(Calendar.HOUR_OF_DAY)+":"+minute;
else{
time=" "+hourOfDay+":"+minute;
}
}else{
time=" "+hourOfDay+":"+minute;
}
if(date!=null){
dateButton.setText(date+time);
}else{
date=text;
dateButton.setText(text+time);
}
dateButton.setVisibility(View.VISIBLE);
}
},
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), true);
dialog.setTitle("时间:");
dialog.show();
}
保存笔记之后,将需要提醒的信息封装进PendingIntent,以广播的形式发送出去
private void notifyMessage(){
if(time!=null&&date!=null){
Log.d("222","22222time"+date+time);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm");
long t=System.currentTimeMillis()+1000;
try {
t=simpleDateFormat.parse(date+time).getTime();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
//是Intent跳转到指定的广播处理
Intent intent=new Intent(NoteEditor.this, RemindActionBroadcast.class);
/*
* 把文本的内容和标题存入Intent
* */
intent.putExtra("title",mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_TITLE)));
intent.putExtra("context",mCursor.getString(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_NOTE)));
//将requestCode设为每个文本的ID以实现能够发送不同的信息,不会被覆盖
PendingIntent pendingIntent= PendingIntent.getBroadcast(NoteEditor.this,mCursor.getInt(mCursor.getColumnIndex(NotePad.Notes._ID)),intent,PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND,(int)((t-System.currentTimeMillis())/1000));
//使用AlarmManager实现定时功能
AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
}
}
创建RemindActionBroadcast .java,在广播接受类中进行处理和通知:
public class RemindActionBroadcast extends BroadcastReceiver {
public static int id=0;
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onReceive(Context context, Intent intent) {
PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intent,0);
NotificationManager notificationManager=(NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
Notification.Builder mbuilder=new Notification.Builder(context);
mbuilder.setContentTitle(intent.getStringExtra("title"));//设置通知栏标题
mbuilder.setContentText(intent.getStringExtra("context"));//设置通知栏内容
mbuilder.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
mbuilder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher));//设置大图标
mbuilder.setContentIntent(pendingIntent);//设置点击跳转的Intent,因为没有设置uri,所以跳转为空
mbuilder.setAutoCancel(true);//点击之后消失
Notification notification=mbuilder.build();
notificationManager.notify(id++,notification);//能够传送多条消息
}
}
运行截图:
3.使用XML定义菜单 :
核心代码:
public class MenuActivity extends AppCompatActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
this.setTitle("XML定义菜单");
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_layout);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
TextView textView =(TextView) findViewById(R.id.text);
switch (item.getItemId()){
case R.id.z1:
textView.setTextSize(10);break;
case R.id.z2:
textView.setTextSize(16);break;
case R.id.z3:
textView.setTextSize(20);break;
case R.id.y1:
textView.setTextColor(Color.RED);break;
case R.id.y2:
textView.setTextColor(Color.BLACK);break;
case R.id.p:
Toast.makeText(this,"这是普通单击项",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
}
menu_layout.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/z"
android:title="字体大小"
>
<menu>
<group>
<item
android:id="@+id/z1"
android:title="10号字体"
/>
<item
android:id="@+id/z2"
android:title="16号字体"
/>
<item
android:id="@+id/z3"
android:title="20号字体"
/>
</group>
</menu>
</item>
<item
android:id="@+id/p"
android:title="普通菜单项"
>
</item>
<item
android:id="@+id/y"
android:title="字体颜色">
<menu>
<group>
<item
android:id="@+id/y1"
android:title="红色"
/>
<item
android:id="@+id/y2"
android:title="黑色"
/>
</group>
</menu>
</item>
</menu>
运行截图:
20号字体:
红色:
普通选项:
4.创建上下文操作模式(ActionMode)的上下文菜单
核心代码:
public class ActionMode extends AppCompatActivity {
private ListView listView;
private List<Number> numberList = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
this.setTitle("ActionMode");
super.onCreate(savedInstanceState);
setContentView(R.layout.actionmode_layout);
initNumber();
NumberAdapter adapter = new NumberAdapter(ActionMode.this,R.layout.number_layout,numberList);
listView = (ListView) findViewById(R.id.list_view2);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.actionmode, menu);
return true;
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
mode.finish();
return false;
}
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
mode.setTitle(listView.getCheckedItemCount()+" selected");
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
}
});
}
private void initNumber(){
for(int i=0;i<2;i++){
Number one = new Number("One",R.mipmap.ic_launcher);
numberList.add(one);
Number two = new Number("Two",R.mipmap.ic_launcher);
numberList.add(two);
Number three = new Number("Three",R.mipmap.ic_launcher);
numberList.add(three);
Number four = new Number("four",R.mipmap.ic_launcher);
numberList.add(four);
Number five = new Number("five",R.mipmap.ic_launcher);
numberList.add(five);
}
}
}
NumberAdapter
public class NumberAdapter extends ArrayAdapter<Number> {
private int resourceId;
public NumberAdapter(@NonNull Context context, int resource, @NonNull List<Number> objects) {
super(context, resource, objects);
resourceId = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Number number = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView numberImage=(ImageView)view.findViewById(R.id.num_image);
TextView numberName=(TextView)view.findViewById(R.id.num_name);
numberImage.setImageResource(number.getImageId());
numberName.setText(number.getName());
return view;
}
}
运行截图: