QQ好友列表
內(nèi)容相當(dāng)豐富,你品娱两,你細(xì)品]航场!
預(yù)期效果:
應(yīng)為要加圖片視圖和文本框十兢,并且還有一個(gè)簡(jiǎn)單的布局趣竣,所以原來的listview已然是不能滿足了摇庙,so自定義一個(gè)繼承于listview的控件
自定義listview控件:
public class PXDListView extends ListView {
public PXDListView(Context context) {
super(context);
initData();
}
public PXDListView(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
private void initData(){
//設(shè)置適配器
setAdapter(new MyAdapter());
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return DataManager.sharedManager
.getDataSource()
.size();
}
@Override
public Object getItem(int position) {
return DataManager.sharedManager
.getDataSource()
.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//創(chuàng)建模型
FriendModel model=DataManager.sharedManager.getDataSource().get(position);
//創(chuàng)建對(duì)象
FritendItem item=new FritendItem(getContext(),model);
return item.rootView;
}
}
<swu.xujiangtao.day_13qqlist.PXDListView
android:id="@+id/lv_qqList"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
創(chuàng)建layout布局每一行放入具體樣式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<swu.xujiangtao.day_13qqlist.CirieImagaView
android:layout_width="100dp"
android:layout_height="100dp"
android:tag="@string/iconTag"
android:layout_marginLeft="20dp"
android:scaleType="fitXY"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="@string/nameTag"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:textColor="#000"
android:textSize="30dp"/>
</LinearLayout>
//創(chuàng)建圓形圖片
public class CirieImagaView extends AppCompatImageView {
public CirieImagaView(Context context) {
super(context);
}
public CirieImagaView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void draw(Canvas canvas) {
//1.創(chuàng)建需要裁剪的路徑
Path path=new Path();
path.addCircle(getPivotX(),getPivotY(),getWidth()/2, Path.Direction.CCW);
//2.裁剪
canvas.clipPath(path);
super.draw(canvas);
}
}
可以看到mainActivity沒有任何類容,是應(yīng)為使用了封裝遥缕,打包一類的函數(shù)卫袒,不僅使代碼簡(jiǎn)潔,還降低了耦合性
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
管理數(shù)據(jù):
/**
* 管理數(shù)據(jù):
* 存儲(chǔ)解析后的數(shù)據(jù)
* 加載數(shù)據(jù)
* 保存數(shù)據(jù)
* 更改數(shù)據(jù)
*
* 單力設(shè)計(jì)模式
* 1.禁用構(gòu)造方法
* 2.定義單例對(duì)象 static final
*/
public class DataManager {
//保存所有數(shù)據(jù)
private ArrayList<FriendModel> dataSource;
//單例對(duì)象
public static final DataManager sharedManager=new DataManager();
//禁用構(gòu)造方法
private DataManager(){
loadData();
}
//加載數(shù)據(jù)
private void loadData(){
//用自己創(chuàng)建假數(shù)據(jù)的方式 記載所有數(shù)據(jù)
dataSource=DataUtils.loadCustomData();
}
public ArrayList<FriendModel> getDataSource() {
return dataSource;
}
}
數(shù)據(jù)處理工具:
/**
*類(靜態(tài))方法:如果只關(guān)心這個(gè)方法本身单匣,如工具類里面的方法
* 對(duì)象方法:如果有數(shù)據(jù)需要對(duì)象存儲(chǔ)
*/
public class DataUtils {
//自己構(gòu)造數(shù)據(jù)
public static ArrayList<FriendModel> loadCustomData(){
ArrayList<FriendModel> friendModels=new ArrayList<>();
for (int i=0;i<30;i++){
//
FriendModel model=new FriendModel(R.drawable.icon,"android");
//保存
friendModels.add(model);
}
return friendModels;
}
//本地加載(文件)
Object loadFromFile(){
return null;
}
//數(shù)據(jù)庫(kù)加載
Object loadFromSQL(){
return null;
}
//網(wǎng)絡(luò)加載
Object loadFromServer(){
return null;
}
}
好友處理:
public class FriendModel {
public int iconID;//頭像資源id
public String name;//姓名
public FriendModel(int iconID, String name) {
this.iconID = iconID;
this.name = name;
}
}
public class FritendItem {
//Item模型
private FriendModel model;
//Item視圖
public View rootView;
private Context context;
//構(gòu)造方法,創(chuàng)建的同時(shí)需要傳遞這個(gè)Item對(duì)應(yīng)的數(shù)據(jù)模型
public FritendItem(Context context,FriendModel model){
this.model=model;
this.context=context;
initView();
}
private void initView(){
//獲取對(duì)應(yīng)的容器視圖
ViewGroup v = (ViewGroup) View.inflate(
context,
R.layout.layout_qq,
null);
//將數(shù)據(jù)顯示到這個(gè)容器對(duì)應(yīng)的空間上
//獲取子視圖
ImageView icon=v.findViewWithTag(context.getResources().getString(R.string.iconTag));
TextView name=v.findViewWithTag(context.getResources().getString(R.string.nameTag));
//顯示數(shù)據(jù)
icon.setImageResource(model.iconID);
name.setText(model.name);
rootView=v;
}
}
結(jié)果展示(和預(yù)期有差距)