1. 程式人生 > >仿QQ個人標籤的新增與刪除

仿QQ個人標籤的新增與刪除

CSDN的第一篇部落格,一直堅持下去,加油!!!
最近在公司專案開發中,有一個類似於QQ個人標籤的需求要完成,具體包括個人標籤的新增,刪除,新增過程中重複的標籤會提示使用者,不能夠進行新增。先給大家看一下效果圖。

點選標籤按鈕,彈出標籤選擇的頁面,顯示所有的標籤;點選全部標籤裡面的item,選擇的標籤會顯示在上方;再次點選相同的標籤進行新增,會提示使用者“標籤已存在,請重新新增”;點選上方已經選擇好的標籤,進行刪除操作

業務邏輯就是這樣,下面是具體實現過程:
一、介面佈局:

<LinearLayout
        android:layout_width="fill_parent"
android:layout_height="@dimen/label_hei" > <GridView android:id="@+id/label_check_gv" style="@style/w_h_full" android:layout_margin="@dimen/margin" android:horizontalSpacing="@dimen/margin" android:numColumns="4" android:scrollbars="none"
android:stretchMode="columnWidth" android:verticalSpacing="@dimen/margin" > </GridView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="@dimen/activity_bar" android:background="@color
/gray_bg"
> <TextView style="@style/w_wrap_h_wrap" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/margin" android:text="@string/all_label" /> </LinearLayout> <GridView android:id="@+id/label_gv" style="@style/w_h_full" android:layout_margin="@dimen/margin" android:horizontalSpacing="@dimen/margin" android:numColumns="4" android:scrollbars="none" android:stretchMode="columnWidth" android:verticalSpacing="@dimen/margin" > </GridView>

關鍵佈局就是兩個Gridview,其中屬性依次設定的是ID,高寬,邊距,水平邊距,列數,隱藏滾動條,縮放與列寬大小同步,垂直邊距。item裡面的佈局就是textview,背景是一個自定義的邊框。

二、Gridview的介面卡:

public class FragLabelGridViewAdapter extends BaseAdapter {

    class ViewHolder {
        @ViewInject(R.id.gv_label_txt)
        public TextView label;
    }

    private Context context;
    private LayoutInflater inflater;
    private List<String> labels;

    public FragLabelGridViewAdapter(List<String> labels, Context context) {
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.labels = labels;

    }

    @Override
    public int getCount() {
        return labels.size();
    }

    @Override
    public Object getItem(int position) {
        return (position);
    }

    @Override
    public long getItemId(int id) {
        // TODO Auto-generated method stub
        return id;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.gv_item_label, null);
            viewHolder = new ViewHolder();
            ViewUtils.inject(viewHolder, convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.label.setText(labels.get(position));
        return convertView;
    }

}

核心就是使用viewHolder來優化Gridview,原理就是convertView的複用:當第一次建立convertView物件時,便把item的子View控制元件物件例項化出來並儲存到ViewHolder物件中(這裡使用了Xutils的註解)。然後用convertView的setTag將viewHolder物件設定到Tag中, 當以後再次載入ListView的item時便可以直接從Tag中取出ViewHolder物件,不需要每次都去獲取item的子控制元件物件。這樣達到複用的目的,大大提高了效能。

三、主介面的程式碼:

public class FragmentLabel extends Fragment {

    @ViewInject(R.id.label_gv)
    GridView labelGridview;
    @ViewInject(R.id.label_check_gv)
    GridView labelCheckGridview;
    private Context context;
    private FragLabelGridViewAdapter adapter;
    private FragLabelCheckGridViewAdapter checkAdapter;
    // 所有標籤
    private List<String> labels = new ArrayList<String>();
    // 已選標籤
    private List<String> checkLabels = new ArrayList<String>();

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_label, container, false);
        ViewUtils.inject(this, view);
        context = getActivity().getApplicationContext();
        return view;

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        initviews();
    }

首先是通過註解來進行元件的宣告,效果與findviewbyid()一樣。然後就是兩個Gridview的介面卡的宣告,接下來就是模擬Gridview裡面的資料進行操作

