Android 从第二个活动返回后在第一个活动中更新Listview

Android 从第二个活动返回后在第一个活动中更新Listview,android,listview,Android,Listview,我在一个活动中有一个列表视图,在自定义适配器中有一个信息图标。当用户点击该信息按钮时,下一个活动将打开,在下一个活动中标记出勤后,当用户点击更新按钮时,第二个活动应完成,第一个活动列表视图应更新 我成功的做法: 我已经成功地标记了出席人数并更改了listview的颜色,但我是在关闭第二个活动并重新启动第一个活动后才这样做的。通过这种方式,listview会因为再次启动活动而得到更新 我不能做的事情: 我希望当用户点击更新按钮时,只有finish()将调用,并且用户返回到上一个更新了listvie

我在一个活动中有一个列表视图,在自定义适配器中有一个信息图标。当用户点击该信息按钮时,下一个活动将打开,在下一个活动中标记出勤后,当用户点击更新按钮时,第二个活动应完成,第一个活动列表视图应更新

我成功的做法: 我已经成功地标记了出席人数并更改了listview的颜色,但我是在关闭第二个活动并重新启动第一个活动后才这样做的。通过这种方式,listview会因为再次启动活动而得到更新

我不能做的事情: 我希望当用户点击更新按钮时,只有finish()将调用,并且用户返回到上一个更新了listview的第一个活动。但是当我这样做时,listview就不会得到更新。我必须返回并再次打开活动,然后列表视图会得到更新,否则不会。我不想那样。我还尝试在onResume方法中通知适配器第一个活动,这样当用户从第二个活动返回时,第一个活动listview适配器将由于onResume方法而更新,但它不工作。请帮忙

我的Listview活动代码:

public class TeacherWebserviceMainList extends Activity {
int attentedncemarkedCount = 0;
TextView addteacher;
DatabaseHandler databasehandler;
DetailsTeacherwebservice details;
String emis;

ArrayList<DetailsTeacherwebservice> addas = new ArrayList<DetailsTeacherwebservice>();
CustomAdapterTeacherWebservice cusadapter;
ArrayList<DetailsTeacherwebservice> teacherList;
private ListView listcontent = null;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.teacherwebservicemainlist );
    addteacher = (TextView) findViewById(R.id.addteachermenu);

    databasehandler = new DatabaseHandler(TeacherWebserviceMainList.this);
    listcontent = (ListView) findViewById(R.id.teacher_list);
    teacherList = databasehandler.teacherwebserviceList(emis);
    Rsults();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String update = data.getStringExtra("update");
            if(update.equals("1"))
            {
                //cusadapter.
                CustomAdapterTeacherWebservice adapter = new CustomAdapterTeacherWebservice(this, addas);

                listcontent.setAdapter(adapter);
            }
        }
    }
}

private void Rsults() {
    addas.clear();
    //DatabaseHandler databaseHandler=new DatabaseHandler(this);
    //ArrayList<ArrayList<Object>> data =  databaseHandler.abcTeacherNew();

    for (int p = 0; p < teacherList.size(); p++) {
        details = new DetailsTeacherwebservice();
        //ArrayList<Object> baris = data.get(p);
        details.setId(teacherList.get(p).getId());
        details.setTeachername(teacherList.get(p).getTeachername());
        details.setTeachercnic(teacherList.get(p).getTeachercnic());
        details.setTeacherno(teacherList.get(p).getTeacherno());
        details.setTeachergender(teacherList.get(p).getTeachergender());
        details.setAttendance(teacherList.get(p).getAttendance());
        details.setTeacherattendancedetails(teacherList.get(p).getTeacherattendancedetails());
        details.setAttendancedatesince(teacherList.get(p).getAttendancedatesince());
        details.setAttendancetrasnferschool(teacherList.get(p).getAttendancetrasnferschool());
        addas.add(details);
    }
    cusadapter = new CustomAdapterTeacherWebservice(TeacherWebserviceMainList.this, addas);
    listcontent.setAdapter(cusadapter);
    listcontent.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {


        }
    });
}
  update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        DetailsTeacherwebservice schoolinfo = new DetailsTeacherwebservice();
                schoolinfo.setTeachername(teachername.getText().toString());
                schoolinfo.setTeacherno(teacherno.getText().toString());
                schoolinfo.setTeachercnic(teachercnic.getText().toString());
                schoolinfo.setTeachergender(teachergender.getText().toString());
                schoolinfo.setAttendance(teachergroupstr);
                schoolinfo.setTeacherattendancedetails(absentgrpstr);
                schoolinfo.setAttendancedatesince(txtDate.getText().toString());
                schoolinfo.setAttendancetrasnferschool(transferOutSchool.getText().toString());
                databasehandler.updateteacherwebservice(schoolinfo, emis, identity);
                Toast.makeText(Teacherwebservicemainlistupdate.this, "Updated Successfully", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.putExtra("update", "1");
                setResult(RESULT_OK, intent);
                finish();

            }
        }
    });

