Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息
在上一篇《Android仿微信滑動(dòng)彈出編輯、刪除菜單效果、增加下拉刷新功能》里,已經(jīng)帶著大家學(xué)習(xí)如何使用SwipeMenuListView這一開源庫(kù)實(shí)現(xiàn)滑動(dòng)列表彈出菜單,接下來,將進(jìn)一步學(xué)習(xí),如何為不同的list item呈現(xiàn)不同的菜單,此處我們做一個(gè)實(shí)例:Android 高仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息,看下效果圖:
1. 創(chuàng)建項(xiàng)目,并導(dǎo)入SwipeMenuListView類庫(kù)
2. 創(chuàng)建消息實(shí)體bean:
public class Msg { public int id; public String title; public String desc; // false是未讀;true是已讀 public boolean isRead; @Override public String toString() { return "Msg{" + "id=" + id + ", title='" + title + '\'' + ", desc='" + desc + '\'' + ", isRead=" + isRead + '}'; } }
注: 通過isRead字段,我們區(qū)分菜單顯示“設(shè)為已讀”“設(shè)為未讀”;
3. 創(chuàng)建列表顯示的Adapter,重寫其中的getItemViewType方法:
import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * my msgs list adapter */ public class MyMsgAdapter extends BaseAdapter { private Activity mContext; private LayoutInflater mInflater; private List<Msg> mDatas; public MyMsgAdapter(Activity context, List<Msg> datas) { mContext = context; mInflater = LayoutInflater.from(mContext); mDatas = datas; } @Override public int getCount() { return (mDatas != null ? mDatas.size() : 0); } @Override public Object getItem(int position) { return (mDatas != null ? mDatas.get(position) : null); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { Msg myMsg = mDatas.get(position); boolean isRead = myMsg.isRead; if (isRead) { return 0; } else { return 1; } } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { // 下拉項(xiàng)布局 convertView = mInflater.inflate(R.layout.list_item_my_msg, null); holder = new ViewHolder(); holder.img_msg = (ImageView) convertView.findViewById(R.id.img_msg); holder.text_msg_user_name = (TextView) convertView.findViewById(R.id.text_msg_user_name); holder.text_msg_infos = (TextView) convertView.findViewById(R.id.text_msg_infos); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Msg myMsg = mDatas.get(position); if (myMsg != null) { if (myMsg.isRead) {//未讀 holder.img_msg.setImageResource(R.mipmap.readed_msg_img); } else { holder.img_msg.setImageResource(R.mipmap.unread_msg_img); } holder.text_msg_user_name.setText(myMsg.title); holder.text_msg_infos.setText(myMsg.desc); } return convertView; } class ViewHolder { ImageView img_msg; TextView text_msg_user_name; TextView text_msg_infos; } }
注: 此處重寫了父類中的getItemViewType方法,該方法中,我們根據(jù)Msg的isRead字段來判斷返回值的是0還是1; 之后,我們將根據(jù)該返回值,來判斷l(xiāng)ist item的菜單是何種類型!
4. 根據(jù)ItemViewType,創(chuàng)建滑動(dòng)菜單:
import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.TypedValue; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import com.apkfuns.logutils.LogUtils; import com.baoyz.swipemenulistview.SwipeMenu; import com.baoyz.swipemenulistview.SwipeMenuCreator; import com.baoyz.swipemenulistview.SwipeMenuItem; import com.baoyz.swipemenulistview.SwipeMenuListView; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnItemClick; public class MainActivity extends AppCompatActivity { // 方案列表 @Bind(R.id.listViewMyMsgs) public SwipeMenuListView listViewMyMsgs; private MyMsgAdapter msgAdapter; // 消息集合 private List<Msg> msgs; // 要?jiǎng)h除的數(shù)據(jù) private Msg dMsg; // 要修改的數(shù)據(jù) private int oPos; private Msg oMyMsg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); msgs = new ArrayList<Msg>(); Msg msg1 = new Msg(); msg1.id = 1; msg1.title = "上邪"; msg1.desc = "我欲與君相知,長(zhǎng)命無絕衰"; msg1.isRead = false; Msg msg2 = new Msg(); msg2.id = 2; msg2.title = "愛在記憶中找你"; msg2.desc = "如果可以恨你,全力痛恨你,連遇上亦要躲避"; msg2.isRead = true; msgs.add(msg1); msgs.add(msg2); msgAdapter = new MyMsgAdapter(this, msgs); listViewMyMsgs.setAdapter(msgAdapter); createMenu(); } /** * 刪除某個(gè)消息 * * @param position */ private void deleteMsg(int position) { // DoDeleteMsgRequest(String id,Handler mHandler, int reqCode) dMsg = msgs.get(position); if (dMsg != null) { Toast.makeText(MainActivity.this, "刪除 : " + dMsg, Toast.LENGTH_SHORT).show(); msgs.remove(dMsg); msgAdapter.notifyDataSetChanged(); } } /** * 標(biāo)記已讀和未讀 * * @param position */ private void readMsg(int position) { //DoReadMsgRequest(String id, String isRead, Handler mHandler, int reqCode) oPos = position; oMyMsg = msgs.get(position); if (oMyMsg != null) { msgs.get(position).isRead = !msgs.get(position).isRead; msgAdapter.notifyDataSetChanged(); } } private void createMenu() { // step 1. create a MenuCreator SwipeMenuCreator creator = new SwipeMenuCreator() { @Override public void create(SwipeMenu menu) { switch (menu.getViewType()) { case 0:// 未讀 createMenu1(menu); break; case 1:// 已讀 createMenu2(menu); break; } } private void createMenu1(SwipeMenu menu) { SwipeMenuItem unreadItem = new SwipeMenuItem( getApplicationContext()); unreadItem.setId(1); unreadItem.setBackground(new ColorDrawable(Color.parseColor("#555555"))); unreadItem.setWidth(dp2px(90)); unreadItem.setTitle("標(biāo)為已讀"); unreadItem.setTitleSize(16); unreadItem.setTitleColor(Color.parseColor("#FFFFFF")); menu.addMenuItem(unreadItem); SwipeMenuItem deleteItem = new SwipeMenuItem( getApplicationContext()); deleteItem.setId(0); deleteItem.setBackground(new ColorDrawable(Color.parseColor("#EF4B3A"))); deleteItem.setWidth(dp2px(90)); deleteItem.setTitle("刪除"); deleteItem.setTitleSize(16); deleteItem.setTitleColor(Color.parseColor("#FFFFFF")); menu.addMenuItem(deleteItem); } private void createMenu2(SwipeMenu menu) { SwipeMenuItem readedItem = new SwipeMenuItem( getApplicationContext()); readedItem.setId(2); readedItem.setBackground(new ColorDrawable(Color.parseColor("#555555"))); readedItem.setWidth(dp2px(90)); readedItem.setTitle("標(biāo)記未讀"); readedItem.setTitleSize(16); readedItem.setTitleColor(Color.parseColor("#FFFFFF")); menu.addMenuItem(readedItem); SwipeMenuItem deleteItem = new SwipeMenuItem( getApplicationContext()); deleteItem.setId(0); deleteItem.setBackground(new ColorDrawable(Color.parseColor("#EF4B3A"))); deleteItem.setWidth(dp2px(90)); deleteItem.setTitle("刪除"); deleteItem.setTitleSize(16); deleteItem.setTitleColor(Color.parseColor("#FFFFFF")); menu.addMenuItem(deleteItem); } }; // set creator listViewMyMsgs.setMenuCreator(creator); // step 2. listener item click event listViewMyMsgs.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(int position, SwipeMenu menu, int index) { SwipeMenuItem menuItem = menu.getMenuItem(index); int id = menuItem.getId(); switch (id) { case 0: LogUtils.e("刪除 :" + position); deleteMsg(position); break; case 1: LogUtils.e("標(biāo)記未讀 :" + position); readMsg(position); break; case 2: LogUtils.e("標(biāo)為已讀 :" + position); readMsg(position); break; } return false; } }); } @OnItemClick(R.id.listViewMyMsgs) public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Msg myMsg = (Msg) parent.getAdapter().getItem( position); if (myMsg != null) { if (myMsg.isRead) { // 如果是未讀,需要標(biāo)記為已讀 readMsg(position); } } } private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); } }
注:著重看下SwipeMenuCreator接口中的public void create(SwipeMenu menu)方法,通過menu.getViewType()方法,我們可以得到該list item的viewType,而這個(gè)viewType,使我們剛剛在Adapter自己定義的,所以此時(shí),只需要判斷自己所定義的viewType值,并根據(jù)viewType來創(chuàng)建菜單即可!
如此這般,便可實(shí)現(xiàn)類似QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息功能啦,希望大家喜歡。
- Android實(shí)現(xiàn)頂部導(dǎo)航菜單左右滑動(dòng)效果
- Android滑動(dòng)優(yōu)化高仿QQ6.0側(cè)滑菜單(滑動(dòng)優(yōu)化)
- Android仿微信滑動(dòng)彈出編輯、刪除菜單效果、增加下拉刷新功能
- Android實(shí)現(xiàn)自定義滑動(dòng)式抽屜菜單效果
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- Android程序開發(fā)之使用Design包實(shí)現(xiàn)QQ動(dòng)畫側(cè)滑效果和滑動(dòng)菜單導(dǎo)航
- Android模仿美團(tuán)頂部的滑動(dòng)菜單實(shí)例代碼
- Android側(cè)滑菜單和輪播圖之滑動(dòng)沖突問題
- Android解決viewpager嵌套滑動(dòng)沖突并保留側(cè)滑菜單功能
- Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果
相關(guān)文章
Android中通過反射實(shí)現(xiàn)圓角ImageView代碼實(shí)例
這篇文章主要介紹了Android中通過反射實(shí)現(xiàn)圓角ImageView代碼實(shí)例,本文直接給出核心實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04Flutter實(shí)現(xiàn)底部導(dǎo)航欄創(chuàng)建詳解
ConvexBottomBar是一個(gè)底部導(dǎo)航欄組件,用于展現(xiàn)凸起的TAB效果,支持多種內(nèi)置樣式與動(dòng)畫交互。本文將利用ConvexBottomBar創(chuàng)建漂亮的底部導(dǎo)航欄,感興趣的可以學(xué)習(xí)一下2022-01-01Android實(shí)現(xiàn)簡(jiǎn)易的音樂播放器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易的音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05android獲取情景模式和鈴聲 實(shí)現(xiàn)震動(dòng)、鈴聲提醒
這篇文章主要介紹了android獲取情景模式和鈴聲,實(shí)現(xiàn)震動(dòng)、鈴聲提醒,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android GestureDetector用戶手勢(shì)檢測(cè)實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了Android GestureDetector用戶手勢(shì)檢測(cè)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android 倒計(jì)時(shí)控件 CountDownView的實(shí)例代碼詳解
這篇文章主要介紹了Android 倒計(jì)時(shí)控件 CountDownView的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android開發(fā)SavedState?Jetpack狀態(tài)保存利器
這篇文章主要為大家介紹了Android開發(fā)SavedState?Jetpack狀態(tài)保存利器使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08