上拉刷新列表(自定义列表项布局)的实现

listView是应用非常广泛的一个控件,当我们要用ListView来自定义列表项,并且从服务器下载数据更新到ListView时,我们通常会新开一个线程进行异步下载,效果图如下:
拉到底时会显示正在加载

实现的代码如下:



/**
 *  本类用来显示Vip卡的信息
 */
public class ActyMyCard extends Activity implements AbsListView.OnScrollListener{
    private ListView listview;
    private Thread mThread;
    LinearLayout loadingLayout;         //lsitview的页脚布局
    private ListViewAdapter adapter ;
    private ProgressBar progressBar;
    private ImageButton back;
    /**
     * 设置布局显示属性
     */
    private LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    /**
     * 设置布局显示目标最大化属性
     */
    private LinearLayout.LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT);

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

        init();


    }

    private void init() {

        adapter = new ListViewAdapter(ActyMyCard.this, getData());//设置适配器

        listview = (ListView) findViewById(R.id.list_card);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        progressBar = new ProgressBar(this);
        progressBar.setPadding(0,0,15,0);
        layout.addView(progressBar, mLayoutParams);
        TextView tv = new TextView(this);
        tv.setText("加载中...");
        tv.setGravity(Gravity.CENTER_VERTICAL);
        layout.addView(tv, FFlayoutParams);
        layout.setGravity(Gravity.CENTER);

        //设置listview页脚layout
        loadingLayout = new LinearLayout(this);
        loadingLayout.addView(layout,mLayoutParams);
        loadingLayout.setGravity(Gravity.CENTER);

        listview.addFooterView(loadingLayout);
        listview.setAdapter(adapter);   //设置适配器
        listview.setOnScrollListener(this);

        back = (ImageButton) findViewById(R.id.back_card);
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if(firstVisibleItem+visibleItemCount == totalItemCount){
            //开线程下载网络数据
            if(mThread == null || !mThread.isAlive()){
                mThread = new Thread(){
                    @Override
                    public void run() {
                        //TODO: 这里请求服务器获取卡包信息,然后将信息封装成list,卡包信息封装在类CardMsg中
                        try{
                            Thread.sleep(4000);

                       }catch (InterruptedException e ){
                            e.printStackTrace();
                       }
                        Message message = new Message();
                        message.what = Config.REFLASHLISTVIEW;
                        handler.sendMessage(message);
                    }
                };
                mThread.start();
            }
        }
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case Config.REFLASHLISTVIEW:
                    if(adapter.count <=100){
                        adapter.count+=10;
                        int currentPage = adapter.count / 10;
                        //TODO:这里是把上面封装的list传入adapter
                        adapter.addList(getData());
Toast.makeText(getApplicationContext(), "第" + currentPage + "页", Toast.LENGTH_LONG).show();
                    } else {
                        listview.removeFooterView(loadingLayout);
                    }

                    adapter.notifyDataSetChanged();
                    break;
                default:
                    break;
            }
        }
    };
    /*
            这个方法是测试用的
     */
    public List<Map<String,Object>> getData() {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for(int i = 0;i< 10;i++){
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("cardmsg",new CardMsg("name","location",i));
            list.add(map);
        }

        return list;
    }
}




class ListViewAdapter extends BaseAdapter {
    int count = 10;
    LayoutInflater listContainer;
    private List<Map<String, Object>> listItems;
    private Context context;

    public final class ListItemView  {  //自定义控件集合,即列表项的内容控件
        public TextView companyName, location;
        public ImageView cardImage;

    }


    public ListViewAdapter(Context context,List<Map<String, Object>> listItems){
        this.context = context;
        this.listContainer = LayoutInflater.from(context);

        this.listItems = listItems;

    }
    /*
        向listItems中添加新的数据
     */
    public void addList(List<Map<String,Object>> newList) {
        listItems.addAll(newList);
    }
    @Override
    public int getCount(){
        return listItems.size();
    }

    @Override
    public Object getItem(int pos) {
        return listItems.get(pos);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    /*
    * 自宝义列表项时,最重要的就是实现getView方法
    */
    @Override
    public View getView(int position, View v, ViewGroup parent) {
        ListItemView listItemView = null;

        if(v==null){
            listItemView = new ListItemView();
            v = listContainer.inflate(R.layout.list_cell_my_card,null);
            //获取控件对象
            listItemView.companyName = (TextView) v.findViewById(R.id.com_location_list_cus);
            listItemView.location = (TextView) v.findViewById(R.id.com_location_list_cus);
            listItemView.cardImage = (ImageView) v.findViewById(R.id.card_image_list_cus);
            v.setTag(listItemView);
        } else {
            listItemView = (ListItemView) v.getTag();
        }

        //TODO: 获取数据,将listItems里的CardMsg更新到控件中,目前这里是用了三个控件
        listItemView.companyName.setText(((CardMsg) listItems.get(position).get("cardmsg")).getCompanyName()+position);
        listItemView.location.setText(((CardMsg) listItems.get(position).get("cardmsg")).getLocation()+position);


        return v;
    }
}

对应的布局文件 layout_my_card 如下

<?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:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="90dp"
        android:gravity="center_vertical"
        android:background="#fff"
        android:orientation="horizontal">
        <ImageButton
            android:id="@+id/back_card"
            android:layout_width="@dimen/back_btn_width"
            android:layout_height="@dimen/back_btn_width"
            android:layout_marginLeft="@dimen/padding_left_custom"
            android:background="@drawable/back"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="我的卡包"
            android:layout_weight="1"

            android:textSize="@dimen/big_text_size"
            android:gravity="center" />
        <ImageView
            android:layout_width="30dp"
            android:layout_marginRight="@dimen/padding_left_custom"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            />
    </LinearLayout>
        <ListView
            android:id="@+id/list_card"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
</LinearLayout>

下面是列表项的布局

<?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">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        >
        <ImageView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/default_img"
            android:id="@+id/card_image_list_cus" />
        <TextView
            android:id="@+id/com_name_list_cus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="商家名字"
            android:textSize="@dimen/textsize_25_sp"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/card_image_list_cus"
            android:layout_toEndOf="@+id/card_image_list_cus" />
        <TextView
            android:id="@+id/com_location_list_cus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingRight="@dimen/padding_left_custom"
            android:text="店铺位置"
            android:textSize="@dimen/textsize_25_sp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>
</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值