11

私はプロジェクトに取り組んでいました。タスクのリストを表示し、それに新しいタスクを追加しているだけです。私は3つのクラスを持っています。1つは追加用、もう1つは表示用、もう1つはすべての情報を保持するためのものです(またはそう思います)。

リストにはすでに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; 
 }
4

4 に答える 4

8

データが変更されるたびに使用する必要があります。

aa.notifyDataSetChanged();
于 2012-07-27T11:26:18.420 に答える
4

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" );  
        }
    });       
   }
 }
于 2012-07-27T11:27:02.800 に答える
3

これまでに提案されたソリューションは機能しますが、デバイスのAndroidバージョンによって異なります。たとえば、AddAllメソッドを使用するには、Androidデバイスにandroid:minSdkVersion="10"を配置する必要があります。

すべてのデバイスについてこの質問を解決するために、アダプターで独自のメソッドを作成し、Addおよびremoveメソッド内で使用して、問題なくデータを更新するArrayAdapterから継承します。

私のコード:私自身のデータクラス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!!!
于 2014-06-19T21:23:02.897 に答える
2

extends BaseAdapterクラス、オーバーライドnotifyDataSetChanged();メソッド。
以下のスニップコードを参照してください。

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

notifyDataSetChanged();次のように、メソッドでメソッドを呼び出しますActivity onResume()

@Override
protected void onResume() {
   super.onResume();
   ((BaseAdapter)getListAdapter()).notifyDataSetChanged();
}
于 2013-06-27T02:02:37.203 に答える