2012-04-11 9 views
0

Guys Ich benutze eine einfache Listview. Ich habe zwei Aktivitäten eine Haupt-und eine zweite Freund hinzufügen In der zweiten Aktivität Ich nehme die Benutzer-ID des Freundes in Textfeld und Hinzufügen dieser Zeile in die Datenbank und die Aktualisierung der Arraylist. Wenn ich zur Hauptaktivität zurückkomme, rufe ich die Funktion notifyDataSetChanged() in onResume() auf und ich protokolliere auch den arraylist -Wert. Arraylist ist sehr gut und auch die Zeile ist in der Datenbank eingefügt, aber Listview wird nicht aktualisiert. Ich donno das Problem plz helfen. Hier ist d-Code.Arrayadapter wird beim Aufruf von notifydatasetchanged nicht geändert()

public class VayuActivity extends Activity { 
    /** Called when the activity is first created. */ 
    static boolean first_time=true; 
    ListView friend_list; 
    public static List<String> al; 
    public ArrayAdapter<String> aa; 
    String dummyfriends[]={"prashant","monika","pramod","dhara"}; 
    public static MessengerDataSource mds; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
/*  if(first_time==true) 
     { 
      first_time=false; 
      setContentView(R.layout.registration); 
     } 
     else */ 
      setContentView(R.layout.main); 

     al=new ArrayList<String>(); 
     for(String i:dummyfriends) 
      al.add(i); 

     aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, al); 

     friend_list=(ListView) findViewById(R.id.friend_list); 

     friend_list.setAdapter(aa); 

     mds= new MessengerDataSource(getApplicationContext()); 

     mds.open(); 

     System.out.println("I m in oncreate"); 

    } 

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

     al=mds.getFriends(); 
     aa.notifyDataSetChanged(); 

     System.out.println("I m in on resume function"); 
     System.out.println("Value of arraylist in on resume fun"+al); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     System.out.println("I m in onpause function"); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 


     MenuInflater mi=getMenuInflater(); 
     mi.inflate(R.menu.mainmenu, menu); 

     return true; 





    } 



    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch(item.getItemId()) 
     { 
     case R.id.add_friend: 
      //Toast.makeText(this, "Add Friend", 2000).show(); 
      Intent i=new Intent(VayuActivity.this,AddFriendActivity.class); 
      startActivity(i); 
      break; 

     case R.id.remove_friend: 
      Toast.makeText(this, "Remove Friend", 2000).show(); 
      break; 

     } 


     return true; 
    } 
} 



package com.pdd.vayu; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class AddFriendActivity extends Activity implements OnClickListener{ 

    EditText et; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.addfriend); 

     et=(EditText) findViewById(R.id.E_friendadd); 

     Button b=(Button) findViewById(R.id.add_friend_button); 
     b.setOnClickListener(this); 
    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     String userid=et.getText().toString(); 
     //VayuActivity.al.add(f); 
     Friend f=new Friend(); 
     f.setUserid(userid); 
     f.setFname("pratik"); 

     VayuActivity.mds.addFriend(f); 
     VayuActivity.al=(ArrayList<String>) VayuActivity.mds.getFriends(); 
     System.out.println(VayuActivity.al); 
     //VayuActivity.aa.notifyDataSetChanged(); 
    } 
} 

Datenbank Klassen

package com.pdd.vayu; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 

public class MessengerDataSource { 

    private SQLiteDatabase database; 
    private MyDatabaseHelper mydbh; 

    public static String USER_ID="userid"; 
    public static String F_NAME="fname"; 
    public static String CHAT_COUNT="chat_count"; 

    public static String M_TEXT="mtext"; 
    public static String SENDER="sender"; 
    public static String RECEIVER="receiver"; 
    public static String M_TYPE="type"; 



    public MessengerDataSource(Context c) 
    { 
     mydbh=new MyDatabaseHelper(c); 
    } 

    public void open() 
    { 
     try 
     { 
      database=mydbh.getWritableDatabase(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getLocalizedMessage()); 
     } 
    } 

    public void close() { 
     mydbh.close(); 
    } 

    public void addFriend(Friend f) 

    { 
     ContentValues cv = new ContentValues(); 
     cv.put(USER_ID,f.getUserid()); 
     cv.put(F_NAME, f.getFname()); 
     cv.put(CHAT_COUNT, f.getChat_count()); 

     try 
     { 
      database.insert(MyDatabaseHelper.TABLE_FRIEND, null, cv); 
     } 
     catch(Exception e) 
     { 
      System.out.println("Error while inserting "+e.getLocalizedMessage()); 
     } 

    } 

    public void addMessage(Message m) 

