android---adapter的刷新

代码中注释写的都很详细,要注意的问题有以下几个:
1.数据变动后要告知UI线程
2.针对不同的输入对象,使用抽象类和泛型来承载
3.返回策略如何实现两次返回

MainActivity

package com.niuli.listadaptertest;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ListActivity implements OnClickListener {

    private Button btnadd,btnremove;
    //使用自定义的adapter来创建列表
    private ListAdapter<String> adapter ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnadd = (Button) findViewById(R.id.btnAdd);
        btnremove = (Button) findViewById(R.id.btnRemove);
        btnadd.setOnClickListener(this);
        btnremove.setOnClickListener(this);
        //设置activity和对应的布局文件
        adapter = new ListAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1) {

            /**
             * listcell即需要初始化的列表样式,这里初始化为textview
             */
            @Override
            public void initListCell(int position, View listcell, ViewGroup parent) {
                //这里只是设置显示方式,并不是直接添加元素,添加需要用到ADD
                ((TextView)listcell).setText(getItem(position));
            }
        };
        setListAdapter(adapter);
        for (int i = 0; i < 5; i++) {
            adapter.add("item"+i);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnAdd:
            adapter.add("itemxin");
            break;
        case R.id.btnRemove:
            adapter.remove();
            break;
        default:
            break;
        }

    }
    private long lasttime = 0;

    /**
     * 覆盖返回方法,这样可以实现返回提示
     */
    @SuppressLint("NewApi")
    @Override
    public void onBackPressed() {
        if (lasttime<=0) {
            Toast.makeText(this, "再次点击返回", Toast.LENGTH_SHORT).show();
            lasttime = System.currentTimeMillis();
        }else {
            long currenttime = System.currentTimeMillis();
            if (currenttime-lasttime<1000) {
                //带有动画的返回
                finishAfterTransition();
            }else {
                Toast.makeText(this, "再次点击返回", Toast.LENGTH_SHORT).show();
                lasttime = System.currentTimeMillis();
            }
        }
    }
}

ListAdapter

package com.niuli.listadaptertest;
/**
 * 写这个类的目的是其他类可以直接调用函数,所以要使用泛型和抽象类
 */
import java.util.ArrayList;
import java.util.List;

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

//使用泛型的话,需要在类的开始声明下
public abstract class ListAdapter<T> extends BaseAdapter {

    public List<T> data = new ArrayList<T>();

    public ListAdapter(Context context,int resid ) {
        this.context = context;
        this.listcellid = resid;
    }

    private Context context;
    //确定布局,每一种布局实际上在R文件中都是整形存在的
    private int listcellid=0;
    //添加元素,需要告诉UI线程布局的变动
    public void add(T item) {
        data.add(item);
        notifyDataSetChanged();
    }
    //删除元素,需要告诉UI线程布局的变动
    public void remove() {
        data.remove(getCount()-1);
        notifyDataSetChanged();
    }
    public Context getContext() {
        return context;
    }
    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public T getItem(int position) {
        return data.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView==null) {
            //在当前的context中解析listcellid的布局
            convertView = LayoutInflater.from(getContext()).inflate(listcellid, null);
        }
        initListCell(position, convertView, parent);
        return convertView;
    }
    //因为不知道会输入什么类型,所以需要定一个抽象方法,子类可以直接实现这个抽象方法
    //具体用处还需要慢慢理解
    public abstract void initListCell(int position, View listcell, ViewGroup parent);
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >
    </ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
        >

        <Button
            android1:id="@+id/btnAdd"
            android1:layout_width="wrap_content"
            android1:layout_height="wrap_content"
            android:layout_weight="1" 
            android1:text="Add" />

        <Button
            android1:id="@+id/btnRemove"
            android1:layout_width="wrap_content"
            android1:layout_height="wrap_content"
            android:layout_weight="1" 
            android1:text="Remove" />

    </LinearLayout>

</LinearLayout>

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-08-15 19:05  牛李  阅读(2276)  评论(0编辑  收藏  举报

导航