Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8491031
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 10, 20262026-06-10T22:17:52+00:00 2026-06-10T22:17:52+00:00

I’m using a SimpleCursorAdapter and a ListView to show some data loaded with a

  • 0

I’m using a SimpleCursorAdapter and a ListView to show some data loaded with a Loader.
Inside the cursor I have items with a int that goes from 0 to 3.

I want the items with this int equals to 0-1 to have a layout (right aligned, one color) and item with 2-3 to have another layout (left aligned, another color).
much like a chat app, where sent messages are on the right and received ones are on the left.

Is there a simple way to do it? Something like a switch where with 0-1 I inflate layout_1 and 2-3 I inflate layout_2.

EDIT: I’ve added the code of the ListFragment i’m trying to populate. The int to use as a switch is MyContentProvider.Data.E_TYPE.
I can’t get the hang of it, but maybe someone can explain clearly what i have to write!

   import com.actionbarsherlock.view.Menu;
   import com.actionbarsherlock.view.MenuInflater;
   import com.corsalini.survcontr.MyContentProvider.Data;

   import android.content.ContentResolver;
   import android.content.ContentValues;
   import android.database.Cursor;
   import android.os.Bundle;
   import android.support.v4.app.ListFragment;
   import android.support.v4.content.CursorLoader;
   import android.support.v4.app.LoaderManager;
   import android.support.v4.content.Loader;
   import android.support.v4.widget.CursorAdapter;
   import android.support.v4.widget.SimpleCursorAdapter;
   import android.util.Log;
   import android.view.View;
   import android.widget.ListView;



  public class FragEvents extends ListFragment implements  LoaderManager.LoaderCallbacks<Cursor>{
@Override
public void onPause() {
    allRead();
    super.onPause();

}

private static final int EVENTS_LOADER = 0x02;

// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;

// If non-null, this is the current filter the user has provided.
String mCurFilter;

@Override public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // Give some text to display if there is no data.  In a real
    // application this would come from a resource.
    setEmptyText(this.getString(R.string.perform_event)); 

    // We have a menu item to show in action bar.
    setHasOptionsMenu(true);

    // Create an empty adapter we will use to display the loaded data.
    mAdapter = new SimpleCursorAdapter(getActivity(),
            android.R.layout.simple_list_item_2, null,
            new String[] { MyContentProvider.Data.E_TEXT, MyContentProvider.Data.E_DATE, 
        MyContentProvider.Data.E_NUMBER, MyContentProvider.Data.E_TYPE  },
        new int[] { android.R.id.text1, android.R.id.text2 },
        CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    setListAdapter(mAdapter);

    // Start out with a progress indicator.
    setListShown(false);

    // Prepare the loader.  Either re-connect with an existing one,
    // or start a new one.
    getActivity().getSupportLoaderManager().initLoader(EVENTS_LOADER, null, this);


}

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     inflater.inflate(R.menu.menu_events, menu);  
}



@Override public void onListItemClick(ListView l, View v, int position, long id) {
    //TODO Insert desired behavior here.
    Log.i("FragmentComplexList", "Item clicked: " + id);
}

// These are the Contacts rows that we will retrieve.
static final String[] SUMMARY_PROJECTION = new String[] {
    MyContentProvider.Data.E_ID,
    MyContentProvider.Data.E_DATE,
    MyContentProvider.Data.E_NUMBER,
    MyContentProvider.Data.E_TEXT,
    MyContentProvider.Data.E_TYPE,

};

public Loader<Cursor> onCreateLoader(int id, Bundle args) {


    return new CursorLoader(getActivity(),  MyContentProvider.Data.CONTENT_URI_EVENTS,
            SUMMARY_PROJECTION, null, null,
            Data.E_ID + " DESC");
}

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // Swap the new cursor in.  (The framework will take care of closing the
    // old cursor once we return.)
    mAdapter.swapCursor(data);

    // The list should now be shown.
    if (isResumed()) {
        setListShown(true);
    } else {
        setListShownNoAnimation(true);
    }
}

