ListView更新显示数据问题,我设置了一个按钮,想点下按钮就更新ListView显示的数据,现在我这个代码,点击了按钮之后,必须要滑动ListView才能将已显示的内容改变。如何实现我点了按钮之后就直接更改显示的内容呢?
以下是主要代码,我自定义了一个MyAdapter类,继承了BaseAdapter类:
package com.example.baseadapterdemo;import java.util.ArrayList;
import java.util.List;import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
import com.example.bean.*;public class MainActivity extends Activity { private List<ItemBean> itemBeanList;
private ListView listview;
private MyAdapter myAdapter;
private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview = (ListView) findViewById(R.id.listview);
        itemBeanList = new ArrayList<ItemBean>();
        for(int i=0;i<10;i++){
         itemBeanList.add(new ItemBean(
         R.drawable.ic_launcher,
         "标题" + i,
         "内容:这是新闻页面" + i
         ));
        }
        myAdapter = new MyAdapter(this, itemBeanList);
        listview.setAdapter(myAdapter); 
        
        handler = new Handler(){
         public void handleMessage(android.os.Message msg) {
         myAdapter = new MyAdapter(MainActivity.this, itemBeanList);
                myAdapter.notifyDataSetChanged();
                listview.setAdapter(myAdapter); 
                listview.invalidate();
         };
        };
        
    }  
    
    public void ChangeList(View v){
     itemBeanList.clear();
        for(int i=0;i<10;i++){
         itemBeanList.add(new ItemBean(
         R.drawable.ic_launcher,
         "更新的标题" + i,
         "内容:这是新闻页面" + i
         ));
        }   
        new Thread(){
         public void run() {
         handler.sendEmptyMessage(1);
         };
        };
    }   
}
我想要达到的效果如下图所示:当点击了改变ListView按钮,就改变页面所显示的内容,而不用做其他处理,也就是新内容替换掉旧内容,而不是在旧内容后面追加新内容,我要怎么做到呢?希望大家帮我提提修改意见,谢谢大家。

