android仿超级课程表下课聊卡片listview抢沙发

2014-04-08    分类:Android开发Java开发原创文章编程相关      

listview是安卓应用中最常用的组件,比如好友列表,美团商家列表,微信朋友圈,超级课程表下课聊等 都有用到Listview,其中比较有意思的是卡片式的Listview,于是就来尝试着自己做一个。

先来看看下课聊的截图:




下面是自己实现的效果图,稍加修饰应该可以以假乱真




看起来感觉还不错,于是用http代理抓包把课表的json给抓下来了,给自己做测试数据使用:




至于抓包的话网上有很多安卓抓包的教程,有用adb的,也有将软件装进手机的。这些其实都可行,我个人比较喜欢代理抓包,那软件名叫Fiddler,具体使用方法不在本次技术范围内。

百度了下卡片ListView,一个比较有用的小提示网页:http://www.2cto.com/kf/201110/107462.html

新建项目后,在res/drawable文件夹新建一个 list_item_bg.xml,

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="

http://schemas.android.com/apk/res/android

" >
    <corners android:radius="6dp"/>
    <solid android:color="#fff"/>
</shape>



corners 是圆角的意思,radius是半径,顾名思义越大越圆。solid是背景颜色,可以自行定义。
看到这里已经成功一半了

现在再去主Activity里定义Listview

<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" >
    <Button 
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="获取内容"
        android:onClick="click"
        />
    <ListView 
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:id="@+id/lv"
        android:padding="20px"
        android:dividerHeight="25px"
        android:divider="@android:color/transparent" 
        ></ListView>
</LinearLayout>



为了让数据更加直观从json加载到类,定义一个bean实体对象:

package so.orion.Card;
public class Card {
    String content ;
    int readCount ;
    long issueTime ;
    
    public Card( ) {
        
    }
    
    public Card(String content, int readCount, long issueTime) {
        this.content = content;
        this.readCount = readCount;
        this.issueTime = issueTime;
    }
    
    @Override
    public String toString() {
        return "Card [content=" + content + ", readCount=" + readCount
                + ", issueTime=" + issueTime + "]";
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public int getReadCount() {
        return readCount;
    }
    public void setReadCount(int readCount) {
        this.readCount = readCount;
    }
    public long getIssueTime() {
        return issueTime;
    }
    public void setIssueTime(long issueTime) {
        this.issueTime = issueTime;
    }
}



有了listview,和数据实体,剩下的就是每一个item显示的方式了


每一个Item可以这么写,最外层用一个Linearlayout包裹,匿名发布和时间用一个相对布局RelativeLayout包裹,下面一个Textview,再最下面也是用一个相对布局,具体的直接看下面的代码:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

http://schemas.android.com/apk/res/android

"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_item_bg"
    android:orientation="vertical" >
    
    
    <RelativeLayout 
        android:layout_width="fill_parent"
        android:layout_height="60px"
        >
    <TextView 
        android:layout_margin="10px"
        android:text="匿名发布"
        android:textSize="12sp"
        android:textColor="#92000000"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        />
    
    <TextView 
        android:layout_margin="10px"
        android:id="@+id/tv_time"
        android:textSize="12sp"
        android:textColor="#75000000"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true"
        android:text="晚上7:51"
        />        
        
    </RelativeLayout>
    
    <TextView 
        android:layout_margin="10px"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="内容内容内容内容内容内容内容"
        android:id="@+id/tv_content"
        />
    
    <RelativeLayout 
        android:padding="10px"
        android:layout_width="fill_parent"
        android:layout_height="70px"
        android:background="#05000000"
        >
    
        <TextView 
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textSize="13sp"
            android:text="阅读(132)"
            android:layout_centerVertical="true"
            android:textColor="#0000ff"
            android:id="@+id/tv_readCount"
            />
        
        <Button 
            android:layout_height="60px"
            android:layout_width="100px"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:text="评论"
            android:textSize="13sp"
            android:background="@drawable/button_bg"
            android:id="@+id/bt_comment"
            android:layout_marginRight="10px"
            />
        
        <Button 
            android:layout_height="60px"
            android:layout_marginRight="10px"
            android:layout_width="100px"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/bt_comment"
            android:text="喝喝"
            android:textSize="13sp"
            android:background="@drawable/button_bg"
            android:id="@+id/bt_hehe"
            />
        
    </RelativeLayout>
</LinearLayout>


至 此,显示界面就已经实现好了,剩下的就是将json数据加载到每一个item里。java中比较常用的json解析开源项目是谷歌出的一个gson,内部 利用反射机制随时可在类和json转换。Listview的适配器得自己重写,继承BaseAdapter就可以了,代码比较多,我就直接上源码了:


package so.orion.jsoncard;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import so.orion.Card.Card;
import so.orion.NetWork.HttpDownloader;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
    protected static final int MSG_OK = 0;
    private ListView lv = null ;
    private MyAdapter myAdapter = null ; 
    private List<Card> list ;
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            if( msg.what == MSG_OK){
                lv.setAdapter(new MyAdapter());
            }
            
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        lv = (ListView) findViewById(R.id.lv);
        //lv.setAdapter(new MyAdapter());
    }
    
    public void click( View view ){
        
        
        new Thread(){
            public void run() {
                String url = "

http://172.16.111.XX/json.json

";
                String json = HttpDownloader.downloadTxt(url);
                //System.out.println(json);
                Gson gson = new Gson();
                list = gson.fromJson(json,new TypeToken<List<Card>>(){}.getType());
                System.out.println( list );
                
                
                Message msg = new Message();
                msg.what = MSG_OK ;
                handler.sendMessage(msg);
            };
        }.start();
        
    }
    
    public void init( ){
        
//        Random random = new Random();
//        for( int i = 0 ; i <15 ; i ++){
//            Card card = new Card("内容内容内容内容内容内容内容内容"+i, "阅读("+random.nextInt(1036)+")" , System.currentTimeMillis());
//            System.out.println(card);
//            list.add(card);
            
//        }
    }
    public String getTime( long now ){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date(now));
        return date;
    }
    
    
    public class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            // TODO 自动生成的方法存根
            return list.size();
        }
        @Override
        public Object getItem(int position) {
            // TODO 自动生成的方法存根
            return null;
        }
        @Override
        public long getItemId(int position) {
            // TODO 自动生成的方法存根
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO 自动生成的方法存根
            Card card = list.get(position);
            
            View view = View.inflate(MainActivity.this, R.layout.list_item, null);
            
            TextView tv_readCount = (TextView) view.findViewById(R.id.tv_readCount);
            TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
            TextView tv_time = (TextView) view.findViewById(R.id.tv_time);
            
            tv_content.setText( card.getContent());
            tv_readCount.setText( "阅读("+card.getReadCount()+")");
            tv_time.setText( getTime( card.getIssueTime() ) );
            
            return view;
        }
        
    }
}



效果已经出来了:


转载请注明:乔布尸 » android仿超级课程表下课聊卡片listview

继续查看有关 的文章

相关文章

我来说说

*

*

取消