有列表的短信界面

一、要求

制作一个短信界面,可以点击进入不同的短信界面,长按可以删除,右上角点击有菜单。

二、关键得分点:

目录页面和内容界面的布局、两类页面间的跳转功能;选项菜单的布局、上下文菜单的布局和功能。

三、界面

(一会儿再贴图)

四、主要思路

  1. 设置了一个List界面为初始总界面,四个分别的短信界面,短信界面延续上一次作业的内容,稍作更改。
  2. 关于列表。使用SimpleAdapter,通过setOnItemClickListener实现单击某个item后实现界面跳转。其中,listItem为一个数组,保存每个item,listItemAdapter将listItem和其外观联系起来(这里我也不知道理解的对不对,暂且先这样子)。
        //初始化listItem
        listItem = new ArrayList<HashMap<String, Object>>();
        //初始化一个SimpleAdapter
        listItemAdapter = new SimpleAdapter(this, listItem, R.layout.item,
                new String[]{"names", "messes", "dates","icons"},
                new int[]{R.id.name, R.id.mess, R.id.time, R.id.image});
  1. 长按删除的上下文菜单。重写setOnCreateContextMenuListener和onContextItemSelected,通过listItem.remove()实现删除item的操作。
  2. 右上角的菜单。使用轻量化组件 PopupMenu,没有用老师要求的选项菜单,因为用选项菜单的话就要改标题栏的设置,既然找到了更简便的方法我就用了。如果用选项菜单的话我的基本设想是更改标题栏的背景为白色,标题为信息,然后直接套课上练习chp302中的选项菜单部分就行了。

五、代码

1.List.java
package dhu.cst.liyiqing181310505.message;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class List extends AppCompatActivity {
    private ListView mList;
    int sum=4;
    // ListView的适配器
    SimpleAdapter listItemAdapter;
    // ListView的数据源,这里是一个HashMap的列表
    ArrayList<HashMap<String, Object>> listItem;
    //列表中的内容
    private  String[] names={"10086","同学A","同学B","同学C"};
    private  String[] messes={"【中国移动】流量提醒:尊敬的客户,您好!您本月套餐流量已使用1GB,剩余12GB。","你这周还有几节课啊?","周末去哪里玩呀?","Android的作业里的列表怎么自定义样式?"};
    private  String[] dates={"20:00","20:00","21:30","22:25"};
    private int[] icons={R.drawable.head,R.drawable.head,R.drawable.head,R.drawable.head};

    private int [] l={0,1,2,3};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        //初始化listItem
        listItem = new ArrayList<HashMap<String, Object>>();
        //初始化一个SimpleAdapter
        listItemAdapter = new SimpleAdapter(this, listItem, R.layout.item,
                new String[]{"names", "messes", "dates","icons"},
                new int[]{R.id.name, R.id.mess, R.id.time, R.id.image});
        //为上面的listItemAdapter赋值
        for (int i=0;i<4;i++){
            HashMap<String,Object> showitem=new HashMap<String, Object>();
            showitem.put("names",names[i]);
            showitem.put("messes",messes[i]);
            showitem.put("dates",dates[i]);
            showitem.put("icons",icons[i]);
            listItem.add(showitem);
        }
        //初始化mList
        mList = findViewById(R.id.list);
        mList.setAdapter(listItemAdapter);
        /***跳转页面***/
        mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent=new Intent();
                //l[position]为删除某个消息框后,现存的item所对应的消息框(确保点击跳转页面不会错乱)
                switch (l[position]){
                    case 0:
                        intent.setClass(getApplicationContext(), MainActivity.class);
                        List.this.startActivity(intent);
                        break;
                    case 1:
                        intent.setClass(getApplicationContext(), stu_1.class);
                        List.this.startActivity(intent);
                        break;
                    case 2:
                        intent.setClass(getApplicationContext(), stu_2.class);
                        List.this.startActivity(intent);
                        break;
                    case 3:
                        intent.setClass(getApplicationContext(), stu_3.class);
                        List.this.startActivity(intent);
                        break;
                }
            }
        });
        /***上下文菜单方法的长按监听***/
        mList.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
                //contextMenu.setHeaderTitle("title");//菜单的标题,这里不需要
                contextMenu.add(Menu.NONE, 0, 0, "删除");
            }
        });
        /***右上角选项菜单***/
        final ImageView imageVie = findViewById(R.id.more);
        imageVie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu(imageVie);
            }
        });

    }
    /***点击上下文菜单项后要做的事(选中菜单Item后触发)***/
    public boolean onContextItemSelected(MenuItem item){
        AdapterView.AdapterContextMenuInfo menuInfo;
        menuInfo =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
        switch (item.getItemId()){
            case 0:
                //定义一个pos表示当前选中的item在mList中的位置
                int pos=(int)mList.getAdapter().getItemId(menuInfo.position);
                //在listItem中将pos位置的内容移除
                listItem.remove(pos);
                //通过l数组记录每个item对应的消息框,每次都要更新一遍,并且总数sum-1
                for (int i=pos;i<sum-1;i++)
                    l[i]=l[i+1];
                sum--;
                //更新listItem的表单
                listItemAdapter.notifyDataSetChanged();
                break;
        }
        return super.onContextItemSelected(item);
    }

    /***轻量化组件 PopupMenu 的使用***/
    private void showPopupMenu(View view) {
        // View当前PopupMenu显示的相对View的位置
        PopupMenu popupMenu = new PopupMenu(this, view);
        // menu布局
        popupMenu.getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
        // menu的item点击事件
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                //点击动作
                return false;
            }
        });
        popupMenu.show();
    }
}

