ListView动态更改已显示的内容遇到问题,如何做到不滑动ListView就更改Item的内容

荒城ideal 2017-11-19 03:59:49
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按钮,就改变页面所显示的内容,而不用做其他处理,也就是新内容替换掉旧内容,而不是在旧内容后面追加新内容,我要怎么做到呢?希望大家帮我提提修改意见,谢谢大家。
...全文
923 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IGetYouu 2019-02-13
  • 打赏
  • 举报
回复
myAdapter.notifyDataSetChanged();

正解,这个的意思是内容有变动刷新列表。
YXTS122 2019-02-01
  • 打赏
  • 举报
回复
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();
}
});
}


}
王能 2019-01-30
  • 打赏
  • 举报
回复
new Thread(){
                    public void run() {
                    handler.sendEmptyMessage(1);
                    };
                };
改成
myAdapter.notifyDataSetChanged();
删除handler相关代码即可 我不想多说,你thread写的太6了,会自动跑
YXTS122 2019-01-29
  • 打赏
  • 举报
回复
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);
};
};
}
}
荒城ideal 2017-11-20
  • 打赏
  • 举报
回复
按你的说法我试了,还是要滑动了被屏幕覆盖之后才会刷新,仍然不能点击了就直接刷新
头发还没秃a 2017-11-20
  • 打赏
  • 举报
回复
 
handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
                myAdapter.notifyDataSetChanged();
        };
};
zhongyuanceshi 2017-11-19
  • 打赏
  • 举报
回复
1、为什么要用线程发消息,然后在handler中刷新listview.invalidate();没有必要用线程,线程和handler是用来处理耗时和异步操作的 2、可以直接在ChangeList(){中  myAdapter.notifyDataSetChanged();或listview.invalidate();不用再listview.setAdapter(myAdapter);我个人建议,并没有去运行哦 

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