非正式仿聊天界面

學(xué)習(xí)了ListView察纯,可以做一個(gè)簡(jiǎn)易的對(duì)話形式的列表绊含,再加上對(duì)話框峻凫,就可以完成長(zhǎng)按文本彈出選項(xiàng)的形式,沒(méi)有什么功能純布局刹衫。

這里寫圖片描述
這里寫圖片描述

1、制作.9圖

  1. 手機(jī)上截出一張微信對(duì)話的圖搞挣,然后在phototshop里手動(dòng)測(cè)量好最小對(duì)話框(我理解的是發(fā)一個(gè)字母就是最小的對(duì)話框)的像素尺寸带迟,顏色代碼,然后利用ps的圖形繪制柿究,我采用的是一個(gè)圓角矩形和三角形合成的邮旷。

  2. 打開android sdk->tools->draw9path.bat。在輸入法為英語(yǔ)時(shí)它會(huì)打開如圖所示


    這里寫圖片描述
  3. file-open-9-path...打開你要制作的.9圖的原圖蝇摸,然后按照左上決定縮放區(qū)域婶肩,右下決定內(nèi)容顯示區(qū)域的原則,制作好一張.9圖



    右邊顯示的就是你的對(duì)話框在不同縮放情況下內(nèi)容顯示的區(qū)域貌夕,粉紅色區(qū)域就是我選擇的縮放區(qū)域律歼,這樣,對(duì)話框就會(huì)向下縮放

  4. 關(guān)于圖片的位置就是說(shuō)在資源文件里的位置啡专,參考了郭大神的這篇文章drawable的微技巧险毁,現(xiàn)在主流的手機(jī)都可以支持drawable-xhdpi的圖片,親測(cè)放在這里面顯示效果是極好的们童。

2畔况、顯示兩個(gè)不同的布局

  1. 參考我在csdn上看到的博客getItemViewType(),循環(huán)顯示兩個(gè)不同的布局文件慧库,和對(duì)話內(nèi)容跷跪。然后為TextView設(shè)置長(zhǎng)按點(diǎn)擊事件,彈出一個(gè)列表齐板,有兩種方式
  • 直接彈出對(duì)話框吵瞻,對(duì)話框AlertDialog.Builder提供了一個(gè)setAdapter()方法設(shè)置對(duì)話框的內(nèi)容葛菇,后來(lái)我覺(jué)得更好的是用setView()直接傳入一個(gè)View組件,這樣靈活性就比較強(qiáng)
  • 直接彈出一個(gè)菜單橡羞,為TextView注冊(cè)一個(gè)上下文菜單ContextMenu眯停,這樣也可為每個(gè)菜單項(xiàng)設(shè)置監(jiān)聽事件
  1. 代碼
  • 下面是適配器的代碼
class MyAdapter extends BaseAdapter{

    private Context mContext;
    private LayoutInflater mLayoutInflater;

    //兩種樣式的代號(hào)
    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPERATOR = 1;

    private static final int TYPE_MAX_COUNT = TYPE_SEPERATOR + 1;

    private List mData = new ArrayList();
    private TreeSet mSeperator = new TreeSet();

    private List<String> mDataList;

    public void addItem(final int item){

        mData.add(item);
        notifyDataSetChanged();
    }

    public void addSeperator(final int item){
        mData.add(item);
        mSeperator.add(mData.size() - 1);
    }

    public MyAdapter(Context context, List<String> DataList){
        this.mDataList = DataList;
        this.mContext = context;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public int getItemViewType(int position) {
        return mSeperator.contains(position)? TYPE_SEPERATOR : TYPE_ITEM;
    }

    @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

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

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder = null;
        int type = getItemViewType(i);
        if (view == null){
            viewHolder = new ViewHolder();
            switch (type){
                case TYPE_ITEM:
                   view = mLayoutInflater.inflate(R.layout.activity_you,null);
                    viewHolder.mTextView = (TextView) view.findViewById(R.id.you_text);
                    break;
                case TYPE_SEPERATOR:
                    view = mLayoutInflater.inflate(R.layout.activity_my, null);
                    viewHolder.mTextView = (TextView) view.findViewById(R.id.my_text);
                    break;
            }
            view.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.mTextView.setText(mDataList.get(i));
        viewHolder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            //長(zhǎng)按事件彈出一個(gè)對(duì)話框
            public boolean onLongClick(View view) {
                AlertDialog.Builder b = new AlertDialog.Builder(mContext);
                b.setAdapter(MainActivity.simple,null);
                b.create()
                        .show();
                return false;
            }
        });
        return view;
    }
}
class ViewHolder{
    TextView mTextView;
}
  • MainActivity
