ListView的复用->购物车,listView的布局复用->聊天窗口

来源:互联网 发布:论文表格数据来源 编辑:程序博客网 时间:2024/05/17 23:32
1:ListView+adapter的使用:ListViewHeader,Footer,ExpendableListView,ListView多布局类型,
ListViewAdapter使用时的注意事项;
2:机型适配
3:WebView


MVC c-》adapter,


ListView 永远要通过Adapter来刷新
Adapter 永远有数据来更新;
任何ListView 显示的内容,不论出现如何变化,都必须通过数据来改变
即使只是修改一个文本,数值,或者是一种选中状态,都必须通过数据来刷新ListView
Item中内部控件的点击事件,不要直接操作UI。+++++++++++++每一个控件需要来进行当前位置的识别
ListView getView 的规则:在显示数据内容的时候,每一种数据项的状态,都必须要进行展现








购物车的数量5


编码习惯:
带有返回值的


ListView 显示多种不同的布局:复用
聊天的效果。


ListView的复用


ListView 内部包含了一个缓冲区,内部存储不同分类的缓冲视图。


BaseAdapter 内部可以重写两个方法,这两个方法,用于进行多布局的复用;


getViewTypeCount()方法;
当前ListView 中Adapter 需要显示的布局的类型数量,也就是说有多少种。


getViewTypeCount 类型数》1代表ListView 加载多种布局;那么每一种布局的类型值唯一,并且》=0《count


--------------------------------------------------------------
main.xml
<?xml version="1.0" encoding="utf-8"?>
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <Button
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:onClick="btnSwitchEditMode"
        android:text="切换编辑模式"
        />
    <ListView
        android:id="@+id/main_listView"
        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:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <CheckBox
        android:id="@+id/item_cart_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
<ImageView
    android:id="@+id/item_cart_imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">


        <TextView
            android:id="@+id/item_cart_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="商品名称"/>
        <TextView
            android:id="@+id/item_cart_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="商品价格"/>
    </LinearLayout>
    <Button
    android:id="@+id/item_cart_inc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="+"
    />
    <TextView
        android:id="@+id/item_cart_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLength="2"
        android:text="_"/>
    <Button
        android:id="@+id/item_cart_dec"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        />
    <Button
        android:id="@+id/item_cart_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="shanchu"
        />


</LinearLayout>


--------------------------------------------------------------


public class CartItem {
    public boolean isChecked() {
        return checked;
    }


    public void setChecked(boolean checked) {
        this.checked = checked;
    }


    private boolean checked;
    private long productId;




    @Override
    public String toString() {
        return "CartItem{" +
                "productId=" + productId +
                ", productName='" + productName + '\'' +
                ", productPrice=" + productPrice +
                ", count=" + count +
                '}';
    }


    public long getProductId() {
        return productId;
    }


    public void setProductId(long productId) {
        this.productId = productId;
    }


    public String getProductName() {
        return productName;
    }


    public void setProductName(String productName) {
        this.productName = productName;
    }


    public float getProductPrice() {
        return productPrice;
    }


    public void setProductPrice(float productPrice) {
        this.productPrice = productPrice;
    }


    public int getCount() {
        return count;
    }


    public void setCount(int count) {
        this.count = count;
    }


    public CartItem() {
    }


    public CartItem(long productId, String productName, float productPrice, int count) {
        this.productId = productId;
        this.productName = productName;
        this.productPrice = productPrice;
        this.count = count;
    }


    private String productName;
    private float productPrice;


    /**
     * 购物车商品购买的数量
     */
    private int count;


}


-----------------------------------------------------------------------------------------


/**
 * Created by Administrator on 15-12-26.
 */
public class CartAdapter extends BaseAdapter {
    Context context;
    List<CartItem>  items;


    private View.OnClickListener onClickListener;
    private CompoundButton.OnCheckedChangeListener onCheckedChangeListener;
    /**
     * 是否是编辑模式
     * @param context
     * @param items
     */
    private boolean editMode;


    public CartAdapter(Context context, List<CartItem> items) {
        this.context = context;
        this.items = items;
    }


    @Override
    public int getCount() {
        return items.size();
    }


    @Override
    public Object getItem(int position) {
        return items.get(position);
    }


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


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View ret = null;
        //1:复用
        if(convertView!=null){
            ret=convertView;
        }else{
            LayoutInflater inflater = LayoutInflater.from(context);
            ret = inflater.inflate(R.layout.cart_item,parent,false);
        }


        //2:ViewHolder
        ViewHolder holder =(ViewHolder)ret.getTag();
        if(holder==null){
            holder=new ViewHolder(ret);
            ret.setTag(holder);
        }