解决方案 »

  1.   

    1、为什么要用线程发消息,然后在handler中刷新listview.invalidate();没有必要用线程,线程和handler是用来处理耗时和异步操作的
    2、可以直接在ChangeList(){中  myAdapter.notifyDataSetChanged();或listview.invalidate();不用再listview.setAdapter(myAdapter);我个人建议,并没有去运行哦
      

  2.   

     
    handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                    myAdapter.notifyDataSetChanged();
            };
    };
      

  3.   

    public class MyAdapter extends BaseAdapter{
     
    private LayoutInflater mInflater;
    private List<ItemBean> mData;
    ItemBean itemBean;

    public MyAdapter(Context context,List<ItemBean> mData){
    //根据context上下文加载布局
    this.mInflater = LayoutInflater.from(context);
    //将传入的数据保存在mData中
    this.mData=mData;
    }
    @Override
    public int getCount() {
    //How many items are in the data set represented by this Adapter.
            //在此适配器中所代表的数据集中的条目数
    return mData.size();
    } @Override
    public Object getItem(int position) {
     // Get the data item associated with the specified position in the data set.
            //获取数据集中与指定索引对应的数据项
    return position;
    } @Override
    public long getItemId(int position) {
     //Get the row id associated with the specified position in the list.
            //获取在列表中与指定索引对应的行id
    return position;
    } @Override
    //Get a View that displays the data at the specified position in the data set.
        //获取一个在数据集中指定索引的视图来显示数据
    public View getView(int position, View convertView, ViewGroup parent) {
    //itemBean=getItem(position);
    ViewHolder holder = null;

    //如果缓存convertView为空,则需要创建View
    if (convertView == null) {
    //自定义的一个类用来缓存convertview
    holder=new ViewHolder(); 

    //根据自定义的Item布局加载布局
    convertView = mInflater.inflate(R.layout.vlist, null);

    holder.img = (ImageView)convertView.findViewById(R.id.img);
    holder.titl = (TextView)convertView.findViewById(R.id.title);
    holder.info = (TextView)convertView.findViewById(R.id.info);
    //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
    convertView.setTag(holder);

    }else {

    holder = (ViewHolder)convertView.getTag();
    }


    holder.img.setBackgroundResource((Integer)mData.get(position).getImageId());
    holder.titl.setText((String)mData.get(position).getTitle());
    holder.info.setText((String)mData.get(position).getContent()); return convertView;
    }
    class ViewHolder{
    public ImageView img;
    public TextView titl;
    public TextView info;
    }
    }
      public class MainActivity extends Activity{private List<ItemBean> itemBeanList;
    private ListView listview;
    private MyAdapter myAdapter;
    private Handler handler;
    Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            try{
            setContentView(R.layout.activity_main);
            listview = (ListView) findViewById(R.id.listview);
            button=(Button)findViewById(R.id.bt);
            itemBeanList = new ArrayList<ItemBean>();
         
            for(int i=0;i<10;i++){
             itemBeanList.add(new ItemBean(
             R.drawable.ic_launcher,
             "标题" + i,
             "内容:这是新闻页面" + i
             ));
            }
            myAdapter = new MyAdapter(this, itemBeanList);
            listview.setAdapter(myAdapter); 
            
            handler = new Handler(){
             public void handleMessage(android.os.Message msg) {
             myAdapter = new MyAdapter(MainActivity.this, itemBeanList);
                    myAdapter.notifyDataSetChanged();
                    listview.setAdapter(myAdapter); 
                    listview.invalidate();
             };
            };
            }
            catch (Exception e)
            {
                Toast.makeText(getApplication(),e.toString() ,Toast.LENGTH_LONG).show();
            }
            button.setOnClickListener(new OnClickListener()
        {    @Override
                public void onClick(View v) 
                {
                 //ChangeList(this);
                 itemBeanList.clear();
                    for(int i=0;i<10;i++){
                     itemBeanList.add(new ItemBean(
                     R.drawable.ic_launcher,
                     "更新的标题" + i,
                     "内容:这是新闻页面" + i
                     ));
                    }   
                    new Thread(){
                     public void run() {
                     handler.sendEmptyMessage(1);
                     };
                    };
                }
        } );
        }
        
        public void ChangeList(View v){
         itemBeanList.clear();
            for(int i=0;i<10;i++){
             itemBeanList.add(new ItemBean(
             R.drawable.ic_launcher,
             "更新的标题" + i,
             "内容:这是新闻页面" + i
             ));
            }   
            new Thread(){
             public void run() {
             handler.sendEmptyMessage(1);
             };
            };
        }   
    }  
      

  4.   

    将new Thread(){
                        public void run() {
                        handler.sendEmptyMessage(1);
                        };
                    };改成myAdapter.notifyDataSetChanged();删除handler相关代码即可我不想多说,你thread写的太6了,会自动跑
      

  5.   

    public class MainActivity extends Activity{
     
    private List<ItemBean> itemBeanList;
    private ListView listview;
    private MyAdapter myAdapter;
    private Handler handler;
    Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            setContentView(R.layout.activity_main);
            listview = (ListView) findViewById(R.id.listview);
            button=(Button)findViewById(R.id.bt);
            itemBeanList = new ArrayList<ItemBean>();
          
            for(int i=0;i<10;i++){
                itemBeanList.add(new ItemBean(
                R.drawable.ic_launcher,
                "标题" + i,
                "内容:这是新闻页面" + i
                ));
            }
            myAdapter = new MyAdapter(this, itemBeanList);
            listview.setAdapter(myAdapter); 
             
            
                myAdapter = new MyAdapter(MainActivity.this, itemBeanList);
                    myAdapter.notifyDataSetChanged();
                    listview.setAdapter(myAdapter); 
                    listview.invalidate();
            
            
            button.setOnClickListener(new OnClickListener()
        {    @Override
                public void onClick(View v) 
                {
                    itemBeanList.clear();
                    for(int i=0;i<10;i++){
                        itemBeanList.add(new ItemBean(
                        R.drawable.ic_launcher,
                        "更新的标题" + i,
                        "内容:这是新闻页面" + i
                        ));
                    }   
                   
                    myAdapter.notifyDataSetChanged();
                }
        });
        }
         }  
      

  6.   

    myAdapter.notifyDataSetChanged();          正解,这个的意思是内容有变动刷新列表。