    { 
     ContentValues cv = new ContentValues(); 
     cv.put(M_TEXT, m.getText()); 
     cv.put(SENDER,m.getSender()); 
     cv.put(RECEIVER,m.getReceiver()); 
     cv.put(M_TYPE, m.getType()); 


     database.insert(MyDatabaseHelper.TABLE_MESSAGE, null, cv); 
    } 

    public void deleteFriend(String fname) 
    { 
     database.delete(MyDatabaseHelper.TABLE_FRIEND,F_NAME+"="+fname , null); 

    } 

    public void deleteMessage(String text) 

    { 
     database.delete(MyDatabaseHelper.TABLE_FRIEND,M_TEXT+"="+text , null); 
    } 

    public List<String> getFriends() 

    { 
     List<String> friends= new ArrayList<String>(); 
     Cursor c=null; 
     try 
     { 
     c=database.query(MyDatabaseHelper.TABLE_FRIEND, new String[]{F_NAME}, null, null, null, null,CHAT_COUNT); 
     } 
     catch(Exception e){System.out.println("Error while retrieving frnds list"+e.getLocalizedMessage()); 
     } 

     if(c.moveToFirst()) 
     { 
      do 
      { 
       String friend=c.getString(c.getColumnIndex(F_NAME)); 
       friends.add(friend); 
      } 
      while(c.moveToNext()); 
     } 




     return friends; 
    } 

    public List<String> getMessages(String from) 

    { 
     List<String> messages= new ArrayList<String>(); 

     String where=SENDER+"="+from; 

     Cursor c=database.query(MyDatabaseHelper.TABLE_MESSAGE, new String[]{M_TEXT},where , null, null, null,null); 

     if(c.moveToFirst()) 
     { 
      do 
      { 
       String message=c.getString(c.getColumnIndex(M_TEXT)); 
       messages.add(message); 
      } 
      while(c.moveToNext()); 
     } 


     return messages; 
    } 




} 

Database Helper

package com.pdd.vayu; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class MyDatabaseHelper extends SQLiteOpenHelper { 


    public static String TABLE_FRIEND="friend"; 

    public static String TABLE_MESSAGE="message"; 

    public static String CREATE_FRIEND="create table if not exists "+ 
    TABLE_FRIEND+" (userid varchar primary key,fname varchar,chat_count int);"; 

    public static String CREATE_MESSAGE="create table if not exists "+ 
    TABLE_MESSAGE+"(mid integer primary key autoincrement," + 
    "mtext varchar," +"sender varchar , receiver varchar , type varchar)"; 

    //public static String TABLE_FRIENDS="friends"; 

    public static String DB_NAME="MessengerDB.db"; 

    Context context; 


    public MyDatabaseHelper(Context context) { 
     super(context, DB_NAME, null, 1); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     db.execSQL(CREATE_FRIEND); 
     db.execSQL(CREATE_MESSAGE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

} 

Pls helfen

+0

müssen Sie a1 Daten erneut in arrayadpter in onresume() setzen. – Newts

+0

Ich tat tat nur in dieser Linie al = mds.getFriends(); – Pratik

+0

In List Arrayadpter nicht aktualisieren, wenn seine geänderten Daten nicht erneut in adpter einfügen, also versuchen Sie es wie oncreate Methode aa = new ArrayAdapter (this, android.R.layout.simple_list_item_1, al); – Newts

Antwort

0

Für notifyDataSetChanged() zu arbeiten, können Sie das Objekt in den ArrayAdapter hinzufügen muss selbst es hinzufügen/entfernen Methoden und nicht die tatsächliche Liste.

Ihre onResume sollte wie folgt aussehen:

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

    //al=mds.getFriends(); 
    aa.clear(); 
    aa.addAll(mds.getFriends()); 
    aa.notifyDataSetChanged(); 

    System.out.println("I m in on resume function"); 
    System.out.println("Value of arraylist in on resume fun"+al); 
} 

Die ArrayAdapter erstellt eine Kopie der Liste, wenn eingeleitet, so beim Aufruf notifyDataSetChanged es sieht nur in einem eigenen Kopie, nicht auf die Quellenliste.

0

Sie haben notifyDataSetChanged() -Methode wie diese

Irgendwann versuchen i t lädt Daten nicht, wenn Sie keine neuen Daten in adpter laden, also bevor Sie diese aufrufen, müssen Sie Daten in arrayadpter in onresume() - Methode statt onCreate() laden.

public void refresh() 
    { 

     mHandler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 

       ((EfficentAdapter)list.getAdapter()).notifyDataSetChanged(); 
       }   
     }, 100); 

    } 
Verwandte Themen