        //3:显示内容、
        CartItem cartItem = items.get(position);
        holder.txtProductName.setText(cartItem.getProductName());
        holder.txtProductPrice.setText(Float.toString(cartItem.getProductPrice()));


        holder.txtCount.setText(Integer.toString(cartItem.getCount()));


        //针对按钮,checkBox 等可以交互的空间,必须要更新空间位置的标示
        holder.btnInc.setTag(position);
        holder.btnDec.setTag(position);
        holder.btnDelete.setTag(position);


        //!!!CheckBox设置Tag,一定要在CheckBox 进行代码选中
        holder.chbCheck.setTag(position);


        //编辑模式的处理
        holder.chbCheck.setChecked(false);


        if(editMode){
            holder.chbCheck.setVisibility(View.VISIBLE);
            holder.btnDelete.setVisibility(View.VISIBLE);
            holder.chbCheck.setChecked(cartItem.isChecked());
        }else{
            holder.chbCheck.setVisibility(View.INVISIBLE);
            holder.btnDelete.setVisibility(View.INVISIBLE);
            //非编辑模式的切换,设置Checked=false,清楚所有的设置。
            holder.chbCheck.setChecked(false);
        }


        return ret;
    }
    public  void setOnClickListener(View.OnClickListener onClickListener){
        this.onClickListener=onClickListener;
    }


    public void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener onCheckedChangeListener){
        this.onCheckedChangeListener = onCheckedChangeListener;
    }


    public void switchEditMode() {
        editMode=!editMode;
        //方法内部调用adapter刷新,因此这个方法必须在主线程调用
        notifyDataSetChanged();
    }


    private class ViewHolder{
        public CheckBox chbCheck;
        public ImageView imageView;
        public TextView txtProductName;
        public TextView txtProductPrice;
        public Button btnInc;
        public Button btnDec;
        public Button btnDelete;
        public TextView txtCount;




        public  ViewHolder(View itemView){
            chbCheck =(CheckBox)itemView.findViewById(R.id.item_cart_check);
            imageView=(ImageView)itemView.findViewById(R.id.item_cart_imageView);
            txtProductName=(TextView)itemView.findViewById(R.id.item_cart_name);
            txtProductPrice=(TextView)itemView.findViewById(R.id.item_cart_price);
            btnInc=(Button)itemView.findViewById(R.id.item_cart_inc);
            btnDec=(Button)itemView.findViewById(R.id.item_cart_dec);
            btnDelete=(Button)itemView.findViewById(R.id.item_cart_delete);
            txtCount=(TextView)itemView.findViewById(R.id.item_cart_count);


            btnInc.setOnClickListener(onClickListener);
            btnDec.setOnClickListener(onClickListener);
            btnDelete.setOnClickListener(onClickListener);
            chbCheck.setOnCheckedChangeListener(onCheckedChangeListener);
        }


//        @Override
//        public void onClick(View v) {
//            int id = v.getId();
//            switch (id){
//                case R.id.item_cart_inc:
//
//                    break;
//            }
//        }
    }
}






-------------------------------------------
public class MainActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {


    private ArrayList<CartItem> cartItems;
    private ListView listView;
    private CartAdapter adapter;


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


        listView = (ListView)findViewById(R.id.main_listView);
        cartItems = new ArrayList<CartItem>();
        for (int i = 0; i < 50; i++) {
            CartItem cartItem = new CartItem();
            cartItem.setProductId(i);
            cartItem.setProductName("七天精通Android ");
            cartItem.setProductPrice(100.0f);
            cartItem.setCount(1);


            cartItems.add(cartItem);
        }


        adapter = new CartAdapter(this, cartItems);
        adapter.setOnClickListener(this);
        adapter.setOnCheckedChangeListener(this);
        listView.setAdapter(adapter);


    }


    @Override
    public void onClick(View v) {
        int id = v.getId();
        Object tag = v.getTag();
        int position =-1;
        if(tag!=null&&tag instanceof Integer){
            position=(Integer)tag;
        }


        switch (id){
            case R.id.item_cart_inc:
                if(position>-1){
                    //更新数据,而不是更新UI
                    CartItem cartItem = cartItems.get(position);
                    int count = cartItem.getCount();
                    count++;
                    cartItem.setCount(count);
                }
                break;
            case R.id.item_cart_dec:
                if(position>-1){
                    //更新数据,而不是更新UI
                    CartItem cartItem = cartItems.get(position);
                    int count = cartItem.getCount();
                    count--;
                    if(count>0)
                    cartItem.setCount(count);
                    else{
                        cartItems.remove(position);
                    }
                }
                break;
            case R.id.item_cart_delete:
                if(position>-1){
                    cartItems.remove(position);
                }
                break;
        }
        adapter.notifyDataSetChanged();
    }


    /**
     * 切换ListView的编辑模式
     * @param view
     */
    public void btnSwitchEditMode(View view) {
        adapter.switchEditMode();
    }




    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        int id = buttonView.getId();
        switch (id){
            case R.id.item_cart_check:
                Object tag = buttonView.getTag();
                if(tag!=null&& tag instanceof  Integer){
                    int position =(Integer)tag;
                    cartItems.get(position).setChecked(isChecked);
                }
                break;
        }
    }
}