private void initviews() {
        labels.add("高血壓");
        labels.add("糖尿病");
        labels.add("肺炎");
        labels.add("肝炎");
        labels.add("高血脂");
        labels.add("心臟病");
        labels.add("中暑");
        labels.add("肺炎");
        labels.add("感冒");
        labels.add("高血脂");
        labels.add("胃病");
        labels.add("糖尿病");
        labels.add("肺炎");
        labels.add("肝炎");
        labels.add("高血脂");
        labels.add("高血壓");
        labels.add("糖尿病");
        labels.add("肺炎");
        labels.add("肝炎");
        labels.add("高血脂");
        labels.add("高血壓");
        labels.add("糖尿病");
        labels.add("肺炎");

        adapter = new FragLabelGridViewAdapter(labels, context);
        labelGridview.setAdapter(adapter);
        labelGridview.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
                for (int i = 0; i < checkLabels.size(); i++) {
                    if (labels.get(position) == checkLabels.get(i)) {
                        UiUtil.showToast(context,
                                getResources().getString(R.string.label_toast));
                        return;
                    }

                }
                checkLabels.add(labels.get(position));

                refresh();
            }

        });
        checkAdapter = new FragLabelCheckGridViewAdapter(checkLabels, context);
        labelCheckGridview.setAdapter(checkAdapter);
        labelCheckGridview.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
                checkLabels.remove(position);
                refresh();
            }
        });

    }

    private void refresh() {
        checkAdapter.setLabels(checkLabels);
        checkAdapter.notifyDataSetChanged();
    }
}

首先往list集合新增資料,這裡都是模擬的資料,實際情況資料都會從伺服器獲取。通過構造方法傳遞了兩個引數來例項化介面卡,並給Gridview繫結介面卡。

給下面Gridview的item繫結監聽器,處理點選新增操作。點選事件裡面,首先要進行標籤唯一性的判斷,遍歷上面Gridview的list集合,如果與點選item的值一樣,會提示使用者“標籤存在”,如果標籤不存在,則會將資料新增在上面的Gridview的list中。最後執行refresh方法,將資料傳遞給adapter,然後呼叫notifyDataSetChanged()方法,這樣選擇的標籤會自動出現在上面,無需重新整理操作。
給上面Gridview的item繫結監聽器,處理點選刪除操作,呼叫的是list的remove(position)方法,刪除方法執行以後,再呼叫一下重新整理方法。最後執行的效果和剛開始的圖片一樣。

相關推薦

仿QQ個人標籤新增刪除

CSDN的第一篇部落格,一直堅持下去,加油!!! 最近在公司專案開發中,有一個類似於QQ個人標籤的需求要完成,具體包括個人標籤的新增,刪除,新增過程中重複的標籤會提示使用者,不能夠進行新增。先給大家看一下效果圖。 點選標籤按鈕,彈出標籤選擇的頁面,顯示

Android仿qq聊天記錄待定刪除功能效果

模仿手機qq,歷史聊天記錄長按會彈出待定和刪除按鈕的效果。qq效果圖  程式碼實現的效果圖 首先,看到這個效果,想一下實現的思路:彈出的待辦和刪除按鈕,是通過dialog實現的。那麼這個dialog就要能完成幾個效果,第一:自定義介面,第二:控制dialog的顯示位置,第三

MySQL外來鍵新增刪除

ALTER table erp_bom_detail ADD CONSTRAINT `FK_bom_detail` FOREIGN KEY (`bom_id`) REFERENCES erp_bom(`bom_id`)   ALTER 的是子表   alter t

hibernate多對多關係的新增刪除

程式碼 bookdao public Integer save(Book book) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTran

html中元素動態新增刪除

<div class="unit" > <label>產品引數</label> <input type="button" value="新增" onclick="addProduc

Qt5.8之QListWidgetItem的新增刪除

1.實現的功能 在listWidget中水平添QListWidgetItem,點選按鈕刪除所有QListWidgetItem,下面直接上程式碼,程式碼中有每一步的註釋。 2.程式碼實現 #include "mainwindow.h" #include "ui_mainwindow.h" #incl