单击“更新”按钮时,我可以再次启动listview活动,但这会更改已单击列表项的索引,即因为活动再次启动。然而,我想要的是,如果我单击了第10项,那么当下一个活动打开并且用户更新考勤时,它将返回到同一索引位置上的上一个活动,这样用户就不必再次滚动以返回第10项

//您必须在onResume方法中的适配器中设置数据

 @Override
    protected void onResume() {
        super.onResume();
    }

为列表项添加此代码单击:

 Intent i = new Intent(context, YourAcitivityName.class);
     i.putExtra("position",p);
    startActivityForResult(i, 1);
在更新按钮中添加此代码:

Intent intent = new Intent();
intent.putExtra("update", "1");
intent.putExtra("position",getIntent().getIntExtra("position",0));
setResult(RESULT_OK, intent);        
finish();
当您从活动返回到实现列表视图的活动时,此方法称为:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String update = data.getStringExtra("update");
             if(update.equals("1"))
             {
               // add your code to update list view
                 teacherList = databasehandler.teacherwebserviceList(emis);
                 Rsults();
                  YourAdapterClassName adapter = new YourAdapterClassName(this, arrList);

                  listView.setAdapter(adapter);
               listView.smoothScrollToPosition(getIntent().getIntExtra("position",0));
              }
         }     
    }
} 

下面是两个示例,第一个示例是ListView的源是一个列表(在本例中使用自定义适配器),第二个示例是源是一个游标(使用SimpleCursorAdapter)

许多人陷入的陷阱只是使用以下方法更新列表:-

    myList = method();
    myAdapter.notifyDataSetChanged();
猜猜看,这就是你落入的陷阱

什么时候应该做的是使用列表的方法来更改它(例如,
清除
添加
添加所有
删除

我相信

示例1-列表作为源:- 注释

  • 这可用于设置和更改/更新adpater所连接的
    ListView
  • 只需在代码中的适当位置调用该方法,例如在活动onCreate、onResume、onItemClick/LongClick之后。
    • e、 g在onCreate中:-
    • mTaskList=this.findviewbyd(R.id.tasklist);//列表视图
    • preptaskskumorraylist()
    • mTaskList.setAdapter(mCustomArrayAdapter)
    • onresume
      just中(与
      onCreate
      中的3行一起使用)
    • preptaskskumorraylist()
  • 我认为这种方式并不常见,通常您会在
    onCreate
    中看到适配器的设置
  • mTasks.addAll(dbhlpr.getAllTasks())是获取源数据的内容
示例2-游标作为源 注释

  • prepCursorListBespoke
    方法的使用方式与示例1相同
  • 可以使用
    notifyDataSetChanged
    代替
    swapCursor
    • 我使用
      swapCursor
      ,因为它更具描述性)
  • 但是,只能对游标使用
    swapCursor

补充 以下更改可能会起作用,大致来说,我已经应用了上面的列表示例

i、 e.
Rsults
onResume
(已添加)调用,它将通知适配器数据已更改

由于代码不足,代码尚未测试。(a
DatabaseHandler
类没有代码,b)DetailsTeacherwebservice
类没有代码)。因此,可能存在错误

查找
/++++…
注释,说明已完成/更改的内容

public class MainActivity extends Activity {
    int attentedncemarkedCount = 0;
    TextView addteacher;
    DatabaseHandler databasehandler;
    DetailsTeacherwebservice details;
    String emis;

