Android开发学习之微信公众号界面

            接着上一篇博客中的卡片式设计,我们继续从微信中寻找一些线索,我们首先来看这样一个界面,这是微信中默认的一个公众号,主要是发布腾讯新闻上的最新动态,我们可以看出,它采用了类似于我们在上一篇文章中采用的卡片式布局。那么,今天就让我们一起来做这样一个界面吧!


           第一步,当然是创建layout_item的布局,即列表项目的布局,这里直接给出布局代码,代码并不复杂,只是属性设置较为繁琐。

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”  
  3.     android:layout_width=“match_parent”  
  4.     android:layout_height=“match_parent”  
  5.     android:background=“@drawable/radius_bg”  
  6.     android:paddingBottom=“10dp”  
  7.     android:orientation=“vertical”>  
  8.     <ImageView  
  9.         android:id=“@+id/News_Pic”  
  10.         android:layout_width=“wrap_content”  
  11.         android:layout_height=“100dp”  
  12.         android:layout_alignParentLeft=“true”  
  13.         android:layout_alignParentRight=“true”  
  14.         android:layout_alignParentTop=“true”  
  15.         android:layout_marginLeft=“10dp”  
  16.         android:layout_marginRight=“10dp”  
  17.         android:layout_marginTop=“10dp”  
  18.         android:contentDescription=“@string/Description”  
  19.         android:scaleType=“center” />  
  20.     <TextView  
  21.         android:id=“@+id/News_Title”  
  22.         android:layout_width=“wrap_content”  
  23.         android:layout_height=“30dp”  
  24.         android:layout_alignLeft=“@+id/News_Pic”  
  25.         android:layout_alignRight=“@+id/News_Pic”  
  26.         android:layout_below=“@+id/News_Pic”  
  27.         android:background=“#707070”  
  28.         android:gravity=“left|center”  
  29.         android:textColor=“#ffffff”  
  30.         android:contentDescription=“@string/Description”  
  31.         android:textIsSelectable=“true” />  
  32.   
  33.    <TextView  
  34.        android:id=“@+id/News_Title1”  
  35.        android:layout_width=“200dp”  
  36.        android:layout_height=“45dp”  
  37.        android:layout_alignLeft=“@+id/News_Title”  
  38.        android:layout_alignRight=“@+id/News_Title2”  
  39.        android:layout_below=“@+id/News_Title”  
  40.        android:layout_marginTop=“10dp”  
  41.        android:gravity=“center”  
  42.        android:textIsSelectable=“true” />  
  43.   
  44.     <ImageView  
  45.         android:id=“@+id/News_Pic1”  
  46.         android:layout_width=“45dp”  
  47.         android:layout_height=“45dp”  
  48.         android:layout_alignRight=“@+id/News_Title”  
  49.         android:layout_alignTop=“@+id/News_Title1”  
  50.         android:contentDescription=“@string/Description”  
  51.         android:scaleType=“center” />  
  52.   
  53.     <TextView  
  54.         android:id=“@+id/News_Title2”  
  55.         android:layout_width=“200dp”  
  56.         android:layout_height=“45dp”  
  57.         android:layout_alignParentLeft=“true”  
  58.         android:layout_below=“@+id/News_Title1”  
  59.         android:layout_margin=“10dp”  
  60.         android:layout_toLeftOf=“@+id/News_Pic1”  
  61.         android:gravity=“center”  
  62.         android:textIsSelectable=“true” />  
  63.   
  64.     <ImageView  
  65.         android:id=“@+id/News_Pic2”  
  66.         android:layout_width=“45dp”  
  67.         android:layout_height=“45dp”  
  68.         android:layout_alignTop=“@+id/News_Title2”  
  69.         android:layout_toRightOf=“@+id/News_Title2”  
  70.         android:contentDescription=“@string/Description”  
  71.         android:scaleType=“center” />  
  72.   
  73.     <TextView  
  74.         android:id=“@+id/News_Title3”  
  75.         android:layout_width=“200dp”  
  76.         android:layout_height=“45dp”  
  77.         android:layout_alignLeft=“@+id/News_Title1”  
  78.         android:layout_alignRight=“@+id/News_Title2”  
  79.         android:layout_below=“@+id/News_Title2”  
  80.         android:gravity=“center”  
  81.         android:textIsSelectable=“true” />  
  82.   
  83.     <ImageView  
  84.         android:id=“@+id/News_Pic3”  
  85.         android:layout_width=“45dp”  
  86.         android:layout_height=“45dp”  
  87.         android:layout_alignRight=“@+id/News_Pic2”  
  88.         android:layout_alignTop=“@+id/News_Title3”  
  89.         android:layout_toRightOf=“@+id/News_Title2”  
  90.         android:contentDescription=“@string/Description”  
  91.         android:scaleType=“center” />  
  92.   
  93. </RelativeLayout>  