public void onLoaderReset(Loader<Cursor> loader) {
    // This is called when the last Cursor provided to onLoadFinished()
    // above is about to be closed.  We need to make sure we are no
    // longer using it.
    mAdapter.swapCursor(null);
}

public void deleteEvent(ContentResolver contentResolver,
        long id){
    String selection = Data.E_ID + "=";
    String[] args = {String.valueOf(id)};
    contentResolver.delete(Data.CONTENT_URI_EVENTS, selection, args);
}

public void allRead(){
    ContentResolver contentResolver = getActivity().getContentResolver();
    ContentValues contentValue = new ContentValues();
    contentValue.put(Data.E_NUMBER, Data.RECEIVED_READ);
    String selection= Data.E_TYPE+"=";
    String[] args= {String.valueOf(Data.RECEIVED_UNREAD)};
    contentResolver.update(Data.CONTENT_URI_EVENTS, contentValue, selection, args);
}



   }

EDIT: if I got it right my final EventsAdapter (which extends SimpleCursorAdapter) should look like this:

    import android.content.Context;
    import android.database.Cursor;
    import android.support.v4.widget.SimpleCursorAdapter;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    public class EventsAdapter extends SimpleCursorAdapter {

private Context localContext;

public EventsAdapter(Context context, int layout, Cursor c, String[] from,
        int[] to, int flags) {
    super(context, layout, c, from, to, flags);

    localContext = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Cursor c= getCursor();
    c.moveToPosition(position);
    if(convertView == null)
    {
        LayoutInflater layoutInflator = (LayoutInflater)localContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        switch (getItemViewType(position)){
        case 0:
            convertView = layoutInflator.inflate(R.layout.item_event_0, null);
            break;
        case 1:
            convertView = layoutInflator.inflate(R.layout.item_event_1, null);
            break;
        case 2:
            convertView = layoutInflator.inflate(R.layout.item_event_2, null);
            break;
        case 3:
            convertView = layoutInflator.inflate(R.layout.item_event_3, null);
            break;
        }

    }
    switch (getItemViewType(position)){
    case 0:
        TextView date0=(TextView)convertView.findViewById(R.id.date0);
        TextView text0=(TextView)convertView.findViewById(R.id.text0);
        date0.setText(""+c.getString(c.getColumnIndex(Data.E_DATE)));
        text0.setText(""+c.getString(c.getColumnIndex(Data.E_TEXT)));
        break;
    case 1:
        TextView date1=(TextView)convertView.findViewById(R.id.date1);
        TextView text1=(TextView)convertView.findViewById(R.id.text1);
        date1.setText(""+c.getString(c.getColumnIndex(Data.E_DATE)));
        text1.setText(""+c.getString(c.getColumnIndex(Data.E_TEXT)));
    case 2:
        TextView date2=(TextView)convertView.findViewById(R.id.date2);
        TextView text2=(TextView)convertView.findViewById(R.id.text2);
        date2.setText(""+c.getString(c.getColumnIndex(Data.E_DATE)));
        text2.setText(""+c.getString(c.getColumnIndex(Data.E_TEXT)));
    case 3:
        TextView date3=(TextView)convertView.findViewById(R.id.date3);
        TextView text3=(TextView)convertView.findViewById(R.id.text3);
        date3.setText(""+c.getString(c.getColumnIndex(Data.E_DATE)));
        text3.setText(""+c.getString(c.getColumnIndex(Data.E_TEXT)));
    }
    return convertView;
}

@Override
public int getItemViewType(int position) {
    int type = 0;
    int returnInt = 0;
    Cursor c= getCursor();
    c.moveToPosition(position);
    type= c.getInt(c.getColumnIndex(Data.E_TYPE));
    switch (type){
    case Data.RECEIVED_READ:
        returnInt=3;
    case Data.RECEIVED_UNREAD: 
        returnInt= 2;
    case Data.SENT_COMPLETED:
        returnInt= 1;
    case Data.SENT_PROGRESS:
        returnInt= 0;
    default:
        returnInt=0;
    }
    return returnInt;
}

@Override
public int getViewTypeCount() {
    return 4;
}

    }
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-10T22:17:53+00:00Added an answer on June 10, 2026 at 10:17 pm

    It’s important when working with ListViews, especially complicated ones like you describe, to handle view recycling properly. The BaseAdapter class, a superclass of SimpleCursorAdapter has a few methods that you can override to achieve the effect you want while using minimal resources. I’ve never used a SimpleCursorAdatper before, so this is written with a normal CursorAdapter in mind, but you can use this with any Adapter class that overwrites BaseAdapter.

    ListViews in Android behave in a very specific way to lower memory cost. As you scroll through a ListView, the views for items that move off the screen are placed in a small pool of views. The convertView parameter is taken from this pool. They do this because keeping each list item View in memory does not scale well and can quickly cause an OutOfMemory exception. The getView() method is where you take these views and configure them for the current list item. Usually you’ll have a line that looks like this:

    if(convertView == null)
        convertView = layoutInflator.inflate(R.layout.list_item, null);
    

    In this case, if convertView is not null, we know it was previously inflated. We don’t want to re-inflate it, because this is a costly action and getView should just be quickly populating the views with data before they are displayed.

    Now, in your case, there are two potential inflations for convertView. Rather than re-inflating the view every time (very bad) or using some kind of hack with unique resource ids for each view (better, but not ideal), we can override two methods in the base class to ensure convertView is always the correct type. These two methods are getItemViewCount() and getItemViewType(int position).

    getItemViewCount() is used by the Adapter to determine how many pools of views it should maintain for the list. Overriding it is simple, and in your case would look something like this.

    @Override
    public int getViewTypeCount()
    {
        return 2; //Even though you have four cases, there are only 2 view types.
    }
    

    getItemViewType(int position) is used by the Adapter BEFORE getView is called to decide which pool convertView should come from. In here, you want a switch or if/else statement that checks your underlying data source for which view type it is and return it. (Note, per the Android documentation, the return value here has to be between 0 and getViewTypeCount() -1, so in your case either 0 or 1.)

    @Override
    public int getItemViewType(int position)
    {
        Item item = getItem(position)  //Or however you're getting the data associated with a particular list position
        switch(item.myInt)
        {
             //I simplified this a bit, basically, check your int, if it's the first type, return 0 for your first layout type, else return 1 for your second.
             case(0):
             case(1):
                 return 0;
             case(2):
             case(3):
                 return 1;
        }
    }
    

    Now, finally, we’ll modify getView to do the initial layoutInflation so that you have the correct Views in your pools.

    @Override
    public View getView(int position, View convertView, ViewGroup viewParent)
    {
        //if convertView is not null, we got a view from the pool, just go on
        if(convertView == null)
        {
            //This means we didn't have a view in the pool to match this view type.  Inflate it and it will be placed in the proper pool when this list item is scrolled off the screen
            if(getItemViewType(position) == 0)
                convertView = layoutInflator.inflate(R.layout.list_item_type1, null);
            else if(getItemViewType(position) == 1)
                convertView = layoutInflator.inflate(R.layout.list_item_type2, null);
        }
    
        //Populate the view with whatever data you need here
    
        //And finally....
        return convertView;
    }
    

    ListViews and their Adapters are one of the most complicated things I’ve encountered in Android, but taking the time out to do it right will greatly improve the performance and user experience in your app. Good luck!

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

That's pretty much it. I'm using Nokogiri to scrape a web page what has
I have just tried to save a simple *.rtf file with some websites and
I have a string like this: La Torre Eiffel paragonata all&#8217;Everest What PHP function
I have a French site that I want to parse, but am running into
I'm parsing an RSS feed that has an &#8217; in it. SimpleXML turns this
I have thousands of HTML files to process using Groovy/Java and I need to
I have a .ini file as follows: [playlist] numberofentries=2 File1=http://87.230.82.17:80 Title1=(#1 - 365/1400) Example
I'm new to using the Perl treebuilder module for HTML parsing and can't figure
link Im having trouble converting the html entites into html characters, (&# 8217;) i
For some reason, after submitting a string like this Jack’s Spindle from a text

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.