    ArrayList<DetailsTeacherwebservice> addas = new ArrayList<DetailsTeacherwebservice>();
    CustomAdapterTeacherWebservice cusadapter;
    ArrayList<DetailsTeacherwebservice> teacherList;
    private ListView listcontent = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.teacherwebservicemainlist);
        addteacher = (TextView) findViewById(R.id.addteachermenu);

        databasehandler = new DatabaseHandler(TeacherWebserviceMainList.this);
        listcontent = (ListView) findViewById(R.id.teacher_list);
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //MOVED  On ItemClickListener block FROM Rsults to here.
        listcontent.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {


            }
        });
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        teacherList = databasehandler.teacherwebserviceList(emis);
        Rsults();
    }

    
    // Probably don't even need onActivityResult
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                String update = data.getStringExtra("update");
                if (update.equals("1")) {
                    //cusadapter.
                    //CustomAdapterTeacherWebservice adapter = new CustomAdapterTeacherWebservice(this, addas);
                    //+++++++++++++++++++++++++++++++++++
                    // Commented out
                    //listcontent.setAdapter(adapter);
                }
            }
        }
    }

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Added onResume to call Rsults
    @Override
    public void onResume() {
        super.onResume();
        Rsults();
    }

    private void Rsults() {
        
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ADDED 4 lines to see if the notifyDataSetChanged is required
        boolean notifydschg_needed = false;
        if (cusadapter != null) {
            notifydschg_needed = true;
        }
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // YOU NEED TO GET THE TEACHER LIST AGAIN AS THE DB HAS CHANGED
        teacherList = databasehandler.teacherwebserviceList(emis);
        
        addas.clear();
        //DatabaseHandler databaseHandler=new DatabaseHandler(this);
        //ArrayList<ArrayList<Object>> data =  databaseHandler.abcTeacherNew();

        for (int p = 0; p < teacherList.size(); p++) {
            details = new DetailsTeacherwebservice();
            //ArrayList<Object> baris = data.get(p);
            details.setId(teacherList.get(p).getId());
            details.setTeachername(teacherList.get(p).getTeachername());
            details.setTeachercnic(teacherList.get(p).getTeachercnic());
            details.setTeacherno(teacherList.get(p).getTeacherno());
            details.setTeachergender(teacherList.get(p).getTeachergender());
            details.setAttendance(teacherList.get(p).getAttendance());
            details.setTeacherattendancedetails(teacherList.get(p).getTeacherattendancedetails());
            details.setAttendancedatesince(teacherList.get(p).getAttendancedatesince());
            details.setAttendancetrasnferschool(teacherList.get(p).getAttendancetrasnferschool());
            addas.add(details);
        }
        
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //Just create the adapter and attach it to the listview once
        if (cusadapter == null) {
            cusadapter = new CustomAdapterTeacherWebservice(TeacherWebserviceMainList.this, addas);
            listcontent.setAdapter(cusadapter);
        }
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Notify the adapter that the data has been changed 
        if(notifydschg_needed) {
            cusadapter.notifyDataSetChanged();
        }
    }
}
公共类MainActivity扩展活动{
int AttentidenceMarkedCount=0;
文本视图和教师;
DatabaseHandler DatabaseHandler;
DetailsTeacherwebservice详细信息;
字符串emis;
ArrayList addas=新的ArrayList();
CustomAdapter每个Web服务cusadapter;
ArrayList教师列表;
私有ListView listcontent=null;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.teacherwebservicemainlist);
addteacher=(TextView)findViewById(R.id.addteachermenu);
databasehandler=新的databasehandler(TeacherWebserviceMainList.this);
listcontent=(ListView)findViewById(R.id.teacher\u列表);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//已将ItemClickListener块从Rsults移到此处。
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
}
});
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
teacherList=databasehandler.teacherwebserviceList(emis);
结果();
}
//可能甚至不需要onActivityResult
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据)
/**
 * Build or rebuild the List of TaskData's, instantiate the
 * Custom Array Adapter if needed and also notify the adapter
 * if the List may have been changed.
 */
private void prepTasksCustomArrayList() {
    // Determine if the adpater needs to be notified of changes
    boolean notify_dataset_changed = (mCsr != null && mCustomArrayAdapter != null);

    // If the List is not null then assume that it has changed
    // otherwise just get the List
    if (mTasks != null) {
        mTasks.clear();
        mTasks.addAll(dbhlpr.getAllTasks());
    } else {
        mTasks = dbhlpr.getAllTasks();
    }
    // If the adapter is null then instantiate it
    if (mCustomArrayAdapter == null) {
        mCustomArrayAdapter = new CustomArrayAdapter(
                this,
                R.layout.taskdata_item,
                mTasks);
    }
    // Notify the adapter that the List has changed
    if (notify_dataset_changed) {
        mCustomArrayAdapter.notifyDataSetChanged();
    }
}
/**
 * Build or rebuild the List via Cursor using the bespoke layout
 */
