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;
}
}
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;
}
}