2016-09-25 3 views
1

Ich habe zwei pojo Klassen, nämlich PostFeed und SessionFeedWie man ArrayList von verschiedenen Arten von Objekten macht?

PostFeed.class

public class PostFeed implements Parcelable{ 

private int pid; 
private int uid; 
private String link; 
private String title; 
private String description; 
private int up; 
private int comment_count; 
private String postPicUrl; 
private Date dop; 
private String user_name; 
private String user_pic; 
private String user_status; 
private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
//getters and setters 
} 

SessionFeed.class

public class SessionFeed implements Parcelable{ 
private String session_title; 
private String session_image; 
private String session_description; 
private int session_id; 
private String s_venue; 
private String s_coordinator; 
private String s_c_email; 
private String s_c_phone; 
private String resource_person; 
private String rp_desg; 
private String time_and_date; 
private String address; 
private String room; 
private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
private Date Dosp; 
String user_name; 
int uid; 
String user_status; 
String user_pic; 
// getters and setters 
} 

Ich versuche, eine Suchaktivitäten zu schaffen, Durchsucht die Daten aus der MySqlite-Datenbank. Es gibt zwei getrennte Tabellen für jeden Typ, d. H. PostFeedTable und SessionFeedTable in zwei verschiedenen Datenbanken.

In meiner Datenbank-Operationen Klasse, das ist, was ich Rückkehr:

public ArrayList<PostFeed> readPostForSearch(String searchText, DatabaseOperations dop){ 
    SQLiteDatabase sqLiteDatabase = dop.getReadableDatabase(); 
    ArrayList<PostFeed> newsFeedList = new ArrayList<>(); 
    String query ="select * from " + html_test_const.getTable_name() + " where " + html_test_const.getTitle() +" LIKE '%"+searchText+"%' OR "+ html_test_const.getDescription() + " LIKE '%"+searchText+"%'"+" order by date desc " +";"; 
    Cursor cursor = sqLiteDatabase.rawQuery(query,null); 
    if (cursor != null && cursor.moveToFirst()) { 
     L.m("loading entries " + cursor.getCount() + new Date(System.currentTimeMillis())); 
     do { 

      //create a new object and retrieve the data from the cursor to be stored in this object 
      PostFeed postFeed = new PostFeed(); 
      postFeed.setTitle(cursor.getString(cursor.getColumnIndex(html_test_const.getTitle()))); 
      postFeed.setLink(cursor.getString(cursor.getColumnIndex(html_test_const.getLink()))); 
      postFeed.setDescription(cursor.getString(cursor.getColumnIndex(html_test_const.getDescription()))); 
      long dateOfPost = cursor.getLong(cursor.getColumnIndex(html_test_const.getDate())); 
      postFeed.setDop(new java.sql.Date(dateOfPost)); 
      postFeed.setUser_name(cursor.getString(cursor.getColumnIndex(html_test_const.getUser_name()))); 
      postFeed.setPid(cursor.getInt(cursor.getColumnIndex(html_test_const.getSr_key()))); 
      postFeed.setUp(cursor.getInt(cursor.getColumnIndex(html_test_const.getUp_down()))); 
      postFeed.setComment_count(cursor.getInt(cursor.getColumnIndex(html_test_const.getComment_count()))); 
      postFeed.setUid(cursor.getInt(cursor.getColumnIndex(html_test_const.getUid()))); 
      postFeed.setPostPicUrl(cursor.getString(cursor.getColumnIndex(html_test_const.getPost_pic()))); 
      postFeed.setUser_pic(cursor.getString(cursor.getColumnIndex(html_test_const.getUser_pic()))); 
      postFeed.setUser_status(cursor.getString(cursor.getColumnIndex(html_test_const.getUser_status()))); 
      newsFeedList.add(postFeed); 

     } while (cursor.moveToNext()); 
    } 

    return newsFeedList; 
} 

Dies ist das gleiche für die Sitzungsdatenbankoperationen mit entsprechenden Variablen.

SearchActivity enthält eine Recycler-Ansicht, deren Adapter eine ArrayList akzeptiert, und legt diese Liste fest, die außerdem zwei Arten von Zeilenelementen enthält.

Frage: Wie eine Arraylist erstellen, die diese beiden Arten von Gegenständen enthalten und wie weiter Recycler Ansicht zeigt diese beiden Arten von Objekten aus der Arraylist zu machen.

Wenn Sie weitere Erläuterungen benötigen, lassen Sie es mich wissen. Danke im Voraus.

+2

Sie können ein Objekt c erstellen, das beide Objekte a und b enthält. Dann erstellen Sie eine Arraylist von c. – nikka

+0

Klingt wirklich einfach, können Sie bitte mit Code-Schnipsel helfen? @nikka –

+0

Eine Antwort hinzugefügt, bitte kommentieren, wenn Sie in der Lage sind, das gleiche zu verwenden oder nicht – nikka

Antwort