-----------------------------------------------------
ListView 多布局复用的流程,


public class CheckActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_check);
        ListView listView =(ListView)findViewById(R.id.check_listView);
        ArrayList<ChatMessage> messages = new ArrayList<ChatMessage>();
        for (int i = 0; i < 20; i++) {
            ChatMessage msg = new ChatMessage();
            msg.setMessage("hello");
            msg.setTime(System.currentTimeMillis());
            msg.setIsSelf(i%2==0);
            messages.add(msg);
        }




        listView.setAdapter(new ChatAdapter(this,messages));
    }
}


activity_check.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.kodulf.thinkinlistview.CheckActivity">
<ListView
    android:id="@+id/check_listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>


</RelativeLayout>




chat_myslef.xml
--------------------


<?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">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="自己的消息"
    android:layout_alignParentRight="true"
    />
</RelativeLayout>






chat_other_item.xml
---------------------


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="其他人"/>
</LinearLayout>




--------------------
ChatAdapter:


public class ChatAdapter extends BaseAdapter {
    private Context context;
    private List<ChatMessage> messages;


    private static final int TYPE_OTHER =0;
    private static final int TYPE_MYSELF=1;


    public ChatAdapter(Context context, List<ChatMessage> messages) {
        this.context = context;
        this.messages = messages;
    }


    @Override
    public int getCount() {
        return messages.size();
    }


    @Override
    public Object getItem(int position) {
        return messages.get(position);
    }


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


    /**
     * 获取当前的ListView 能够显示多少种布局类型
     * 如果方法返回内容>1,那么必须要重写getItemViewType(int pos)方法
     * @return
     */


    @Override
    public int getViewTypeCount() {
        //return super.getViewTypeCount();
        return 2;//返回2 ,是因为聊提哪集面,自己发送的,在右侧,收到的在左侧
    }


    /**
     * 因为getViewTypeCount 返回>1 那么每进行一次getView 之前都会对咬获取的View
     * 的类型进行检查;更具索引来调用,
     * 这个方法,能够控制;
     * 1:ListView 将移除的View是如何进行缓存的,决定了缓冲区存放的位置
     * 2:ListView 在每次调用getView 之前,都会进行getItemViewType
     *      那么获取类型就可以从缓冲区进行加载View,形成convertView
     *
     * @param position
     * @return 【0,n)  n代表getViewTypeCount的返回值
     */
    @Override
    public int getItemViewType(int position) {
        int ret =0;
        ChatMessage chatMessage = messages.get(position);
        if(chatMessage.isSelf()){
            ret=TYPE_MYSELF;
        }else{
            ret=TYPE_OTHER;
        }
        return ret;
    //    return super.getItemViewType(position);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View ret = null;
        if(convertView!=null){
            ret=convertView;
        }else{
            LayoutInflater inflater = LayoutInflater.from(context);
            int type = getItemViewType(position);
            switch (type){
                case TYPE_OTHER:
                    ret=inflater.inflate(R.layout.chat_other_item,parent,false);
                    break;
                case TYPE_MYSELF:
                    ret=inflater.inflate(R.layout.chat_myself,parent,false);
                    break;
            }
        }


        return ret;
    }
}




ChatMessage:
-----------------------------------------------------


public class ChatMessage  {
    private String message;
    private long time;
    private String address;//发信人或者收信人
    private boolean isSelf;


    public String getMessage() {
        return message;
    }


    public void setMessage(String message) {
        this.message = message;
    }


    public long getTime() {
        return time;
    }


    public void setTime(long time) {
        this.time = time;
    }


    public String getAddress() {
        return address;
    }


    public void setAddress(String address) {
        this.address = address;
    }


    public boolean isSelf() {
        return isSelf;
    }


    public void setIsSelf(boolean isSelf) {
        this.isSelf = isSelf;
    }
}
0 0
原创粉丝点击