import android.content.Context;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {

    public static  SimpleAdapter simple;
    ListView mListView;
    private String[] select_items = {"復(fù)制", "轉(zhuǎn)發(fā)" , "收藏"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<String> stringList = new ArrayList<String>();
        stringList.add("錦瑟無(wú)");
        stringList.add("莊生托杜鵑");
        stringList.add("滄海月明珠有淚,藍(lán)田日暖玉生煙");
        stringList.add("滄海月明珠有淚卿泽,藍(lán)田日暖玉生煙");
        stringList.add("此情可待成追憶莺债,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然,又厉,只是當(dāng)時(shí)已惘然,九府,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶,只是當(dāng)時(shí)已惘然,覆致,只是當(dāng)時(shí)已惘然,侄旬,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶煌妈,只是當(dāng)時(shí)已惘然,儡羔,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然,璧诵,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶汰蜘,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然,之宿,只是當(dāng)時(shí)已惘然,族操,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶,只是當(dāng)時(shí)已惘然,比被,只是當(dāng)時(shí)已惘然,色难,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶等缀,只是當(dāng)時(shí)已惘然,枷莉,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然,尺迂,只是當(dāng)時(shí)已惘然");
        stringList.add("此情可待成追憶笤妙,只是當(dāng)時(shí)已惘然,,只是當(dāng)時(shí)已惘然,噪裕,只是當(dāng)時(shí)已惘然,蹲盘,只是當(dāng)時(shí)已惘然");

        mListView = (ListView) findViewById(R.id.line1);
        MyAdapter myAdapter = new MyAdapter(MainActivity.this, stringList);

        for (int i = 0; i < stringList.size(); i++) {
            if (i % 2 == 0) {
                myAdapter.addItem(i);
            } else {
                myAdapter.addSeperator(i);
            }
        }
        mListView.setAdapter(myAdapter);

        List<Map<String ,Object>> list_selct_items = new ArrayList<Map<String, Object>>();
        for (int i = 0;i<select_items.length; i++){
            Map<String,Object> list_slect_item = new HashMap<String, Object>();
            list_slect_item.put("select",select_items[i]);
            list_selct_items.add(list_slect_item);
        }
        simple = new SimpleAdapter(this,list_selct_items,R.layout.activity_item
        , new String[]{"select"}, new int[]{R.id.text2});

    }
}
  • 布局文(兩個(gè)不同布局只是背景不同而已):activity_my
<?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:padding="8dp">
    <TextView
        android:id="@+id/my_text"
        android:textSize="14sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxWidth="250dp"
        android:layout_alignParentRight="true"
        android:background="@drawable/my"/>

</RelativeLayout>

ListView:activity_main

<?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">
    <ListView
        android:id="@+id/line1"
        <!--設(shè)置透明分割線-->
        android:dividerHeight="0dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </ListView>
</RelativeLayout>

activity_item

<?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:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:padding="6dp"/>

</LinearLayout>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膳音,隨后出現(xiàn)的幾起案子召衔,更是在濱河造成了極大的恐慌,老刑警劉巖严蓖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄嫡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颗胡,警方通過(guò)查閱死者的電腦和手機(jī)毫深,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毒姨,“玉大人哑蔫,你說(shuō)我怎么就攤上這事』∧牛” “怎么了闸迷?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俘枫。 經(jīng)常有香客問(wèn)我腥沽,道長(zhǎng),這世上最難降的妖魔是什么鸠蚪? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任今阳,我火速辦了婚禮,結(jié)果婚禮上茅信,老公的妹妹穿的比我還像新娘盾舌。我一直安慰自己,他們只是感情好蘸鲸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布妖谴。 她就那樣靜靜地躺著,像睡著了一般酌摇。 火紅的嫁衣襯著肌膚如雪膝舅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天妙痹,我揣著相機(jī)與錄音铸史,去河邊找鬼。 笑死怯伊,一個(gè)胖子當(dāng)著我的面吹牛琳轿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耿芹,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崭篡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吧秕?” 一聲冷哼從身側(cè)響起琉闪,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砸彬,沒(méi)想到半個(gè)月后颠毙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斯入,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蛀蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刻两。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滴某,死狀恐怖磅摹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霎奢,我是刑警寧澤户誓,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站幕侠,受9級(jí)特大地震影響帝美,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橙依,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一证舟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窗骑,春花似錦女责、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至软族,卻和暖如春刷喜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背立砸。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工掖疮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颗祝。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓浊闪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親螺戳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搁宾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容