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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vim命令搜索_linux打开vim编辑器

    vim命令搜索_linux打开vim编辑器尽管目前我们已经涉及Vim的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足。承接我们的Vim教程系列,本文我们将讨论Vim提供的多种搜索技术。不过在此之前,请注意文中涉及到的所有的例子、命令、指令均是在Ubuntu14.04,Vim7.4下测试的。Vim中的基础搜索操作当你在Vim中打开一个文件并且想要搜索一个特定的单词或模板,第一步你必须要先按…

    2022年9月24日
    5
  • Android debug_Android开发在手机上调试

    Android debug_Android开发在手机上调试AndroidStudio目前已经成为开发Android的主要工具,用熟了可谓相当顺手。作为开发者,调试并发现bug,进而解决,可是我们的看家本领。正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse、Idea,AndroidStudio也为我们提供了强大的调试技巧,今天我们就来看看AndroidStudio中有关调试的技巧。首先,来看看Androidstudio中为我们…

    2022年10月15日
    7
  • Eclipse SVN使用问题之 Attempted to beginRule

    Eclipse SVN使用问题之 Attempted to beginRule

    2021年5月8日
    152
  • 记1024

    记1024等我写一个重磅级的博客。。。

    2022年6月24日
    25
  • Deepin安装MariaDB数据库

    Deepin安装MariaDB数据库在deeping上安装mariadb 1,安装的官网参考:有安装的命令和指导https://downloads.mariadb.org/mariadb/repositories/#distro=Debian&distro_release=jessie–jessie&mirror=tuna&version=10.4其主官网地址:https://downloads.mariadb.org/  2,安装mari…

    2022年5月11日
    47
  • 数据绑定以及Container.DataItem几种方式与使用方法分析[通俗易懂]

    数据绑定以及Container.DataItem几种方式与使用方法分析[通俗易懂]灵活的运用数据绑定操作绑定到简单属性:绑定到集合:'runat="server">绑定到表达式:绑定到方法返回值:绑定到Hashtable:绑定到Arr

    2022年7月2日
    27

发表回复

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

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