Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用自定义适配器动态更新ListView?_Android_Listview_Android Listview_Adapter - Fatal编程技术网

Android 如何使用自定义适配器动态更新ListView?

Android 如何使用自定义适配器动态更新ListView?,android,listview,android-listview,adapter,Android,Listview,Android Listview,Adapter,我有一个创建列表视图和自定义适配器的主要活动。如果事先已经创建了列表,我可以填充列表视图,但是如何用动态获取的数据填充它呢 main活动 公共类MainActivity扩展活动{ 私有列表视图myListView; 私有上下文ctx; @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.MainActivity); ctx=这个; List m

我有一个创建
列表视图
自定义适配器
的主要活动。如果事先已经创建了列表,我可以填充
列表视图
,但是如何用动态获取的数据填充它呢

main活动

公共类MainActivity扩展活动{
私有列表视图myListView;
私有上下文ctx;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
ctx=这个;
List myList=new ArrayList();
添加(新项目(“名称1”、“说明1”);
添加(新项目(“名称2”、“说明2”);
添加(新项目(“名称3”、“说明3”);
添加(新项目(“名称4”、“说明4”);
添加(新项目(“名称5”、“说明5”);
myListView=(ListView)findViewById(R.id.list);
MyListAdapter myAdapter=新的MyListAdapter(ctx,R.layout.listitem,myList);
myListView.setAdapter(myAdapter);
}
}
MyListAdapter

公共类MyListAdapter扩展了ArrayAdapter{
私有int资源;
私人停车场平面布置;
公共MyListAdapter(上下文ctx、int资源ID、列表对象){
超级(ctx、资源ID、对象);
资源=资源ID;
mLayoutInflater=从(ctx)开始的LayoutFlater;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=(RelativeLayout)MLayOutFlater.inflate(资源,空);
Items item=(Items)getItem(position);
TextView txtName=(TextView)convertView.findViewById(R.id.listName);
setText(item.getName());
TextView txtDesc=(TextView)convertView.findViewById(R.id.listDescription);
setText(item.getDesc());
返回视图;
}
}
项目

公共类项目{
私有字符串名称;
私有字符串描述;
公共项(字符串名称、字符串描述){
超级();
this.name=名称;
this.desc=desc;
}
//接球手和接球手
}
如何修改代码,使后台函数将项检索到自定义适配器并填充ListView?我尝试使用
AsyncTask
,但无法使其正常工作


编辑:在
main活动
onCreate()之后添加以下
AsyncTask
,只是为了测试一下。它的工作原理是,我可以看到从1到5的计数,然后完成。
如何让
AsyncTask
更新适配器和
ListView
onCreate()
应该向
AsyncTask
传递什么,以及
AsyncTask
应该返回什么

私有类GetItems扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
TextView myMsg=(TextView)findViewById(R.id.topMsg);
myMsg.setText(“加载…”);
}
@凌驾
受保护的Void doInBackground(Void…参数){
TextView myMsg=(TextView)findViewById(R.id.topMsg);

更新适配器调用后的(inti=1;i)

myAdapter.notifyDataSetChanged();
这将动态更新列表视图


有关更多信息,请参见此

无论何时添加新数据,都应执行以下操作:

adapter.notifyDataSetChanged()

例如:

数据库。插入(数据)

myAdapter.notifyDataSetChanged()

或:


当你从列表中删除一个项目时,我尝试了最简单的方法来更新列表。希望我的代码能对你有所帮助。 代码

//自定义适配器
包com.example.smsptclapp;
导入java.util.ArrayList;
导入java.util.List;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.widget.AdapterView.OnItemLongClickListener;
公共类CustomAdapter扩展了BaseAdapter
{
静态列表结果;
//数组列表;
活动语境;
静态文本视图电视;
静态整数k,计数;
//int[]imageId;//用于图像
专用静态充气机=空;
公共CustomAdapter(活动,列表prgmNameList)
{
//TODO自动生成的构造函数存根
结果=prgmNameList;
上下文=活动;
//imageId=prgmImages;//用于图像
充气机=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
公共CustomAdapter(OnClickListener OnClickListener,列表项)
{
//TODO自动生成的构造函数存根
}
@凌驾
public int getCount()
{
//TODO自动生成的方法存根
返回result.size();
}
@凌驾
公共对象getItem(int位置)
{
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共长getItemId(int位置)
{
//TODO自动生成的方法存根
返回位置;
}
公共静态int getCounter()
{
返回计数;
}
公共静态int getPosition()
{
返回k;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
//TODO自动生成的方法存根
//对象cd1=getItem(位置);
视图行视图;
rowView=充气机。充气(R.layout.program\u列表,空);
tv=(TextView)rowView.findViewById(R.id.textView1);
tv.setLongClickable(真);
tv.setText(result.get(position));
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v){
k=位置;
在里面
myAdapter.mySetNewContentMethod(someNewContent);
myAdapter.notifyDataSetChanged();
   //Custom Adatpter
   package com.example.smsptclapp;
   import java.util.ArrayList;
   import java.util.List;
   import android.app.Activity;
   import android.content.Context;
   import android.content.Intent;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.View.OnClickListener;
   import android.view.ViewGroup;
   import android.widget.AdapterView;
   import android.widget.BaseAdapter;
   import android.widget.ImageView;
   import android.widget.TextView;
   import android.widget.Toast;
   import android.widget.AdapterView.OnItemLongClickListener;

   public class CustomAdapter extends BaseAdapter
    {
 static List<String> result;
 //ArrayList<SingleRow> list;
 Activity context;
 static TextView tv;
 static int k,count;
     // int [] imageId; //for Image
     private static LayoutInflater inflater = null;
    public CustomAdapter(Activity activity, List<String> prgmNameList) 
     {
       // TODO Auto-generated constructor stub
        result = prgmNameList;
        context = activity;
       //imageId = prgmImages; //for Image 
       inflater = ( LayoutInflater )context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
     }

     public CustomAdapter(OnClickListener onClickListener, List<String>  listItems) 
     {
    // TODO Auto-generated constructor stub
     }

 @Override
     public int getCount() 
     {
      // TODO Auto-generated method stub
      return result.size();
     }

     @Override
     public Object getItem(int position) 
     {
       // TODO Auto-generated method stub
       return position;
     }

     @Override
     public long getItemId(int position) 
     {
       // TODO Auto-generated method stub
       return position;
     }

     public static int getCounter()
    {
      return count;
    }

    public static int getPosition()
   {
     return k;
   }

   @Override
   public View getView(final int position, View convertView, ViewGroup   parent) 
   {
     // TODO Auto-generated method stub
     //Object cd1=   getItem(position);
     View rowView;       
     rowView = inflater.inflate(R.layout.program_list, null);
     tv=(TextView) rowView.findViewById(R.id.textView1);
     tv.setLongClickable(true);
     tv.setText(result.get(position));
      rowView.setOnClickListener(new OnClickListener() 
      {
         @Override
         public void onClick(View v) {
            k = position;
            Intent i =  new Intent(context, Menu.class);
            context.startActivity(i);
         }
         });
     return rowView;
    }
 }

 // In Main Type these lines
       ss =listItems.get(i);  // where 'ss' is global string, 'i' is the location you want to delete, and 'listItems' is global variable of 'List<String>' type. 
       db.deleteUser(ss);  //'db' is global variable of database and deleteUser is method to delete entry from data base only 
   listItems.remove(i); //to remove the entry from list i.e to refresh it you must call this
   listgroups.setAdapter(new CustomAdapter(this,listItems)); //'listgroups' is 'ListView', which is also global.