element vue Array陣列和Map物件的新增刪除

使用場景: 一個後臺系統中, 管理員要配置自定義欄位後臺要生成id和title,其他角色要使用自定義欄位的表單, 新增資料, 但是每個要填寫的物件的id 和title都是無法固定的,因此頁面顯示的title 和id都需要自定義數字和map物件來實現,vue 的數值動態新增內容需要特定的方式: 1.定義一個

react+antd系列之Form表單(1):新增刪除

在用antd的時候,我們如果要對錶單進行新增和刪除該怎麼弄呢,如下: import { connect } from 'dva'; import { Form, Input, Button } from 'antd'; import styles from './eg1.css';

Ubuntu 下使用者和組新增刪除操作

最近在折騰VPS時發現,VPS中一般只設有root使用者,普通使用者得自己設定,一番折騰之後,寫下這篇部落格,權當筆記之用。 一、建立使用者 1、使用命令 useradd 例:useradd user1——建立使用者user1(該操作一般不會再/home目

Linux賬戶的新增刪除

* 本文環境為centos發行版本的Linux,ubuntu不適用 新增賬戶 以新增一個test賬戶為例。 useradd test 會按照預設設定,新建一個test賬戶,並新建一個test 組。 test的賬戶資訊和組資訊分別在/etc/pa

extjs6 樹節點的新增刪除及表格中按鈕狀態變更

樹: var tree = Ext.create('Ext.tree.Panel', { rootVisible: false, store: Ext.create('departStore'), columnLines: true

jquery製作具有新增刪除功能的表單(轉載加修改)

jQuery製作具有新增與刪除功能的表單 效果圖如下: js程式碼如下: $(document).ready(function(){ //<tr/>居中 $("#tab tr").attr("align","center"); //增加&

div跟隨滑鼠移動+上浮定位+移動放置 新增刪除

html程式碼 <html lang="zh-CN"> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> <meta charset="utf-8

jQuery表單新增刪除..

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>使用者名稱註冊</title> <

mpvue小程式仿qq左滑置頂刪除

mpvue仿qq左滑置頂刪除元件背景: 前幾天,公司的一個小程式專案開發的時候,遇到了一點點問題。設計師這狗幣要讓我在小程式上實現類似QQ左滑置頂刪除的操作,心裡mmp,我就是一個剛來公司三天的小小前端實習生而已,我想學習....當然剛剛來就被公司委以重任,也能看出本人技術

從零開始學 Web 之 jQuery(四)元素的建立新增刪除,自定義屬性

一、元素的建立新增和刪除 1、方式一:以物件的方式建立元素 append,appendTo :在被選元素所有子元素的結尾插入內容(增加子元素)。 prepend,prependTo:在被選元素所有子元素的開頭插入元素(增加子元素)。 before:在當前被選元素之後插入內容(相當於增加兄弟元素)。 af

HTML頁面元素的新增刪除

每個載入瀏覽器的HTML文件都會成為Document物件。Document物件使我們可以從指令碼(JavaScript)中對HTML頁面中的所有元素進行訪問。建立一個div。// 建立一個div. var div = document.createElement("div")

在arcgis中提取、新增刪除Shape檔案Z值

一、問題描述 有一批3d模型沒有高程值;在BS平臺上預覽顯示這些模型插入地下去了;預覽效果非常差,因為Z值為都是0; 由於平臺讀取資料是geometry的Z值欄位,而不是重新建一個欄位,所以要改寫ge

仿QQ個人資訊詳情介面中背景圖的下拉擴充套件放大功能

    一般一些專案中都少不了一些頭部背景圖,但是如果背景圖靜態的現實並不能呈現出與使用者操作的互動感,所以要想辦法讓背景圖動起來,qq的一些互動感我很喜歡,比如他的個人詳情介面的背景圖就是可以下拉擴充套件,並在擴充套件到一定程度中可以放大圖片。其設計原理就是先隱藏頭部和底

SQLite資料庫之資料新增刪除

-------------------------------------- SQLite資料庫-------------------------------------- Androi