2.任意一个短信界面的java
package dhu.cst.liyiqing181310505.message;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private EditText shuru;
    private TextView xianshi;
    private ImageButton btsend;
    private ImageButton btBack;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        shuru = findViewById(R.id.shuru);
        xianshi = findViewById(R.id.xianshi);
        btsend = findViewById(R.id.btsend);
        btBack = findViewById(R.id.goback);

        xianshi.setVisibility(xianshi.GONE);

        btsend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                xianshi.setVisibility(xianshi.VISIBLE);
                xianshi.setText(shuru.getText().toString());
            }
        });

        //返回按钮,返回List列表界面
        btBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, List.class);
                MainActivity.this.startActivity(intent);
            }
        });
    }
}

3.activity_list.xml

大致界面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".List">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="407dp"
        android:layout_height="66dp"
        android:layout_marginEnd="2dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="322dp"
            android:layout_height="53dp"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:text="信息"
            android:textColor="#000000"
            android:textSize="40dp" />

        <ImageButton
            android:id="@+id/more"
            style="?android:attr/borderlessButtonStyle"
            android:layout_margin="10dp"
            android:layout_width="26dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:srcCompat="@drawable/more" />

    </LinearLayout>

    <ListView
        android:id="@+id/list"
        android:layout_width="409dp"
        android:layout_height="678dp"
        android:layout_marginEnd="2dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout"
        app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
4.ListView中item的xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:paddingBottom="15dp"
    >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="15dp"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="5dp" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginEnd="155dp"
        android:layout_toEndOf="@+id/image"
        android:paddingLeft="15dp"
        android:textColor="#000000"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="85dp"
        android:layout_marginTop="15dp"
        android:layout_toEndOf="@+id/name"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/mess"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/name"
        android:layout_alignBottom="@+id/name"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="-24dp"
        android:hint="我是ListView的Item布局"
        android:layout_toEndOf="@+id/image"
        android:paddingLeft="15dp"
        android:textSize="18sp" />

</RelativeLayout>
5.PopupMenu

PopupMenu需要建立一个Menu的文件夹,其中有一个main.xml为显示的菜单的布局。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add"
        android:title="编辑信息" />
    <item
        android:id="@+id/remove"
        android:title="选择信息" />
</menu>

六、tips

  1. 设置切换页面后不重新加载原界面(删除某条短信,再查看别的短信,返回后仍是删除后的样子)。在Manifest文件中设置:
<activity android:name=".List"
            android:launchMode = "singleTask"/>

可以参考:

https://blog.csdn.net/weixin_37438128/article/details/91043699

  1. 其他参考

https://blog.csdn.net/hello_1s/article/details/51837394?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.add_param_isCf

https://blog.csdn.net/xyj_1_2/article/details/101294760

https://blog.csdn.net/cup_chenyubo/article/details/37995397?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值