<?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:background="@drawable/radius_bg"
    android:paddingBottom="10dp"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/News_Pic"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:contentDescription="@string/Description"
        android:scaleType="center" />
    <TextView
        android:id="@+id/News_Title"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignLeft="@+id/News_Pic"
        android:layout_alignRight="@+id/News_Pic"
        android:layout_below="@+id/News_Pic"
        android:background="#707070"
        android:gravity="left|center"
        android:textColor="#ffffff"
        android:contentDescription="@string/Description"
        android:textIsSelectable="true" />

   <TextView
       android:id="@+id/News_Title1"
       android:layout_width="200dp"
       android:layout_height="45dp"
       android:layout_alignLeft="@+id/News_Title"
       android:layout_alignRight="@+id/News_Title2"
       android:layout_below="@+id/News_Title"
       android:layout_marginTop="10dp"
       android:gravity="center"
       android:textIsSelectable="true" />

    <ImageView
        android:id="@+id/News_Pic1"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_alignRight="@+id/News_Title"
        android:layout_alignTop="@+id/News_Title1"
        android:contentDescription="@string/Description"
        android:scaleType="center" />

    <TextView
        android:id="@+id/News_Title2"
        android:layout_width="200dp"
        android:layout_height="45dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/News_Title1"
        android:layout_margin="10dp"
        android:layout_toLeftOf="@+id/News_Pic1"
        android:gravity="center"
        android:textIsSelectable="true" />

    <ImageView
        android:id="@+id/News_Pic2"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_alignTop="@+id/News_Title2"
        android:layout_toRightOf="@+id/News_Title2"
        android:contentDescription="@string/Description"
        android:scaleType="center" />

    <TextView
        android:id="@+id/News_Title3"
        android:layout_width="200dp"
        android:layout_height="45dp"
        android:layout_alignLeft="@+id/News_Title1"
        android:layout_alignRight="@+id/News_Title2"
        android:layout_below="@+id/News_Title2"
        android:gravity="center"
        android:textIsSelectable="true" />

    <ImageView
        android:id="@+id/News_Pic3"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_alignRight="@+id/News_Pic2"
        android:layout_alignTop="@+id/News_Title3"
        android:layout_toRightOf="@+id/News_Title2"
        android:contentDescription="@string/Description"
        android:scaleType="center" />

</RelativeLayout>

                第二步,我们需要为卡片编写一个圆角的形状radius_bg。代码和上一篇文章是一样的 :

  1. <?xml version=“1.0” encoding=“utf-8”?>  
  2. <shape xmlns:android=”http://schemas.android.com/apk/res/android” >  
  3.     <solid android:color=”#ffffff”/>  
  4.     <corners android:radius=”10dp”/>  
  5. </shape>  
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#ffffff"/>
    <corners android:radius="10dp"/>
