日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之观察者模式在Listview中的应用

發布時間:2024/7/5 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之观察者模式在Listview中的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候我們會有這么一個需求,在Listview的某個Item上有個按鈕,點擊這個按鈕之后呢,需要對其它的item做一些操作,就像下面這個:

采納按鈕點擊之前:采納按鈕點擊之后:

簡單介紹一下這兩張圖的意思:

模擬了一個Listview,在每個Item上都有一個“采納”按鈕,當點擊其中一個“采納”之后,需要將其它“采納”按鈕隱藏,并且自身需要改為“已采納”,如后面的圖所示。

我們有一種簡單的辦法可以做到,就是更改數據的值,并且讓Adapter重新刷新一遍,這是一種簡單粗暴的方式,用戶體驗非常不好,會使整個頁面都閃一下。

那么為了有沒有什么更好的辦法呢?有的,使用我們的觀察者模式。

觀察者模式在我們這里的基本實現方式是:當其中一個按鈕被點擊之后,通過回調更新其它控件即可。如何實現呢?以簡單代碼來說明:

package com.sahadev;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set;import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView;import com.lidroid.xutils.ViewUtils; import com.lidroid.xutils.view.annotation.ViewInject; import com.sahadev.renren.R;public class MainActivity extends Activity {@ViewInject(R.id.listview)private ListView listview;private BaseAdapter internalAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_zoom);ViewUtils.inject(this);internalAdapter = new InternalAdapter(this);listview.setAdapter(internalAdapter);}/*** 觀察者模式的回調接口* * @author Sahadev**/public interface Callback {public void update(Message msg);}private static class InternalAdapter extends BaseAdapter {private int dataSize = 6;private Map<View, Callback> maps;private LayoutInflater inflate;public InternalAdapter(Context context) {super();inflate = LayoutInflater.from(context);maps = new HashMap<View, MainActivity2.Callback>();}@Overridepublic int getCount() {return dataSize;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@SuppressLint("InflateParams")@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = inflate.inflate(R.layout.listview_item_layout, null);Button button = (Button) convertView.findViewById(R.id.button);// 生成一個觀察者Callback callback = new Callback() {@Overridepublic void update(Message msg) {// 當其中一個按鈕被點擊時通過調用update方法來更新其它UI// 先隱藏所有的采納按鈕View view = (View) msg.obj;if (msg.what == 0) {view.setVisibility(View.INVISIBLE);} else {Button button = (Button) view;button.setText("已采納");button.setEnabled(false);}}};// 將我們的需要更改的對象和觀察者一并放入mapsmaps.put(button, callback);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(final View v) {// 遍歷maps中所有的監聽者Set<Entry<View, Callback>> entrySet = maps.entrySet();Iterator<Entry<View, Callback>> iterator = entrySet.iterator();while (iterator.hasNext()) {Entry<View, Callback> next = iterator.next();// 使用value的update方法將key作為參數使得監聽的地方對它進行修改Message msg = new Message();View temp = next.getKey();msg.obj = temp;if (temp.equals(v) || temp == v) {// 如果是點擊的按鈕本身,則需要對它進行特殊處理msg.what = 1;}// 通知所有的觀察者next.getValue().update(msg);}}});}return convertView;}} }


最后附上我們的運行效果圖,是不是很實用呢?





總結

以上是生活随笔為你收集整理的设计模式之观察者模式在Listview中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。