Android 综合练习Task3
Android 综合练习Task3
题目要求
编写一个程序,1个TextView(用于显示学号姓名)、1个ListView。ListView是风景点的地点名称和风景图片(适配器需要改写)。在所描述功能的基础上,对ListView增加上下文菜单(修改、删除、新增三个功能),修改功能支持对风景地点改名称和图片重选(弹出的对话框中有图文并茂的GridView),并且改完名称后,ListView的名称也会被修改;删除功能则对该风景删除,ListView也会相应更新;新增功能能在弹出的对话框中选择GridView显示的风景进行添加。选项菜单的功能则为:增加风景、重置两个功能。重置功能则将ListView中的风景列表恢复成程序启动时的状态。修改和新增功能弹出的对话框,第一行为EditText和ImageView,第二行为GridView,并有确定和取消按钮。
分析
主界面只有一个TextView和一个Listview
其中Listview需要自己设置样式 为 img + textview
主界面需要同添加menu 含有2个功能
Alert的内容也需要设置样式 EditText + image + Gridview
主界面
<?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">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Show my name and id" />
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
row_Listview
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/row_img"
android:layout_width="120dp"
android:layout_height="120dp"
android:scaleType="centerCrop"
app:srcCompat="@drawable/da_luo_shan" />
<TextView
android:id="@+id/row_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:textSize="20sp"
android:text="大罗山" />
</LinearLayout>
menu
一个是右上角的menu,一个是点击ListView中内容出现的menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/detail_modify"
android:title="修改" />
<item
android:id="@+id/detail_delete"
android:title="删除" />
<item
android:id="@+id/detail_add"
android:title="增加" />
</menu>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/main_reset"
android:title="重置" />
<item
android:id="@+id/main_add"
android:title="增加风景" />
</menu>
Alert内容
这个先放着
实现步骤
我们一步一步的来实现功能
根据我的思路,先实现以下ListView的布局,对前面的知识进行以简单的回顾
ListView内容实现
City.Class
package com.example.tty_task3_example;
public class City {
private String name;
private int img_id;
public City(String name, int img_id) {
this.name = name;
this.img_id = img_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImg_id() {
return img_id;
}
public void setImg_id(int img_id) {
this.img_id = img_id;
}
}
CityAdapter.Class
package com.example.tty_task3_example;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
public class CityAdapter extends ArrayAdapter<City> {
private Context context;
private ArrayList<City> list;
public CityAdapter(@NonNull Context context, ArrayList<City> list) {
super(context, android.R.layout.simple_list_item_1, list);
this.list = list;
this.context = context;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View v;
if (convertView == null) {
v = LayoutInflater.from(context).inflate(R.layout.row_lv, null, false);
} else {
v = convertView;
}
City city = list.get(position);
ImageView img = v.findViewById(R.id.row_img);
TextView tv = v.findViewById(R.id.row_tv);
img.setImageResource(city.getImg_id());
tv.setText(city.getName());
return v;
}
}
包含部分功能的MainActivity.Class
package com.example.tty_task3_example;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<City> list;
ArrayAdapter<City> adapter;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
lv = findViewById(R.id.main_lv);
list = new ArrayList<>();
list = init_list();
adapter = new CityAdapter(this, list);
lv.setAdapter(adapter);
registerForContextMenu(lv);
}
private ArrayList<City> init_list() {
City city1 = new City("长城", R.drawable.great_wall);
City city2 = new City("大罗山", R.drawable.da_luo_shan);
list.add(city1);
list.add(city2);
return list;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.detai_menu, menu);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int position = menuInfo.position;
switch (item.getItemId()) {
case R.id.detail_add:
break;
case R.id.detail_delete:
list.remove(position);
adapter.notifyDataSetChanged();
break;
case R.id.detail_modify:
break;
}
return super.onContextItemSelected(item);
}
}
增加和修改的内容涉及到Alert页面,这个我打算后面再写,这里仅仅实现了删除的功能
初始界面我打算放如下两个Item,定义在init_list的方法中
下面我打算添加一下右上角的菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.main_add:
break;
case R.id.main_reset:
list = init_list();
adapter.notifyDataSetChanged();
break;
}
return super.onOptionsItemSelected(item);
}
接下来就是Alert页面了
Alert页面
最上面一层是 EditText和Image
下面是GridView
其中GridView中的Item要自己定义
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<EditText
android:id="@+id/alert_et"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:maxLines="1"
android:inputType="textPersonName"
android:text="大罗山" />
<ImageView
android:id="@+id/alert_img"
android:layout_width="60dp"
android:layout_height="40dp"
android:scaleType="centerCrop"
app:srcCompat="@drawable/da_luo_shan" />
</LinearLayout>
<GridView
android:id="@+id/alert_gv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:stretchMode="columnWidth" />
</LinearLayout>
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/row_gv_img"
android:layout_width="100dp"
android:layout_height="60dp"
android:scaleType="centerCrop"
app:srcCompat="@drawable/great_wall" />
<TextView
android:id="@+id/row_gv_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:text="长城" />
</LinearLayout>
为添加功能创造一个函数add_more
第一次写的时候忘记加bl.setView(v);
了,找了半天才发现
private void add_more() {
gv_list = init_gv_list();
AlertDialog.Builder bl = new AlertDialog.Builder(this);
bl.setTitle("增加内容");
View v = LayoutInflater.from(this).inflate(R.layout.alert_detail, null, false);
bl.setView(v);
final EditText et = v.findViewById(R.id.alert_et);
final ImageView img = v.findViewById(R.id.alert_img);
GridView gv = v.findViewById(R.id.alert_gv);
final GridViewAdapter gv_adpter = new GridViewAdapter(this, gv_list);
gv.setAdapter(gv_adpter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
City city = gv_adpter.getItem(position);
et.setText(city.getName());
img.setImageResource(city.getImg_id());
}
});
bl.setPositiveButton("确认", null).setNegativeButton("取消", null).create().show();
}
可以基本实现如下的效果
可以看到,虽然出现了选择框,但是点击确认后没什么用,所以接下来要继续编写setPositiveButton的内容
String name = et.getText().toString();
list.add(new City(name, img_id[0]));
adapter.notifyDataSetChanged();
修改和新增的功能区别在与,点击修改的时候Editview里面要出现点击的那个城市的信息
而新增的时候需要有默认的名字和图片
全代码
因为java学的不是很好,所以很多地方写的很粗糙,之后复习的时候会优化一下
package com.example.tty_task3_example;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<City> list, gv_list;
ArrayAdapter<City> adapter;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
lv = findViewById(R.id.main_lv);
gv_list = new ArrayList<>();
list = new ArrayList<>();
list = init_list();
adapter = new CityAdapter(this, list);
lv.setAdapter(adapter);
registerForContextMenu(lv);
}
private ArrayList<City> init_gv_list() {
gv_list.clear();
City city1 = new City("西湖", R.drawable.west_lake);
City city2 = new City("灵隐寺", R.drawable.ling_yin_temple);
City city3 = new City("*", R.drawable.the_imperial_palace);
City city4 = new City("南溪河", R.drawable.nan_xi_river);
gv_list.add(city1);
gv_list.add(city2);
gv_list.add(city3);
gv_list.add(city4);
return gv_list;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.main_add:
// 增加功能
add_more();
break;
case R.id.main_reset:
list = init_list();
adapter.notifyDataSetChanged();
break;
}
return super.onOptionsItemSelected(item);
}
private ArrayList<City> init_list() {
list.clear();
City city1 = new City("长城", R.drawable.great_wall);
City city2 = new City("大罗山", R.drawable.da_luo_shan);
list.add(city1);
list.add(city2);
return list;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.detai_menu, menu);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int position = menuInfo.position;
switch (item.getItemId()) {
case R.id.detail_add:
add_more();
// 增加功能
break;
case R.id.detail_delete:
list.remove(position);
adapter.notifyDataSetChanged();
break;
case R.id.detail_modify:
City city2 = list.get(position);
// 修改功能
modify(city2);
break;
}
return super.onContextItemSelected(item);
}
private void modify(City city){
gv_list = init_gv_list();
AlertDialog.Builder bl = new AlertDialog.Builder(this);
bl.setTitle("增加内容");
View v = LayoutInflater.from(this).inflate(R.layout.alert_detail, null, false);
bl.setView(v);
final EditText et = v.findViewById(R.id.alert_et);
et.setText(city.getName());
final ImageView img = v.findViewById(R.id.alert_img);
img.setImageResource(city.getImg_id());
GridView gv = v.findViewById(R.id.alert_gv);
final GridViewAdapter gv_adpter = new GridViewAdapter(this, gv_list);
final int[] img_id = new int[1];
gv.setAdapter(gv_adpter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
City gv_city = gv_adpter.getItem(position);
et.setText(gv_city.getName());
img_id[0] = gv_city.getImg_id();
img.setImageResource(gv_city.getImg_id());
}
});
bl.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String name = et.getText().toString();
list.add(new City(name, img_id[0]));
adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).create().show();
}
private void add_more() {
gv_list = init_gv_list();
AlertDialog.Builder bl = new AlertDialog.Builder(this);
bl.setTitle("增加内容");
View v = LayoutInflater.from(this).inflate(R.layout.alert_detail, null, false);
bl.setView(v);
final EditText et = v.findViewById(R.id.alert_et);
et.setText("钱江");
final ImageView img = v.findViewById(R.id.alert_img);
img.setImageResource(R.drawable.qian_jiang_cbd);
GridView gv = v.findViewById(R.id.alert_gv);
final GridViewAdapter gv_adpter = new GridViewAdapter(this, gv_list);
final int[] img_id = new int[1];
img_id[0] = R.drawable.qian_jiang_cbd;
gv.setAdapter(gv_adpter);
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
City gv_city = gv_adpter.getItem(position);
et.setText(gv_city.getName());
img_id[0] = gv_city.getImg_id();
img.setImageResource(gv_city.getImg_id());
}
});
bl.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String name = et.getText().toString();
list.add(new City(name, img_id[0]));
adapter.notifyDataSetChanged();
}
}).setNegativeButton("取消", null).create().show();
}
}
本文地址:https://blog.csdn.net/Weary_PJ/article/details/108728039
下一篇: 鲍旭在梁山是什么排名?因李逵而丧命