</shape>
           第三步,卡片类,这里卡片类共有两个,BaseCard为基类,Card为继承自BaseCard的一个类:

  1. /* 
  2.  * 仿微信公众平台消息界面 
  3.  * @作者:秦元培 
  4.  *  
  5.  */  
  6. package com.Android.WeChatCard;  
  7.   
  8. public class BaseCard   
  9. {  
  10.    private int mDrawable;  
  11.   
  12.    private String mDescription;  
  13.   
  14.    public BaseCard(int Drawable,String Description)  
  15.    {  
  16.        this.mDrawable=Drawable;  
  17.        this.mDescription=Description;  
  18.    }  
  19.      
  20.    public int getDrawable()   
  21.    {  
  22.     return mDrawable;  
  23.    }  
  24.      
  25.    public void setDrawable(int mDrawable)   
  26.    {  
  27.     this.mDrawable = mDrawable;  
  28.    }  
  29.      
  30.    public String getDescription()   
  31.    {  
  32.     return mDescription;  
  33.    }  
  34.      
  35.    public void setDescription(String mDescription)   
  36.    {  
  37.     this.mDescription = mDescription;  
  38.    }  
  39.      
  40. }  
/*
 * 仿微信公众平台消息界面
 * @作者:秦元培
 * 
 */
package com.Android.WeChatCard;

public class BaseCard 
{
   private int mDrawable;

   private String mDescription;

   public BaseCard(int Drawable,String Description)
   {
       this.mDrawable=Drawable;
       this.mDescription=Description;
   }

   public int getDrawable() 
   {
    return mDrawable;
   }

   public void setDrawable(int mDrawable) 
   {
    this.mDrawable = mDrawable;
   }

   public String getDescription() 
   {
    return mDescription;
   }

   public void setDescription(String mDescription) 
   {
    this.mDescription = mDescription;
   }

}

  1. package com.Android.WeChatCard;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class Card extends BaseCard {  
  7.   
  8.   
  9.     private List<BaseCard> mSubCards;  
  10.   
  11.     public Card(int Drawable, String Description)   
  12.     {  
  13.         super(Drawable, Description);  
  14.         mSubCards=new ArrayList<BaseCard>();  
  15.     }  
  16.       
  17.     public void AppendCard(BaseCard mCard)  
  18.     {  
  19.         mSubCards.add(mCard);  
  20.     }  
  21.       
  22.     public List<BaseCard> getSubCards()   
  23.     {  
  24.         return mSubCards;  
  25.     }  
  26.   
  27. }  
package com.Android.WeChatCard;

import java.util.ArrayList;
import java.util.List;

public class Card extends BaseCard {


    private List<BaseCard> mSubCards;

    public Card(int Drawable, String Description) 
    {
        super(Drawable, Description);
        mSubCards=new ArrayList<BaseCard>();
    }

    public void AppendCard(BaseCard mCard)
    {
        mSubCards.add(mCard);
    }

