【问题标题】:How to Refresh Android List Adapter, so it shows new-added items如何刷新Android列表适配器,使其显示新添加的项目
【发布时间】:2012-07-27 11:21:08
【问题描述】:

我正在做一个项目。它只是显示任务列表并向其中添加新任务。我有 3 节课。一个用于添加,一个用于查看,一个用于保存所有信息(或者我认为是这样)。

我的列表中已经有 2 个任务,并且它们显示正确。

问题是,当我添加一个新任务时,它不会在视图中显示它们。我尝试了许多可能的解决方案:

  • 只需将项目添加到列表中

  • 创建一个新列表,其中包含旧列表中的项目并重建适配器;

  • notifyDataSetChanged(); 与 add() 命令一起使用;

这是我的代码,有点乱,但我希望你能弄清楚。

AndroidListAdapterActivity 类:

public class AndroidListAdapterActivity extends ListActivity {
    /** Called when the activity is first created. */
    Button b1;
    Lista o;
    ArrayAdapter aa;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    b1=(Button)findViewById(R.id.add);
    Log.w("POC", "PA OVO SE ZOVE SVAKI PUT");
    o=new Lista();
    o.lis.add("S1");
    o.lis.add("S2");
   aa = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, o.lis);
    setListAdapter(aa);

    b1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(AndroidListAdapterActivity.this, Dodavanje.class);
            startActivity(i);
        }
    });

}


@Override
public void onResume(){
    super.onResume();
    aa.notifyDataSetChanged();
    if(o.broj>=2){
        aa=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, o.lis2);
        setListAdapter(aa);
        Log.w("myApp", "CALLED TOO");
    }
    String yt=String.valueOf(o.ses);
    Log.w("teras", yt);
    aa.notifyDataSetChanged();

    Log.w("myApp", "CaLLED!!!!!!!!!!!!!");
    String fx= String.valueOf(o.broj);
    Log.w("myAPPe", fx);

}


@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
}    
  }

Dodavanje(添加):

public class Dodavanje extends Activity {

Button but;
Button but2;
EditText et;
Lista o;
AndroidListAdapterActivity www;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dodavanje);
    but= (Button)findViewById(R.id.bb);
    but2= (Button)findViewById(R.id.bc);
    et=(EditText)findViewById(R.id.tt); 
    www=new AndroidListAdapterActivity();

    o = new Lista();

    but.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings("unchecked")
        @Override
        public void onClick(View arg0) {

            String t1= et.getText().toString();
            //o.lis.add(t1);    
            o.lis2.addAll(o.lis);
            o.lis2.add(t1);
            o.lis.add(t1);
            o.ses=true;
            Log.w("IZVJESTAJ: ", String.valueOf(o.ses));
            o.broj++;
            String fx=String.valueOf(o.broj);
            Log.w("Izbacaj",fx);
            et.setText("");
        }
    });

    but2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            finish();
        }
    });
}
  }

列表(列表):

public class Lista extends Application {

ArrayList<String> lis=new ArrayList<String>();
ArrayList<String> lis2=new ArrayList<String>();
int broj =1;
boolean ses= false; 
 }

【问题讨论】:

    标签: java android android-arrayadapter


    【解决方案1】:

    每次数据变化时都必须使用。

    aa.notifyDataSetChanged();
    

    【讨论】:

      【解决方案2】:

      您可以使用 notifyDataSetChanged() 方法来更新您的列表视图。在您的情况下,您可以使用。

      aa.notifyDataSetChanged();
      

      请尝试这种方式....

      public class MainActivity extends Activity {
      
      ListView lView;
      Button btnAdd;  
      
      private ListView mainListView ;  
      private ArrayAdapter<String> listAdapter ;  
      
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);          
      
          mainListView = (ListView) findViewById( R.id.listView1 ); 
          btnAdd = (Button)findViewById(R.id.button1);
      
          // Create and populate a List of alphabet names.  
          String[] alphabets = new String[] { "A", "B", "C", "D",  
                                            "E", "F", "G", "H"};    
          ArrayList<String> alphabetsList= new ArrayList<String>();  
          alphabetsList.addAll( Arrays.asList(alphabets) );  
      
          // Create ArrayAdapter using the for the list.  
          listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, alphabetsList);  
      
      
          // Set the ArrayAdapter as the ListView's adapter.  
          mainListView.setAdapter( listAdapter );      
          btnAdd.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View arg0) {
                  // TODO Auto-generated method stub
      
      // Here I am adding more alphabets in the list on the listener of add button.
                  listAdapter.add( "I" );  
                  listAdapter.add( "J" );  
                  listAdapter.add( "K" );  
                  listAdapter.add( "L" );  
                  listAdapter.add( "M" );  
              }
          });       
         }
       }
      

      【讨论】:

      • @user1462326 我已经改变了我的帖子看看。试试这种方式而不是把事情复杂化。让我知道结果是什么。
      • 我知道你在那里做了什么。我知道演习。唯一的区别是我正在使用另一个活动来添加新项目。活动,有它自己的看法。我理解你的代码,很简单,我做过很多次这样的事情。但在这种情况下,事情并不顺利
      【解决方案3】:

      目前提出的解决方案有效,但取决于您设备的 Android 版本。例如,要使用 AddAll 方法,您必须将 android:minSdkVersion="10" 放入您的 android 设备中。

      为了解决所有设备的这个问题,我在适配器中创建了自己的方法,并在继承自 ArrayAdapter 的 add 和 remove 方法中使用,该方法可以毫无问题地更新数据。

      我的代码:使用我自己的数据类 RaceResult,您使用自己的数据模型。

      ResultGpRowAdapter.java

      public class ResultGpRowAdapter extends ArrayAdapter<RaceResult> {
      
          Context context;
          int resource;
          List<RaceResult> data=null;
      
              public ResultGpRowAdapter(Context context, int resource, List<RaceResult> objects)           {
              super(context, resource, objects);
      
              this.context = context;
              this.resource = resource;
              this.data = objects;
          }
      
      
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
      
              ........
              }
      
              //my own method to populate data           
              public void myAddAll(List<RaceResult> items) {
      
              for (RaceResult item:items){
                  super.add(item);
              }
          }
      

      ResultsGp.java

      public class ResultsGp extends Activity {
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      
          ...........
          ...........
          ListView list = (ListView)findViewById(R.id.resultsGpList); 
      
          ResultGpRowAdapter adapter = new ResultGpRowAdapter(this,  R.layout.activity_result_gp_row, new ArrayList<RaceResult>()); //Empty data
      
         list.setAdapter(adapter);
      
         .... 
         ....
         ....
         //LOAD a ArrayList<RaceResult> with data
      
         ArrayList<RaceResult> data = new ArrayList<RaceResult>();
         data.add(new RaceResult(....));
         data.add(new RaceResult(....));
         .......
      
         adapter.myAddAll(data); //Your list will be udpdated!!!
      

      【讨论】:

        【解决方案4】:

        extends BaseAdapter 类,覆盖notifyDataSetChanged(); 方法。
        请看下面的代码:

            @Override
            public void notifyDataSetChanged() {
                super.notifyDataSetChanged();
                list.addAll();//--insert object to list
            }
        

        Activity onResume()方法中调用notifyDataSetChanged();方法,像这样:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-24
          • 1970-01-01
          • 2015-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          相关资源
          最近更新 更多