private void prepCursorListBespoke() {
    boolean swapcursor = (mCsr != null && mCursorAdapter2 != null);
    if (mCursorAdapter2 == null) {
        mCursorAdapter2 = new SimpleCursorAdapter(this,R.layout.taskdata_item,mCsr,
                new String[]{ Datasource.TASKS_ID_COL,
                        Datasource.TASKS_TYPE_COL,
                        Datasource.TASKS_NAME_COL,
                        Datasource.TASKS_OWNER_COL,
                        Datasource.TASKS_EXPIRATION_COL},
                new int[]{R.id.task_id,
                        R.id.task_type,
                        R.id.task_name,
                        R.id.task_owner,
                        R.id.task_expiration},
                0);
    }
    if (swapcursor) {
        mCursorAdapter2.swapCursor(mCsr);
    }
}
public class MainActivity extends Activity {
    int attentedncemarkedCount = 0;
    TextView addteacher;
    DatabaseHandler databasehandler;
    DetailsTeacherwebservice details;
    String emis;

    ArrayList<DetailsTeacherwebservice> addas = new ArrayList<DetailsTeacherwebservice>();
    CustomAdapterTeacherWebservice cusadapter;
    ArrayList<DetailsTeacherwebservice> teacherList;
    private ListView listcontent = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.teacherwebservicemainlist);
        addteacher = (TextView) findViewById(R.id.addteachermenu);

        databasehandler = new DatabaseHandler(TeacherWebserviceMainList.this);
        listcontent = (ListView) findViewById(R.id.teacher_list);
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //MOVED  On ItemClickListener block FROM Rsults to here.
        listcontent.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {


            }
        });
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        teacherList = databasehandler.teacherwebserviceList(emis);
        Rsults();
    }

    
    // Probably don't even need onActivityResult
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                String update = data.getStringExtra("update");
                if (update.equals("1")) {
                    //cusadapter.
                    //CustomAdapterTeacherWebservice adapter = new CustomAdapterTeacherWebservice(this, addas);
                    //+++++++++++++++++++++++++++++++++++
                    // Commented out
                    //listcontent.setAdapter(adapter);
                }
            }
        }
    }

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // Added onResume to call Rsults
    @Override
    public void onResume() {
        super.onResume();
        Rsults();
    }

    private void Rsults() {
        
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // ADDED 4 lines to see if the notifyDataSetChanged is required
        boolean notifydschg_needed = false;
        if (cusadapter != null) {
            notifydschg_needed = true;
        }
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // YOU NEED TO GET THE TEACHER LIST AGAIN AS THE DB HAS CHANGED
        teacherList = databasehandler.teacherwebserviceList(emis);
        
        addas.clear();
        //DatabaseHandler databaseHandler=new DatabaseHandler(this);
        //ArrayList<ArrayList<Object>> data =  databaseHandler.abcTeacherNew();

        for (int p = 0; p < teacherList.size(); p++) {
            details = new DetailsTeacherwebservice();
            //ArrayList<Object> baris = data.get(p);
            details.setId(teacherList.get(p).getId());
            details.setTeachername(teacherList.get(p).getTeachername());
            details.setTeachercnic(teacherList.get(p).getTeachercnic());
            details.setTeacherno(teacherList.get(p).getTeacherno());
            details.setTeachergender(teacherList.get(p).getTeachergender());
            details.setAttendance(teacherList.get(p).getAttendance());
            details.setTeacherattendancedetails(teacherList.get(p).getTeacherattendancedetails());
            details.setAttendancedatesince(teacherList.get(p).getAttendancedatesince());
            details.setAttendancetrasnferschool(teacherList.get(p).getAttendancetrasnferschool());
            addas.add(details);
        }
        
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //Just create the adapter and attach it to the listview once
        if (cusadapter == null) {
            cusadapter = new CustomAdapterTeacherWebservice(TeacherWebserviceMainList.this, addas);
            listcontent.setAdapter(cusadapter);
        }
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        // Notify the adapter that the data has been changed 
        if(notifydschg_needed) {
            cusadapter.notifyDataSetChanged();
        }
    }
}
compile 'org.greenrobot:eventbus:3.0.0'
@Override
public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this); // register event
}

@Override
public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this); // unregister event
}

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(EventBusInfo eventBusInfo) {
    if (eventBusInfo.getProcessId() == 99) {
        // eventBusInfo.getData();
        notifyDataSetChanged();
    }
}
yourButtonFinish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
    finish();
    EventBusInfo event = new EventBusInfo();
    event.setProcessId(99);
    //event.setData(object) //if you want get data back
    EventBus.getDefault().post(event);
    }
});
public class EventBusInfo {
private int processId;
private Object data;

public EventBusInfo(int processId, Object data) {
    this.processId = processId;
    this.data = data;
}

public EventBusInfo() {
}

public EventBusInfo(int processId) {
    this.processId = processId;
}

public Object getData() {
    return data;
}

public void setData(Object data) {
    this.data = data;
}

public int getProcessId() {
    return processId;
}

public void setProcessId(int processId) {
    this.processId = processId;
}
}