    public List<BaseCard> getSubCards() 
    {
        return mSubCards;
    }

}

           第四步,我们来编写自定义适配器类CardAdapter:

  1. package com.Android.WeChatCard;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.ImageView;  
  11. import android.widget.TextView;  
  12.   
  13. public class CardAdapter extends BaseAdapter {  
  14.   
  15.     private Context mContext;  
  16.     private List<Card> mCards;  
  17.     public CardAdapter(Context mContext,List<Card> mCards)  
  18.     {  
  19.         this.mContext=mContext;  
  20.         this.mCards=mCards;  
  21.     }  
  22.     @Override  
  23.     public int getCount()   
  24.     {  
  25.         return mCards.size();  
  26.     }  
  27.   
  28.     @Override  
  29.     public Object getItem(int Index)   
  30.     {  
  31.         return mCards.get(Index);  
  32.     }  
  33.   
  34.     @Override  
  35.     public long getItemId(int Index)   
  36.     {  
  37.         return Index;  
  38.     }  
  39.   
  40.     @Override  
  41.     public View getView(int Index, View mView, ViewGroup mParent)   
  42.     {  
  43.              mView=LayoutInflater.from(mContext).inflate(R.layout.layout_item, null);  
  44.              //头条消息  
  45.              ImageView News_Pic=(ImageView)mView.findViewById(R.id.News_Pic);  
  46.              News_Pic.setImageResource(mCards.get(Index).getDrawable());  
  47.              TextView News_Title=(TextView)mView.findViewById(R.id.News_Title);  
  48.              News_Title.setText(mCards.get(Index).getDescription());  
  49.              //消息一  
  50.              ImageView News_Pic1=(ImageView)mView.findViewById(R.id.News_Pic1);  
  51.              News_Pic1.setImageResource(mCards.get(Index).getSubCards().get(0).getDrawable());  
  52.              TextView News_Title1=(TextView)mView.findViewById(R.id.News_Title1);  
  53.              News_Title1.setText(mCards.get(Index).getSubCards().get(0).getDescription());  
  54.              //消息二  
  55.              ImageView News_Pic2=(ImageView)mView.findViewById(R.id.News_Pic2);  
  56.              News_Pic2.setImageResource(mCards.get(Index).getSubCards().get(1).getDrawable());  
  57.              TextView News_Title2=(TextView)mView.findViewById(R.id.News_Title2);  
  58.              News_Title2.setText(mCards.get(Index).getSubCards().get(1).getDescription());  
  59.              //消息三  
  60.             ImageView News_Pic3=(ImageView)mView.findViewById(R.id.News_Pic3);  
  61.             News_Pic3.setImageResource(mCards.get(Index).getSubCards().get(2).getDrawable());  
  62.             TextView News_Title3=(TextView)mView.findViewById(R.id.News_Title3);  
  63.             News_Title3.setText(mCards.get(Index).getSubCards().get(2).getDescription());  
  64.         return mView;  
  65.     }  
  66. }  
package com.Android.WeChatCard;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CardAdapter extends BaseAdapter {

    private Context mContext;
    private List<Card> mCards;
    public CardAdapter(Context mContext,List<Card> mCards)
    {
        this.mContext=mContext;
        this.mCards=mCards;
    }
    @Override
    public int getCount() 
    {
        return mCards.size();
    }

    @Override
    public Object getItem(int Index) 
    {
        return mCards.get(Index);
    }

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

    @Override
    public View getView(int Index, View mView, ViewGroup mParent) 
    {
             mView=LayoutInflater.from(mContext).inflate(R.layout.layout_item, null);
             //头条消息
             ImageView News_Pic=(ImageView)mView.findViewById(R.id.News_Pic);
             News_Pic.setImageResource(mCards.get(Index).getDrawable());
             TextView News_Title=(TextView)mView.findViewById(R.id.News_Title);
             News_Title.setText(mCards.get(Index).getDescription());
             //消息一
             ImageView News_Pic1=(ImageView)mView.findViewById(R.id.News_Pic1);
             News_Pic1.setImageResource(mCards.get(Index).getSubCards().get(0).getDrawable());
             TextView News_Title1=(TextView)mView.findViewById(R.id.News_Title1);
             News_Title1.setText(mCards.get(Index).getSubCards().get(0).getDescription());
             //消息二
             ImageView News_Pic2=(ImageView)mView.findViewById(R.id.News_Pic2);
             News_Pic2.setImageResource(mCards.get(Index).getSubCards().get(1).getDrawable());
             TextView News_Title2=(TextView)mView.findViewById(R.id.News_Title2);
             News_Title2.setText(mCards.get(Index).getSubCards().get(1).getDescription());
             //消息三
            ImageView News_Pic3=(ImageView)mView.findViewById(R.id.News_Pic3);
            News_Pic3.setImageResource(mCards.get(Index).getSubCards().get(2).getDrawable());
            TextView News_Title3=(TextView)mView.findViewById(R.id.News_Title3);
            News_Title3.setText(mCards.get(Index).getSubCards().get(2).getDescription());
        return mView;
    }
}

         由于每个头条消息下有三个消息,因此我们需要在构造Card的时候,使用AppendCard()方法添加三个BaseCard供这里绑定使用,这一点在使用的时候需要注意。

         第五步,主界面的布局和相关逻辑:

  1. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”  
  2.     xmlns:tools=“http://schemas.android.com/tools”  
  3.     android:layout_width=“match_parent”  
  4.     android:layout_height=“match_parent”  
  5.     android:orientation=“vertical”  
  6.     tools:context=“.MainActivity” >  
  7.     <TextView  
  8.         android:layout_width=“match_parent”  
  9.         android:layout_height=“40dp”  
  10.         android:background=“@drawable/tab_bg”  
  11.         android:gravity=“center”  
  12.         android:textColor=“#ffffff”  
  13.         android:textSize=“18sp”  
  14.         android:text=“@string/Title” />  
  15.     <ListView  
  16.         android:id=“@+id/ListView”  
  17.         android:layout_width=“match_parent”  
  18.         android:layout_height=“wrap_content”  
  19.         android:divider=“@null”  
  20.         android:dividerHeight=“30dp”  
  21.         android:paddingLeft=“20dp”  
  22.         android:paddingRight=“20dp”  
  23.         android:scrollbarStyle=“outsideOverlay” >  
  24.     </ListView>  
  25. </LinearLayout>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@drawable/tab_bg"
        android:gravity="center"
        android:textColor="#ffffff"
        android:textSize="18sp"
        android:text="@string/Title" />
    <ListView
        android:id="@+id/ListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        android:dividerHeight="30dp"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:scrollbarStyle="outsideOverlay" >
    </ListView>
