通过活动 1 时刷新活动 2 中的列表视图

Posted

技术标签:

【中文标题】通过活动 1 时刷新活动 2 中的列表视图【英文标题】:Refresh list view in activity 2 when going through acitivity 1 【发布时间】:2014-04-07 06:10:44 【问题描述】:

在我的应用程序中有两个活动,在第二个活动中有列表视图。列表视图正在使用自定义光标适配器填充。

我的要求是当我从活动 1 转到第二个活动时,我希望填充第二个活动中的列表视图。

我尝试过的:

    为第二个活动创建对象并尝试但未成功还发现为活动类创建对象是错误的,因为活动类在内部被视为线程。所以这种方式我无法继续。 从第二个活动的构造函数调用列表视图,但是当我将参数作为构造函数和上下文传递时。我遇到了异常

注意:我无法在此处提供 logcat。

下面是代码。

主要活动:

package com.example.testdb;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Database d=new Database(this);

final Button A = (Button) findViewById(R.id.button1);

A.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                intent i=new intent(v.this,abc.class)
        startactivity(i);

            
        );


    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    


第二个活动:

public class abc extends Activity

    
    String getentry;
    private int storeID=0;
    DatabaseObject d;
    StockTable st;
    private String getstocks;
    public Cursor a1;
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stockmanager);
        d=new DatabaseObject(getApplicationContext());
        st=new StockTable(getApplicationContext());
    final Button AddStock=(Button) findViewById(R.id.button1);
         final EditText entry=(EditText) findViewById(R.id.editText1);
        final Button BroDetail=(Button) findViewById(R.id.button2);
        final ListView popstocks=(ListView) findViewById(R.id.listView1);

        AddStock.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub

                getentry=entry.getText().toString();
                //st.insert(getentry);
                System.out.println(getentry);
                //d.db.rawQuery(st.select(), null);
                d.d.db.insert(st.tablename, null,st.insert(getentry));
                //populatelist populatestocks=new populatelist();

                getstocks="Select " + st.column1 + " as _ID, " + st.column2 + " From "+ st.tablename;
                 System.out.println(getstocks);
                a1=d.d.db.rawQuery(getstocks, null);
                if(a1.moveToNext())

                    System.out.println(a1.getCount());  
                
                else
                    System.out.println("can't open database");
                

                poplist populatestocks=new poplist(getApplicationContext(),a1) ;
                popstocks.setAdapter(populatestocks);

            
        );
                


    public class poplist extends CursorAdapter

        public poplist(Context context, Cursor c) 
            super(context, c);
            // TODO Auto-generated constructor stub
        
        //StockTable st1=new StockTable(getApplicationContext());
        //Database d1=new Database(getApplicationContext());


        @Override
        public void bindView(View view, Context context, Cursor c) 
            // TODO Auto-generated method stub
            final CheckBox cb=(CheckBox) view.findViewById(R.id.checkBox1);
            final Button view1=(Button) view.findViewById(R.id.button1); 

            if(c.moveToFirst())

                //cb.setText(a1.getString(a1.getColumnIndex(st1.column2)));
                    //do
                        //cb.setText(a1.getString(a1.getColumnIndexOrThrow(st.column2)));
                cb.setText(c.getString(1));
                //  while (a1.moveToNext());

                

        

        @Override
        public View newView(Context context, Cursor c, ViewGroup parent) 
            // TODO Auto-generated method stub
            LayoutInflater inflater = LayoutInflater.from(context);

            View v = inflater.inflate(R.layout.stocklist, parent, false);
                    bindView(v, context, c);
                   return v;
//          return null;
        


    

    public void Declerations()


    



当我使用意图从活动一中获得指示时,如何刷新第二个活动中的列表视图?

【问题讨论】:

startactivity(i);改变这个。你想在添加数据库后在列表中显示元素吗?如果是,请尝试 youradapter.notifyDataSetChanged() 实际上我的列表视图在活动 2 中我可以在活动 1 中使用它吗 【参考方案1】:

您是否尝试过使用 Intent 附加功能? 像这样:

Intent i = new Intent(this, abc.class);
i.putExtra("loadData", true);
i.putExtra("data", listData);
//add any data you need
...
startActivity(i);

然后在活动abc中检查onCreateonResume中是否有传递的数据

Bundle data = getIntent().getExtras();
if(data != null) 
    //get the data
    boolean loadData = data.getBoolean("loadData");
    ...

编辑: 您需要在第二个活动的onCreate 中填写您的列表。 如果屏幕方向发生变化,使用onSaveInstanceStateonRestoreInstanceState 保存/恢复数据也很有用。 检查这个:http://developer.android.com/training/basics/activity-lifecycle/recreating.html

【讨论】:

感谢您的回答@Boban,但我想在第二个活动中填充列表视图,并且数据库数据也在第二个活动中。一旦我打开第二个活动,我需要显示列表视图。我怎样才能做到这一点? 从数据库中获取所有数据然后创建适配器并在listview上设置 就像@mukesh 说的,在onCreate 获取数据并填充列表。 感谢@Mukesh 和@Boban S 的建议。当我在第二次活动的onCreate 中创建它时,它起作用了...用此声明更新您的答案.. 将接受它作为回答。

以上是关于通过活动 1 时刷新活动 2 中的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

在选项卡中的列表视图中刷新活动 (Android)

当应用程序变为活动状态时刷新 tableView

从联系人意图添加联系人后如何刷新列表视图?

在 notifyDataSetChanged 后视图寻呼机不刷新

未创建 Android listview 内容视图

通过第二个活动从数据库传递列表视图的项目位置