4
public class Feeds implements Parcelable{ 

private PostFeed postFeed; 
private SessionFeed sessionFeed; 

Public Feeds(PostFeed postfeed, SessionFeed sessionfeed){ 
this.postFeed = postfeed 
this.sessionFeed = sessionfeed 
} 
} 

Und dann Array Liste des Feeds wird das Problem lösen.

Und

for(int i=0: i<postfeedArraylist.size; i ++) 
    feedsArraylist.add(new Feeds(postfeedArraylist.get(i), null); 

Wiederholen gleiche gilt für auch für sessionfeedArraylist Schleife.

+0

Was ist mit Datenbankoperationen? Wie man auf die gespeicherten Daten unter Verwendung von oben zugreift. In erster Linie: Ich greife auf meine Daten aus der Datenbank. –

+0

Holen Sie sich zwei verschiedene Arraylisten von Postfeed und Sessionfeed, dann legen Sie sie einfach Feeds Arraylist. Also für jedes Mitglied von Feeds entweder Postfeed ist null von Sessionfeed wird null sein. – nikka

+0

@AsifAli aktualisiert meine Antwort, bitte überprüfen. – nikka

0

Sie haben Parcelable interface implementiert und somit können Sie die Liste dieser interface schaffen, die für die Speicherung von sowohl implemented class object verwendet werden kann.

ArrayList<Parcelable> pList = new ArrayList<>(); 
+0

Können Sie bitte mit Code-Schnipsel ausarbeiten? –

+0

'pList.add ((Parcelable) sessionFeed); pList.add ((Parcelable) postFeed); ' – user1506104

+0

Ich verstehe, was Sie gerade gezeigt haben, aber bitte gehen Sie durch die Frage, wie mache ich Datenbankoperationen und schließlich eine Liste oder Array-Liste, die ich an meinen Adapter senden. Bitte versuchen Sie es zu vertiefen und weiter auszuarbeiten. –

1

Da es zwischen den beiden scheinbar nicht viel gibt, obwohl Sie ähnliche Namen teilen, können Sie auch ein neues Objekt erstellen, das eine PostFeed und SessionFeed enthält.

class FeedHolder implements Parcelable { 

    private final List<PostFeed> postFeeds; 
    private final List<SessionFeed> sessionFeeds; 

    FeedHolder(@NonNull List<PostFeed> postFeeds,@NonNull List<SessionFeed> sessionFeeds) { 
     this.postFeeds = postFeeds; 
     this.sessionFeeds = sessionFeeds; 
    } 

    List<SessionFeed> getSessionFeeds() { 
     return sessionFeeds; 
    } 

    List<PostFeed> getPostFeeds() { 
     return postFeeds; 
    } 

    //If you're using this data in an adapter, knowing the total 
    //size of both lists might be helpful. 
    int getTotalFeedCount() { 
     return postFeeds.size() + sessionFeeds.size(); 
    } 

} 

//... 

List<SessionFeed> sessionFeeds = //whatever you do to populate your 
//List of SessionFeeds... 
List<PostFeed> postFeeds = //Same again. 
FeedHolder feedHolder = FeedHolder(postFeeds, sessionFeeds); 
+0

Was ist mit Datenbankoperationen? Wie man auf die gespeicherten Daten unter Verwendung von oben zugreift. In erster Linie: Ich greife auf meine Daten aus der Datenbank zu –

+0

Ich habe ein paar Änderungen an dieser 'FeedHolder'-Klasse vorgenommen, die für Ihre Situation relevanter sein könnte. Wie du willst. – PPartisan

1

Ich denke, was Nikka vorschlägt, ist korrekt. Die Verbesserung auf sich, verwenden Sie die unten Klasse für Ihren Adapter

public class Feed implements Parcelable{ 

    private PostFeed postFeed; 
    private SessionFeed sessionFeed; 

    public Feed(PostFeed feed){ 
     this.postFeed = feed; 
    } 

    public Feed(SessionFeed feed){ 
     this.sessionFeed = feed; 
    } 

    //returns true for session feed type 
    public boolean isSessionFeed(){ 
     return sessionFeed!=null; 
    } 

    public SessionFeed getSessionFeed(){ 
     return sessionFeed; 
    } 

    public PostFeed getPostFeed(){ 
     return postFeed; 
    } 

} 

Und in Ihrer Datenbank Hilfsmethode, kehrt Liste der Feed-Objekte.

Wiederholen Sie das gleiche für sessionFeeds und fügen Sie diese Liste aus der Datenbank in die Liste Ihres Adapters ein.Beim Einstellen der Ansicht den Typ mit isSessionFeed() überprüfen und die Ansichten entsprechend einstellen. Ich hoffe es hilft.

+0

Wenn du mir wirklich helfen willst, lass uns den Adapter machen? Hilf mir, Adapter für mehrere Ansichten zu machen. Ich kann getItemViewType() nicht tun. –

+0

Ich habe meine Suchergebnisse aus der Datenbank in einer ArrayList , jetzt, wie Sie Dinge in Adapter einrichten –

Verwandte Themen