Android notifyDataSetChanged()不使用baseAdapter和自定义ListView
我需要ListView逐行显示数据 下面是代码示例:Android notifyDataSetChanged()不使用baseAdapter和自定义ListView,android,listview,Android,Listview,我需要ListView逐行显示数据 下面是代码示例: public class ClassName extends AppCompatActivity { ListView _listView; List <Info> myList; CustomAdapterClass myAdapted; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan
public class ClassName extends AppCompatActivity {
ListView _listView;
List <Info> myList;
CustomAdapterClass myAdapted;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myActivity);
_listView = (ListView) findViewById(R.id.viewListView);
myList= new ArrayList<>();
myAdapted = new CustomAdapterClass();
_listView.setAdapter(myAdapted);
CallingSomeMethodToGetData (SomeData myData);
DoThisInBackground{
myList.clear();
Info info;
int k=0;
for (SomeData object: myData){
Log.i("k:", String.valueOf(k));
k++;
info = new Info();
info.addData(object.getdata());
myList.add(info)
myAdapted.notifyDataSetChanged();
SystemClock.sleep(400);
}
}
}
class CustomAdapterClass extends BaseAdapter{
@Override
public int getCount() {
return myList.size();
}
@Override
public Object getItem(int i) {
return myList.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
Log.i("I: ", String.valueOf(i));
view = getLayoutInflater().inflate(R.layout.custom_list_view, null);
TextView _textView = (TextView)view.findViewById(R.id.name_CustomView);
_textView .setText(mysList.get(i).getMyData());
return view;
}
}
}
公共类类名扩展了AppCompative活动{
ListView _ListView;
列出我的清单;
自定义适配器类myAdapted;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.myActivity);
_listView=(listView)findViewById(R.id.viewListView);
myList=新的ArrayList();
myAdapted=新的CustomAdapterClass();
_setAdapter(myAdapted);
调用SomeMethodToGetData(SomeData myData);
DoThisInBackground{
myList.clear();
信息;
int k=0;
对于(SomeData对象:myData){
Log.i(“k:,String.valueOf(k));
k++;
信息=新信息();
info.addData(object.getdata());
myList.add(信息)
myAdapted.notifyDataSetChanged();
系统时钟。睡眠(400);
}
}
}
类CustomAdapterClass扩展了BaseAdapter{
@凌驾
public int getCount(){
返回myList.size();
}
@凌驾
公共对象getItem(int i){
返回myList.get(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(最终int i、视图视图、视图组视图组){
Log.i(“i:,String.valueOf(i));
视图=GetLayoutFlater().充气(R.layout.custom\u list\u视图,空);
TextView\u TextView=(TextView)view.findViewById(R.id.name\u CustomView);
_setText(mysList.get(i.getMyData());
返回视图;
}
}
}
我得到的行为是,ListView
在所有数据加载到myList
之前不会更新
换句话说,我在日志中为每个info
打印k
,当加载所有数据时,I
开始在日志中打印
我尽量减少代码,这样就可以阅读了
NotifyDataSetChanged
应该从UI线程调用
也可以考虑使用CurryReVIEW以获得更好的性能。它还暴露了
公共最终无效notifyItemChanged(int位置,@Nullable对象负载) 这样,您也可以只更新特定的项目。试试这段代码。。 定义适配器构造函数。。 下面的代码定义到适配器中 private Context context;
private List<Info>mylist=new ArrayList<>();
public CustomAdapterClass(Context context, List<Info> mylist) {
this.context = context;
this.mylist = mylist;
}
那么,我应该在哪里调用notifyDataSetChanged()?好的,我刚刚检查了背景和UI的情况。我在哪里调用myAdapted.notifyDataSetChanged(),它实际上是在调用它,但它不起作用。您在哪里将
新信息()
添加到myList
?并且您想将项目逐个添加到myList
中?就在Info.addData(object.getdata())
之后,我修改代码时错过了它。仍然无法在ListView中逐行获取数据我正在从在线数据库读取数据。我不希望用户等待所有数据下载后才看到它。我需要一次查看每个数据get@SHADOW.NET检查更新的答案。考虑使用Realver视图,因为它将解决您的用例。此外,如果您知道更新了哪个项目,则不建议使用notifyDataSetChanged。还有更优化的方法,实际上,这不是不同线程的情况。我只是检查了一下,没有做背景,它不是working@SHADOW.NET您正在获取数据并更新信息Object Info.addData(Object.getdata());但是您在哪里更新适配器中的数据?如果不更新数据notifyDataSetChanged是可用的,则它就在info.addData(object.getdata())
修改代码时遗漏了它之后。
myAdapted = new CustomAdapterClass(this,mList); // if fragement then used getActivity().
_listView.setAdapter(myAdapted);
myAdapted.notifyDataSetChanged();