Android开发---ListView实现局部刷新及删除
来源:互联网 发布:沪金td数据从哪能下载 编辑:程序博客网 时间:2024/06/05 00:59
1.行布局,及简单的点击控件刷新
Activity代码
public class MainActivity extends Activityimplements IControl { private ArrayList<MyListEntity> list = null; private ListView lv; private MyListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); initEvent(); } /** * 初始化数据 */ private void initData() { list = new ArrayList<MyListEntity>(); for (int i = 0; i < 20; i++) { MyListEntity entityItem = new MyListEntity(); entityItem.setData("item " + i); entityItem.setPosition(i); list.add(entityItem); } } private void initView() {//这里和普通适配器不一样,要把当前的listview也传入适配器 lv =(ListView) findViewById(R.id.lv); adapter = new MyListAdapter(list, getApplicationContext());//1.重写行布局点击事件,实现ListView局部刷新//(1)拿到点击行的position , 并将其作为实体类集合下标.//(2)通过下标,找到实体类集合中对应的对象.//(3)更新该对象的某一条属性.//(4)将更新属性后的实体类对象,传入适配器更新数据的方法. adapter.setListView(lv); adapter.setiControl(this); lv.setAdapter(adapter); } private void initEvent() { lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, intposition, long id) { // 获取listview中点击item的数据 MyListEntity item =(MyListEntity) parent.getItemAtPosition(position); //Log.i("eee",item.getData() + " == " + item.getPosition()); // 更新数据 item.setData("update item" + position);//data:实体类属性,类似username // 更新界面 adapter.updateItemData(item);//2.update()行布局点击按钮事件,实现ListView局部刷新//(1)当前按钮所在行的实体类对象,和位置已经通过接口参数传来//(2)根据需求,更新该对象的某一条属性.//(3)将更新属性后的实体类对象,传入适配器更新数据的方法. } }); } @Override public void update(MyListEntity myListEntity, int position) { // 获取listview中点击item的数据 MyListEntity item = myListEntity; // 更新数据 item.setData("update item " + position); // 更新界面 adapter.updateItemData(item); }}Adapter代码
public class MyListAdapter extendsBaseAdapter { /** * listview中的数据集 */ private ArrayList<MyListEntity> mDataList; private Context mContext; private ListView mListView; private IControl iControl; public MyListAdapter(ArrayList<MyListEntity> list, Context cont) { this.mDataList = list; this.mContext = cont; } public void setiControl(IControl iControl) { this.iControl = iControl; } /** * 设置listview对象 */ public void setListView(ListViewlisv) { this.mListView = lisv; } /** * update listview 单条数据 * @param entityItem 新数据对象 public void updateItemData(MyListEntityentityItem) { */ Message msg = Message.obtain(); int ids = -1; // 进行数据对比获取对应数据在list中的位置 for (int i = 0; i < mDataList.size(); i++) { if(mDataList.get(i).getPosition() == entityItem.getPosition()) { ids = i; } } msg.arg1 = ids; // 更新mDataList对应位置的数据 mDataList.set(ids, entityItem); // handle刷新界面 han.sendMessage(msg);//另开线程更新UI } private Handler han = new Handler() { @SuppressLint("HandlerLeak") public void handleMessage(android.os.Message msg) { updateItem(msg.arg1); } }; /** * 刷新指定item * @param index item在listview中的位置 */ if (mListView == null) { privatevoid updateItem(intindex) { return; } // 获取当前可以看到的item位置 int visiblePosition = mListView.getFirstVisiblePosition(); // 如添加headerview后 firstview就是hearderview // 所有索引+1 取第一个view // View view = listview.getChildAt(index - visiblePosition + 1); // 获取点击的view View view = mListView.getChildAt(index - visiblePosition); TextView txt = (TextView) view.findViewById(R.id.txv_data); // 获取mDataList.set(ids,item);更新的数据 MyListEntity data = (MyListEntity) getItem(index); // 重新设置界面显示数据 txt.setText(data.getData()); } @Override public int getCount() { // TODO Auto-generated method stub return mDataList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mDataList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroupparent) { // TODO Auto-generated method stub if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_lv,null); } TextView txt = (TextView) convertView.findViewById(R.id.txv_data); txt.setText(mDataList.get(position).getData()); Button btn_update = (Button) convertView.findViewById(R.id.btn_update); btn_update.setOnClickListener(new View.OnClickListener() {//两个参数//1. 当前位置的实体类对象//2. 当前位置int值 @Override public void onClick(View v) { iControl.update(mDataList.get(position),position); } }); return convertView; }}实体类代码
public class MyListEntity { /** * 数据id */ private int dataId; /** * 数据 */ private String data; public int getPosition() { return dataId; } public void setPosition(int position) { this.dataId = position; } public String getData() { return data; } public void setData(String data) { this.data = data; } }接口代码
public interface IControl { void update(MyListEntity myListEntity, int position);}
2.应用实例(获得editView输入值后局部刷新)
Activity代码
public class ListCommentActivity extends Activity implements IControl_up,View.OnClickListener { Integer userid_becom = 0; String content_tch = ""; List<Comment> list; CommentAdapter adapter; ListView lv; Comment comment; Integer commentid_item = 0;//当前要更改的评论的id Comment citem;//全局实体类对象,专为局部刷新用 //老师发表评论 LinearLayout ll_write_comment; EditText edt_write_comment; Button btn_send_comment; @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_comment); initData(); initView(); initEvent(); } private void initData() { userid_becom =getIntent().getIntExtra("userid_becom", 0); list = new ArrayList<Comment>(); getComment(userid_becom, userid_becom); } private void initView() { lv = (ListView)findViewById(R.id.lv_comment); adapter = new CommentAdapter(this); adapter.setControl(this); lv.setAdapter(adapter); ll_write_comment = (LinearLayout)findViewById(R.id.ll_write_comment); edt_write_comment = (EditText)findViewById(R.id.edt_write_comment);//老师写评语 btn_send_comment = (Button)findViewById(R.id.btn_send_comment); edt_write_comment.addTextChangedListener(watcher); btn_send_comment.setEnabled(false); } private void initEvent() { btn_send_comment.setOnClickListener(this); } private TextWatcher watcher = newTextWatcher() { ...... @Override public void afterTextChanged(Editables) { //判断editText是否为空 if(!TextUtils.isEmpty(s.toString())) { //如果有文字 btn_send_comment.setEnabled(true); } else { //如果为空 btn_send_comment.setEnabled(false); } content_tch = s.toString(); }//获得输入的老师评语 }; /** * 获得评论列表 * 当前被评论的老师id * 发表评论的老师id */ public void getComment(Integeruserid_becom, Integer userid) { ...... //给实体类赋值 comment = new Comment(); //获得评论的实体类集合 comment.commentid =commentid; comment.avatar = avatar; comment.userid = userid; comment.userid_becom =userid_becom; comment.username = username; comment.title = title; comment.commentdate =commentdate; comment.content_stu =content_stu; comment.usertype = usertype; comment.content_tch =content_tch; //添加到用户List中 list.add(comment); //给适配器数据 adapter.setList(list); adapter.notifyDataSetChanged(); ...... } @Override public void recomment(Comment commentItem,int position) {//commentItem,position都是从adapter传来的值 //点击回复按钮,开始写评语 InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.RESULT_SHOWN); if (ll_write_comment.getVisibility() == View.VISIBLE) { ll_write_comment.setVisibility(View.INVISIBLE); } else { ll_write_comment.setVisibility(View.VISIBLE); } //输入框获得焦点 edt_write_comment.setFocusable(true); edt_write_comment.setFocusableInTouchMode(true); edt_write_comment.requestFocus();//通过从适配器传来的,当前行所在的实体类对象及position , 给全局变量//(1) 局部刷新的实体类对象ctiem//(2) 局部刷新的评论编号commentid_item//分别赋值 edt_write_comment.requestFocusFromTouch(); //给要局部更新的实体类对象赋值 citem = commentItem; //给要局部刷新的 评论id赋值 commentid_item = commentItem.commentid; } @Override public void onClick(View v) { //点击确认发送评语按钮,更新老师评语 updateCommentTch(commentid_item,content_tch); } //点击确认发送按钮,发送评语,并局部刷新listview /** * 更新老师评语 */ private void updateCommentTch(Integercommentid, final String content_tch) { RequestParams params = newRequestParams(); params.addBodyParameter("commentid", commentid +""); params.addBodyParameter("content_tch", content_tch); newHttpUtils().send(HttpRequest.HttpMethod.POST, Constans_lekao.URL_UPDATE_COMMENT_TCH, params, newRequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String>info) { //请求成功 String result =info.result.trim(); result =result.substring(result.indexOf(Constans_lekao.BRACKET) + 1); if (result.equals(Constans_lekao.ZERO)){ Utils.showToast("评论失败!"); } else { // 刷新评论的文字//局部刷新!!!//竟然不用调用//adapter.updateItemData(item);这个方法,adapter里也不用写,很神奇. // 获取listview中点击item的数据 Comment item = citem; // 更新数据 item.setContent_tch(content_tch); // 更新界面 // adapter.updateItemData(item); } //关闭软键盘 InputMethodManager imm= (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); ll_write_comment.setVisibility(View.GONE); } @Override public voidonFailure(HttpException e, String s) { } }); }}Adapter代码
public class CommentAdapter extendsBaseAdapter { private LayoutInflater inflater; private List<Comment> list; private BitmapUtils bitmapUtils; private IControl_up control; private ListView lv; public void setLv(ListView lv) { this.lv = lv; } public CommentAdapter(Context context) { this.inflater = LayoutInflater.from(context); bitmapUtils = Utils.getInstance(); } public void setList(List<Comment> list) { this.list = list; } public void setControl(IControl_up control) { this.control = control; } /** * update listview 单条数据 * @param commentItem 新数据对象 */ /*publicvoid updateItemData(Comment commentItem) { Message msg = Message.obtain(); int ids = -1; // 进行数据对比获取对应数据在list中的位置 for (int i = 0; i < list.size(); i++) { if (list.get(i).commentid == commentItem.commentid) { ids = i; } } msg.arg1 = ids; // 更新mDataList对应位置的数据 list.set(ids, commentItem); // handle刷新界面 handler.sendMessage(msg); }*///都不用写,也可以局部刷新,很神奇,可能是因为用了xUtils,走了其他线程的原因. /*@SuppressLint("HandlerLeak") privateHandler handler = new Handler() { public void handleMessage(android.os.Message msg) { updateItem(msg.arg1); }};*/ /** * 刷新指定item * @param index item在listview中的位置 */ /*private void updateItem(int index) { if (lv == null) { return; } // 获取当前可以看到的item位置 int visiblePosition = lv.getFirstVisiblePosition(); // 如添加headerview后 firstview就是hearderview // 所有索引+1 取第一个view // View view = listview.getChildAt(index - visiblePosition + 1); // 获取点击的view View view = lv.getChildAt(index - visiblePosition); TextView txt = (TextView) view.findViewById(R.id.txv_content_tch); // 获取mDataList.set(ids,item);更新的数据 Comment commentItem = (Comment) getItem(index); // 重新设置界面显示数据 txt.setText("试验"); //txt.setText(commentItem.content_tch); }*/ @Override public int getCount() { return (list == null) ? 0 : list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroupparent) { ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.item_student_comment, null); holder = new ViewHolder(); holder.avatar = (ImageView)convertView.findViewById(R.id.imgv_stu_avatar_comment); holder.username = (TextView)convertView.findViewById(R.id.txv_username_stu); holder.commentdate = (TextView)convertView.findViewById(R.id.txv_commentdate_stu); holder.title = (TextView) convertView.findViewById(R.id.txv_title_stu); holder.content_stu = (TextView)convertView.findViewById(R.id.txv_content_stu); holder.content_tch = (TextView)convertView.findViewById(R.id.txv_content_tch); holder.ll_recomment = (RelativeLayout)convertView.findViewById(R.id.rl_recomment); holder.rl_stu_allcomment = (RelativeLayout) convertView.findViewById(R.id.rl_stu_allcomment); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Comment commentItem = list.get(position); bitmapUtils.display(holder.avatar, commentItem.avatar); holder.username.setText(commentItem.username); holder.commentdate.setText(commentItem.commentdate); holder.title.setText(commentItem.title); holder.content_stu.setText(commentItem.content_stu); holder.content_tch.setText(commentItem.content_tch); // 判断当前用户是否是老师,只能评论有关自己的评论 if ((Integer)MyApplication.aCache.getAsObject(Constans_lekao.ACACHE_USERTYPE) == 2 && (Integer)MyApplication.aCache.getAsObject(Constans_lekao.ACACHE_USERID) ==commentItem.userid_becom) { holder.ll_recomment.setVisibility(View.VISIBLE);//可见 } else { holder.ll_recomment.setVisibility(View.GONE);// 不可见 } //老师回复评论点击事件 holder.ll_recomment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获得当前行的 commentid control.recomment(commentItem,position); } }); //查看该学生全部评论的点击事件 holder.rl_stu_allcomment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 调用外部接口把当前行的userid传过去 control.showAllComment(commentItem.userid); } }); return convertView; } public static class ViewHolder { ImageView avatar;// 头像 TextView username;// 用户名 TextView commentdate;// 日期 TextView title;// 标题 TextView content_stu;// 评论的内容 TextView content_tch;//老师的回复 RelativeLayout ll_recomment;// 老师回复按钮 RelativeLayout rl_stu_allcomment;// 查看全部评论的按钮 }}
3.动态删除一行
(1)适配器内代码
//删除按钮 holder.btn_delete_homework.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { control.delete(homeworkItem.homeworkid, position); //remove(position); } }); return convertView;}public void remove(int index) { list.remove(index); notifyDataSetChanged();}//1.如果直接调用,那么会立即删除
//2.如果想弹出对话框提示是否删除,确认后再删除,那么将当前的position作为接口参数传给外界的Activity,再Activity里调用remove()方法进行移除当前行的操作.
(2)Activity代码适配器内调用的删除接口
弹出(是否删除?)的对话框
参数1:实体类id
参数2:要删除的listview的position
@Overridepublicvoid delete(final int homeworkid, final intposition) { //判断当前Activity是否在前台,如果在前台(可见)才能显示对话框 LayoutInflater inflater =LayoutInflater.from(getActivity()); View myview =inflater.inflate(R.layout.dialog_delete_homework, null); AlertDialog.Builder builder = newAlertDialog.Builder(getActivity()); builder.setView(myview); //取消按钮 myview.findViewById(R.id.rl_cancel).setOnClickListener(newView.OnClickListener() { @Override public void onClick(View v) { dg_delete_homework.dismiss();//步骤2:Activity内在服务器上删除数据的方法 } }); //删除 myview.findViewById(R.id.rl_ok).setOnClickListener(newView.OnClickListener() { @Override public void onClick(View v) { //删除作业 deleteHomework(homeworkid,position); dg_delete_homework.dismiss(); } }); dg_delete_homework = builder.create(); dg_delete_homework.show();} /** * 删除作业 * @param homeworkid */privatevoid deleteHomework(int homeworkid, final int position) { RequestParams params = newRequestParams(); params.addBodyParameter("homeworkid",homeworkid+""); new HttpUtils().send(HttpRequest.HttpMethod.POST, Constans_lekao.URL_DELETE_HOMEWORK, params, newRequestCallBack<String>() { @Override public voidonSuccess(ResponseInfo<String> info) { Stringresult = info.result.trim(); result= result.substring(result.indexOf(Constans_lekao.BRACKET)+1); if(result.equals(Constans_lekao.ZERO)){ Utils.showToast("删除失败!"); }else{ Utils.showToast("删除成功!"); adapter.remove(position); adapter.notifyDataSetChanged();//步骤3:在这里执行适配器内声明的remove()方法,移除当前行 } } @Override public voidonFailure(HttpException e, String s) { } });}
1 0
- Android开发---ListView实现局部刷新及删除
- Android开发之ListView实现Item局部刷新
- Android开发——ListView局部刷新的实现
- Android奇巧:ListView实现Item局部刷新
- Android ListView 局部刷新
- Android ListView局部刷新
- android listview 局部刷新
- Android ListView局部刷新
- Android listview局部刷新
- ListView实现item局部刷新
- ListView实现Item局部刷新
- ListView实现Item局部刷新
- android:ListView的局部刷新
- 【android】ListView的局部刷新
- android:ListView的局部刷新
- Android ListView的局部刷新
- Android ListView局部刷新数据
- android Listview,gridview局部刷新,部分刷新
- Java干货之回头补基础(一) ——Callback机制个人理解及应用
- 多线程并发的cache实现
- Cubietruck---11. Linux3.3_serail串口驱动分析
- iOS 角度与弧度的转换
- iOS 进度框(二) SVProgressHUD
- Android开发---ListView实现局部刷新及删除
- JSP九大内置对象及四个作用域
- 浅谈magic-check——美化单选款、复选框
- 10分钟理解 - GIT or GIT 实战
- oracle出现IOU 10150错误,要彻底删除oracle注册信息
- php 新浪微博第三方登录验证/OAuth2.0
- Cubietruck---12. boot1源码流程简略分析
- Android Studio如何取消与SVN的关联
- 前端入门DAY2-CSS