点击预约按钮后,"按钮"按理说会变成已预约的样式,但是上下滑动ListVIew后,又变回了原来的。同时预约名额也不能即时刷新,不知道怎么解决,请各位大神赐教?
贴出部分代码:
ListItemClickHelp.java
package com.xbmu.driver.view;
import android.view.View;
/**
* listview点击事件接口
* Created by Administrator on 2016/2/17 0017.
*/
public interface ListItemClickHelp {
/**
* 点击item条目中某个控件回调的方法
* @param item ListView中item布局的View对象
* @param parent 父容器对象
* @param position item在ListView中所处的位置
* @param which item中要点击的控件的id
*/
void onClick(View item, View parent, int position, int which);
}
OrderCarListItemClickAdapter.java
package com.xbmu.driver.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.xbmu.driver.R;
import com.xbmu.driver.bean.OrderCarBean.OrderCar;
import com.xbmu.driver.view.ListItemClickHelp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class OrderCarListItemClickAdapter extends BaseAdapter {
private Context contxet;
private ArrayList<OrderCar> mDatas;
private ListItemClickHelp callback;
private LayoutInflater mInflater;
/**
* @param contxet 上下文
* @param mDatas 填充的数据
* @param callback 定义的listview点击事件接口
*/
public OrderCarListItemClickAdapter(Context contxet, ArrayList<OrderCar> mDatas,
ListItemClickHelp callback) {
this.contxet = contxet;
this.mDatas = mDatas;
this.callback = callback;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public OrderCar getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
mInflater = (LayoutInflater) contxet
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.ordercar_pager_item, null);
holder = new ViewHolder();
holder.tvDate = (TextView) convertView.findViewById(R.id.item_date);
holder.time1 = (TextView) convertView.findViewById(R.id.item_time1);
holder.time2 = (TextView) convertView.findViewById(R.id.item_time2);
holder.time3 = (TextView) convertView.findViewById(R.id.item_time3);
holder.num1 = (TextView) convertView.findViewById(R.id.item_num1);
holder.num2 = (TextView) convertView.findViewById(R.id.item_num2);
holder.num3 = (TextView) convertView.findViewById(R.id.item_num3);
holder.btn1 = (Button) convertView.findViewById(R.id.item_btn1);
holder.btn2 = (Button) convertView.findViewById(R.id.item_btn2);
holder.btn3 = (Button) convertView.findViewById(R.id.item_btn3);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvDate.setText(getItem(position).orderdate);
String orderTimeStr = getItem(position).schedule.ordertime;
String[] orderTimeArr = orderTimeStr.split("\\|");
holder.time1.setText(orderTimeArr[0]);
holder.time2.setText(orderTimeArr[1]);
holder.time3.setText(orderTimeArr[2]);
String ordernumStr = getItem(position).schedule.ordernum;
holder.num1.setText(ordernumStr);
holder.num2.setText(ordernumStr);
holder.num3.setText(ordernumStr);
//根据可预约数量监听按钮的状态
if (Integer.parseInt(ordernumStr) > 0) {
holder.btn1.setBackgroundResource(R.drawable.ordered_shape);
holder.btn1.setText("约车");
holder.btn2.setBackgroundResource(R.drawable.ordered_shape);
holder.btn2.setText("约车");
holder.btn3.setBackgroundResource(R.drawable.ordered_shape);
holder.btn3.setText("约车");
} else {
holder.btn1.setBackgroundResource(R.drawable.no_order_shape);
holder.btn1.setText("无车");
holder.btn2.setBackgroundResource(R.drawable.no_order_shape);
holder.btn2.setText("无车");
holder.btn3.setBackgroundResource(R.drawable.no_order_shape);
holder.btn3.setText("无车");
}
final View view = convertView;
final int p = position;
//获取按钮的id
final int one = holder.btn1.getId();
//设置按钮的点击事件
holder.btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//回调接口中listview点击事件
callback.onClick(view, parent, p, one);
}
});
final int two = holder.btn2.getId();
holder.btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callback.onClick(view, parent, p, two);
}
});
final int three = holder.btn3.getId();
holder.btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callback.onClick(view, parent, p, three);
}
});
return convertView;
}
public static class ViewHolder {
private TextView tvDate;
private TextView time1;
private TextView time2;
private TextView time3;
private TextView num1;
private TextView num2;
private TextView num3;
private Button btn1;
private Button btn2;
private Button btn3;
}
}
MyOrderPager.java
[code=java]package com.xbmu.driver.base;[/code]
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.xbmu.driver.R;
import com.xbmu.driver.bean.OrderCarRecord;
import com.xbmu.driver.db.MyOrderRecordDB;
import java.util.ArrayList;
import java.util.List;
/**
* 我的预约
* Created by Administrator on 2016/2/26 0026.
*/
public class MyOrderPager extends BaseLeftMenuItemPager {
private ListView listView;
private List<OrderCarRecord> orderCarRecordList;
public MyOrderPager(Activity mActivity) {
super(mActivity);
}
@Override
public View initView() {
listView = new ListView(mActivity);
MyOrderAdapter adapter = new MyOrderAdapter(orderCarRecordList);
listView.setAdapter(adapter);
return listView;
}
@Override
public void initData() {
super.initData();
orderCarRecordList = new ArrayList<>();
MyOrderRecordDB orderRecordDB = new MyOrderRecordDB(mActivity, "DriverHelper.db", null, 1);
SQLiteDatabase db = orderRecordDB.getWritableDatabase();
Cursor cursor = db.query("ordercar", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String carnumber = cursor.getString(cursor.getColumnIndex("carnumber"));
String ordertime = cursor.getString(cursor.getColumnIndex("ordertime"));
String orderdate = cursor.getString(cursor.getColumnIndex("orderdate"));
OrderCarRecord orderCarRecord = new OrderCarRecord();
orderCarRecord.carnumber = carnumber;
orderCarRecord.ordertime = ordertime;
orderCarRecord.orderdate = orderdate;
orderCarRecordList.add(orderCarRecord);
} while (cursor.moveToNext());
}
cursor.close();
}
private class MyOrderAdapter extends BaseAdapter {
@ViewInject(R.id.tv_myorder_carnumber)
private TextView tvOrderCarNumber;
@ViewInject(R.id.tv_myorder_time)
private TextView tvOrderTime;
@ViewInject(R.id.tv_myorder_type)
private TextView tvOrderType;
private List<OrderCarRecord> mDatas;
public MyOrderAdapter(List<OrderCarRecord> orderCarRecordList) {
this.mDatas = orderCarRecordList;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public OrderCarRecord getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = View.inflate(mActivity, R.layout.myorder_layout_item, null);
ViewUtils.inject(this, itemView);
tvOrderCarNumber.setText(getItem(position).carnumber);
tvOrderTime.setText(getItem(position).orderdate + " " + getItem(position).ordertime);
return itemView;
}
}
}
6 个解决方案
#1
这个是因为listView的重用机制导致的,listView会把当前滚动到不可见区域的条目UI重新拿出来给后面加载出来的数据重用展示。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新
你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新
你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。
#2
我也同意楼上说的,这个是复用导致的,你可以通过设置标签来解决
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可
#3
adapter中的元数据也需要更新
#4
你对 已约 和 未约 做个状态判断 在getView 对这个状态判断 然后做不同的显示效果 已约后把对应的Item的状态改下 notifyDatasetChanged 下
#5
你应该要记住状态 根据item的状态来决定怎么显示item 下午 抽时间写了一个demo 下载地址 ttps://github.com/zhoulinxue/Listdemo.git 你拿到demo后 只需要把状态 改为 由服务器记录就好了。
#6
https://github.com/zhoulinxue/Listdemo.git
#1
这个是因为listView的重用机制导致的,listView会把当前滚动到不可见区域的条目UI重新拿出来给后面加载出来的数据重用展示。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新
你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。
所以你下拉到第一个不可见时第一个的UI会被下面出现的新数据更新
你的点击回调函数里是否更新了预约的状态,adapter里的数据也要更新数据,更新之后调用adapter的notifyDatasetChanged方法
你的修改button文案为“已约”应该是在点击回调里设置的,不应该在那里设置应该在getView里设置。
#2
我也同意楼上说的,这个是复用导致的,你可以通过设置标签来解决
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可
当你点击了某一个按钮进行预约的时候,你将这个position 保存一下,然后notifyDatasetChanged,然后在getView中进行一些判断如果显示到你的position的时候,你做一下按钮变幻即可
#3
adapter中的元数据也需要更新
#4
你对 已约 和 未约 做个状态判断 在getView 对这个状态判断 然后做不同的显示效果 已约后把对应的Item的状态改下 notifyDatasetChanged 下
#5
你应该要记住状态 根据item的状态来决定怎么显示item 下午 抽时间写了一个demo 下载地址 ttps://github.com/zhoulinxue/Listdemo.git 你拿到demo后 只需要把状态 改为 由服务器记录就好了。
#6
https://github.com/zhoulinxue/Listdemo.git