ListView中实现部分刷新的两种方法

ListView中实现部分刷新的两种方法ListView在开发中用到的地方非常多,我们经常是全部刷新来更新数据,如果只需要更新某一条数据,该怎么实现呢?我在项目中使用过以下两种方法:1.通过点击的位置,获取需要刷新那一列对应的控件,然后在控

大家好,又见面了,我是你们的朋友全栈君。

ListView在开发中用到的地方非常多,我们经常是全部刷新来更新数据,如果只需要更新某一条数据,该怎么实现呢?我在项目中使用过以下两种方法:

1.通过点击的位置,获取需要刷新那一列对应的控件,然后在控件上显示新的数据。
2.通过点击的位置,在数据源上移除对应位置的数据,并且重新设置新的数据,然后刷新。

先看一下效果图
刷新前

假如我们点击第二条数据里面的刷新按钮,变成下面的效果

刷新后

下面我们看一下这个简单示例的代码:

public class MainActivity extends Activity {

    private ListView lvMain;
    private TestAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvMain = (ListView) findViewById(R.id.mListView);
        adapter = new TestAdapter(this,getDatas());
        adapter.setListView(lvMain);
        lvMain.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    //数据源
    private List<StudentBean> getDatas(){
        List<StudentBean> studentList = new ArrayList<StudentBean>();
        for(int i = 0;i < 6; i++){
            StudentBean st = new StudentBean();
            st.setName("孙悟空" + i);
            st.setHobby("打妖怪 " + i);
            studentList.add(st);
        }
        return studentList;
    }
}

adapter里面,主要是按钮点击后,两个方法updateItemView(position) & updateItemData(position),一个是更新ItemView,一个是重新设置数据源来实现更新某一条数据。
这里有个地方需要注意下:View view = mListView.getChildAt(pos – mListView.getFirstVisiblePosition());,位置不要计算错。

public class TestAdapter extends BaseAdapter implements View.OnClickListener{

    private Context ctx;
    private List<StudentBean> studentDatas;

    public TestAdapter(Context ctx, List<StudentBean> studentDatas) {
        this.ctx = ctx;
        this.studentDatas = studentDatas;
    }

    @Override
    public int getCount() {
        return studentDatas == null? 0 : studentDatas.size();
    }

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

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


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if(convertView == null){            
            convertView = LayoutInflater.from(ctx).inflate(R.layout.adapter_main_item, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.tvItemTitle = (TextView) convertView.findViewById(R.id.tvItemTitle);
            viewHolder.tvItemContent = (TextView) convertView.findViewById(R.id.tvItemContent);
            viewHolder.btnItemRefresh = (Button) convertView.findViewById(R.id.btnItemRefresh);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.tvItemTitle.setText(studentDatas.get(position).getName());
        viewHolder.tvItemContent.setText(studentDatas.get(position).getHobby());
        viewHolder.btnItemRefresh.setTag(position);
        viewHolder.btnItemRefresh.setOnClickListener(this);
        return convertView;
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btnItemRefresh:
            int position = (int) v.getTag();
            //更新ItemView
            updateItemView(position);
            //重新设置数据源来实现更新一条数据
// updateItemData(position);
            break;
        }
    }

    private void updateItemView(int pos){
        if(mListView != null){
            View view = mListView.getChildAt(pos - mListView.getFirstVisiblePosition());
            TextView tvItemTitle = (TextView) view.findViewById(R.id.tvItemTitle);
            TextView tvItemContent = (TextView) view.findViewById(R.id.tvItemContent);
            StudentBean stNew = getNewDatas();
            tvItemTitle.setText(stNew.getName());
            tvItemContent.setText(stNew.getHobby());
        }
    }

    private void updateItemData(int pos){
        StudentBean stNew = getNewDatas();
        studentDatas.remove(pos);
        studentDatas.add(pos, stNew);
        notifyDataSetChanged();
    }

    private ListView mListView;
    public void setListView(ListView listView){
        mListView = listView;
    }

    static class ViewHolder{
        TextView tvItemTitle;
        TextView tvItemContent;
        Button btnItemRefresh;
    }

    private StudentBean getNewDatas(){
        StudentBean st = new StudentBean();
        st.setName("二狗子");
        st.setHobby("打土匪");
        return st;
    }
}

StudentBean

public class StudentBean {

    private String name;
    private String hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155311.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot学习笔记【持续更新中】

    Springboot学习笔记【持续更新中】

    2021年7月12日
    78
  • SQL Browser_sqlitedatabase

    SQL Browser_sqlitedatabase在网上找一个SQLITE查看器这个查看器叫做:www.jb51.net/database/118822.html这个查看器可以新建SQLITE文件数据库,可以建立表索引,写SQL语句,编辑表数据不过这个查看器支持的SQLITE数据库引擎版本低了一点,先介绍一下SQLiteDatabaseBrowser2.0是怎么用的?主界面将SQLITE的db文件拖进去软…

    2022年9月9日
    0
  • 爬虫(五)-openlaw[通俗易懂]

    爬虫(五)-openlaw[通俗易懂]爬虫-openlaw

    2022年8月4日
    3
  • java bi报表工具_7款顶级开源BI(商务智能)软件和报表工具

    java bi报表工具_7款顶级开源BI(商务智能)软件和报表工具在这个信息化时代,每分每秒都产生海量数据。在海量数据中,挖掘出有用的数据,并且能以较人性化、直观的方式展示这些数据,变得尤为重要。本文将介绍7款顶级开源BI(商务智能)软件和报表工具,用于商业数据的分析处理,希望对您有所帮助。BIRT(BusinessIntelligenceandReportingTools)是由IBM在2004年开源的基于Eclipse的报表系统,它主要是…

    2025年6月29日
    0
  • 如何撰写《软件需求规格说明书》

    1概述1.1编写目的指出编写《需求规格说明书》的目的。下面是示例:编写此文档的目的是进一步定制软件开发的细节问题,希望能使本软件开发工作更具体。为了使用户、软件开发者及分析和测试人员对该软件的初始规定有一个共同的理解,它说明了本软件的各项功能需求、性能需求和数据需求,明确标识各项功能的具体含义,阐述实用背景及范围,提供客户解决问题或达到目标所需要的条件或权能,提供一个度量和遵循的基准。…

    2022年4月6日
    42
  • PYthon——plt.scatter各参数详解

    PYthon——plt.scatter各参数详解 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下:1、scatter函数原型2、其中散点的形状参数marker如下:3、其中颜色参数c如下:4、基本的使用方法如下:[python] viewplain copy#导入必要的模块   import numpy as np   import mat…

    2022年6月29日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号