</LinearLayout>

  1. /* 
  2.  * 仿微信公众号消息界面 
  3.  * 作者:秦元培 
  4.  * 时间:2013年12月30日 
  5.  * 这个程序的原理是重写适配器,然后绑定列表。我觉得微信的实现原理应该使用的ScrollView吧 
  6.  * 这个程序目前的缺点有: 
  7.  * 1、Card和BaseCard两个类还需要完善 
  8.  * 2、滚动条不是在屏幕边缘,而是在卡片边缘,也就是说这个方法本身有问题.[解决方法:scrollbarStyle=”outsideOverlay] 
  9.  * 3、两个卡片间的间距问题无法解决,尝试着用了divider和dividerHeight属性,发现有一定的色差[解决方法:android:divider=”@null”] 
  10.  * 4、如果要实现微信的那个通知,需要增加一个布局、一个类型判断 
  11.  * 5、当图片较多时解决内存消耗的问题 
  12.  */  
  13. package com.Android.WeChatCard;  
  14.   
  15. import java.util.ArrayList;  
  16. import java.util.List;  
  17.   
  18. import android.os.Bundle;  
  19. import android.app.Activity;  
  20. import android.view.Menu;  
  21. import android.view.Window;  
  22. import android.widget.ListView;  
  23.   
  24. public class MainActivity extends Activity {  
  25.   
  26.     private ListView mListView;  
  27.     private CardAdapter mAdapter;  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  32.         setContentView(R.layout.layout_main);  
  33.         mListView=(ListView)findViewById(R.id.ListView);  
  34.         mAdapter=new CardAdapter(this,getItems());  
  35.         mListView.setAdapter(mAdapter);   
  36.     }  
  37.   
  38.     private List<Card> getItems()   
  39.     {  
  40.         List<Card> mCards=new ArrayList<Card>();  
  41.         //第一个卡片  
  42.         Card mCard=new Card(R.drawable.pic_0,“这是第一个头条信息”);  
  43.         BaseCard mBaseCard1=new BaseCard(R.drawable.pic_0,“这是第一个文本消息”);  
  44.         BaseCard mBaseCard2=new BaseCard(R.drawable.pic_0,“这是第一个文本消息”);  
  45.         BaseCard mBaseCard3=new BaseCard(R.drawable.pic_0,“这是第一个文本消息”);  
  46.         mCard.AppendCard(mBaseCard1);  
  47.         mCard.AppendCard(mBaseCard2);  
  48.         mCard.AppendCard(mBaseCard3);  
  49.         //添加卡片  
  50.         mCards.add(mCard);  
  51.   
  52.         //第二个卡片  
  53.         mCard=new Card(R.drawable.pic_1,“这是第二个头条信息”);  
  54.         mBaseCard1=new BaseCard(R.drawable.pic_1,“这是第一个文本消息”);  
  55.         mBaseCard2=new BaseCard(R.drawable.pic_1,“这是第一个文本消息”);  
  56.         mBaseCard3=new BaseCard(R.drawable.pic_1,“这是第一个文本消息”);  
  57.         mCard.AppendCard(mBaseCard1);  
  58.         mCard.AppendCard(mBaseCard2);  
  59.         mCard.AppendCard(mBaseCard3);  
  60.         //添加卡片  
  61.         mCards.add(mCard);  
  62.   
  63.         //第三个卡片  
  64.         mCard=new Card(R.drawable.pic_2,“这是第三个头条信息”);  
  65.         mBaseCard1=new BaseCard(R.drawable.pic_2,“这是第一个文本消息”);  
  66.         mBaseCard2=new BaseCard(R.drawable.pic_2,“这是第一个文本消息”);  
  67.         mBaseCard3=new BaseCard(R.drawable.pic_2,“这是第一个文本消息”);  
  68.         mCard.AppendCard(mBaseCard1);  
  69.         mCard.AppendCard(mBaseCard2);  
  70.         mCard.AppendCard(mBaseCard3);  
  71.         //添加卡片  
  72.         mCards.add(mCard);  
  73.           
  74.           
  75.         //第四个卡片  
  76.         mCard=new Card(R.drawable.pic_3,“这是第四个头条信息”);  
  77.         mBaseCard1=new BaseCard(R.drawable.pic_3,“这是第一个文本消息”);  
  78.         mBaseCard2=new BaseCard(R.drawable.pic_3,“这是第一个文本消息”);  
  79.         mBaseCard3=new BaseCard(R.drawable.pic_3,“这是第一个文本消息”);  
  80.         mCard.AppendCard(mBaseCard1);  
  81.         mCard.AppendCard(mBaseCard2);  
  82.         mCard.AppendCard(mBaseCard3);  
  83.         //添加卡片  
  84.         mCards.add(mCard);  
  85.           
  86.         return mCards;  
  87.     }  
  88.   
  89.     @Override  
  90.     public boolean onCreateOptionsMenu(Menu menu) {  
  91.         // Inflate the menu; this adds items to the action bar if it is present.  
  92.         getMenuInflater().inflate(R.menu.main, menu);  
  93.         return true;  
  94.     }  
  95.   
  96. }  
/*
 * 仿微信公众号消息界面
 * 作者:秦元培
 * 时间:2013年12月30日
 * 这个程序的原理是重写适配器,然后绑定列表。我觉得微信的实现原理应该使用的ScrollView吧
 * 这个程序目前的缺点有:
 * 1、Card和BaseCard两个类还需要完善
 * 2、滚动条不是在屏幕边缘,而是在卡片边缘,也就是说这个方法本身有问题.[解决方法:scrollbarStyle="outsideOverlay]
 * 3、两个卡片间的间距问题无法解决,尝试着用了divider和dividerHeight属性,发现有一定的色差[解决方法:android:divider="@null"]
 * 4、如果要实现微信的那个通知,需要增加一个布局、一个类型判断
 * 5、当图片较多时解决内存消耗的问题
 */
package com.Android.WeChatCard;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.widget.ListView;

public class MainActivity extends Activity {

    private ListView mListView;
    private CardAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.layout_main);
        mListView=(ListView)findViewById(R.id.ListView);
        mAdapter=new CardAdapter(this,getItems());
        mListView.setAdapter(mAdapter); 
    }

    private List<Card> getItems() 
    {
        List<Card> mCards=new ArrayList<Card>();
        //第一个卡片
        Card mCard=new Card(R.drawable.pic_0,"这是第一个头条信息");
        BaseCard mBaseCard1=new BaseCard(R.drawable.pic_0,"这是第一个文本消息");
        BaseCard mBaseCard2=new BaseCard(R.drawable.pic_0,"这是第一个文本消息");
        BaseCard mBaseCard3=new BaseCard(R.drawable.pic_0,"这是第一个文本消息");
        mCard.AppendCard(mBaseCard1);
        mCard.AppendCard(mBaseCard2);
        mCard.AppendCard(mBaseCard3);
        //添加卡片
        mCards.add(mCard);

        //第二个卡片
        mCard=new Card(R.drawable.pic_1,"这是第二个头条信息");
        mBaseCard1=new BaseCard(R.drawable.pic_1,"这是第一个文本消息");
        mBaseCard2=new BaseCard(R.drawable.pic_1,"这是第一个文本消息");
        mBaseCard3=new BaseCard(R.drawable.pic_1,"这是第一个文本消息");
        mCard.AppendCard(mBaseCard1);
        mCard.AppendCard(mBaseCard2);
        mCard.AppendCard(mBaseCard3);
        //添加卡片
        mCards.add(mCard);

        //第三个卡片
        mCard=new Card(R.drawable.pic_2,"这是第三个头条信息");
        mBaseCard1=new BaseCard(R.drawable.pic_2,"这是第一个文本消息");
        mBaseCard2=new BaseCard(R.drawable.pic_2,"这是第一个文本消息");
        mBaseCard3=new BaseCard(R.drawable.pic_2,"这是第一个文本消息");
        mCard.AppendCard(mBaseCard1);
        mCard.AppendCard(mBaseCard2);
        mCard.AppendCard(mBaseCard3);
        //添加卡片
        mCards.add(mCard);


        //第四个卡片
        mCard=new Card(R.drawable.pic_3,"这是第四个头条信息");
        mBaseCard1=new BaseCard(R.drawable.pic_3,"这是第一个文本消息");
        mBaseCard2=new BaseCard(R.drawable.pic_3,"这是第一个文本消息");
        mBaseCard3=new BaseCard(R.drawable.pic_3,"这是第一个文本消息");
        mCard.AppendCard(mBaseCard1);
        mCard.AppendCard(mBaseCard2);
        mCard.AppendCard(mBaseCard3);
        //添加卡片
        mCards.add(mCard);

        return mCards;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

                最终运行效果如图所示:


       至于微信中的消息发送时间的实现,大家可以参考这篇文章:

       http://blog.csdn.net/qinyuanpei/article/details/17727767

Spring Boot 是一种用于开发 Java 应用程序的框架,它简化了传统 Java 开发的繁琐过程,使开发人员可以更快速地构建高效的应用程序。UniApp 是一个跨平台的开发框架,它可以同时开发 Android、iOS 和 Web 应用程序,极大地提高了开发效率和项目的可维护性。 微信公众号开发是指基于微信平台的应用程序开发,通过微信公众号,我们可以实现与用户的互动交流、推送消息、提供各种服务等。 在使用 Spring Boot 和 UniApp 进行微信公众号开发时,可以采用前后端分离的开发模式。前端使用 UniApp 进行界面设计和用户交互的开发,后端使用 Spring Boot 进行业务逻辑的处理和数据的存储。 首先,我们需要在微信公众平台注册一个开发者账号,获取到相应的公众号信息和接口权限。 接下来,前端开发人员可以使用 UniApp 进行公众号界面设计和交互逻辑的编写。UniApp 提供了丰富的组件和模板,可以方便地实现各种界面效果,并且可以使用 Vue.js 进行数据的绑定与处理。 后端开发人员使用 Spring Boot 进行接口的开发和业务逻辑的处理。可以使用 Spring Boot 提供的丰富的功能和插件来简化开发,比如使用 Spring Data JPA 来操作数据库,使用 Spring Security 来实现用户认证与权限控制等。 最后,前后端通过接口进行数据的传输和交互,前端将用户的操作发送到后端进行处理,并将后端返回的数据展示给用户。 通过采用 Spring Boot 和 UniApp 进行微信公众号开发,可以充分发挥两者的优势,快速构建高效的应用程序,实现与用户的互动和服务。同时,由于使用的是跨平台的开发框架,可以方便地同时开发多个平台的应用程序,提高开发效率和项目的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值