-1

I have Activity that shows only listview (He pulls the data from SQLite database), There is no limit for the data he can shows, and it work out well.

Now, I want to add a new little listview to the MainActivity which will show only the last five of the data.

I could not find anywhere on the network how to do it..

DataListActivity.java

   package com.example.ido.grades;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.Toast;
    public class DataListActivity extends ActionBarActivity {
        ListView listView;
        SQLiteDatabase sqLiteDatabase;
        CourseDbHelper courseDbHelper;
        Cursor cursor;
        ListDataAdaptar listDataAdaptar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.update_course);
            hideActionBar();
            listView = (ListView) findViewById(R.id.list_view);
            listDataAdaptar = new ListDataAdaptar(getApplicationContext(),R.layout.row_layout);
            listView.setAdapter(listDataAdaptar);
            registerForContextMenu(listView);
            courseDbHelper = new CourseDbHelper(getApplicationContext());
            sqLiteDatabase = courseDbHelper.getReadableDatabase();
            cursor = courseDbHelper.getInformation(sqLiteDatabase);
            registerForContextMenu(listView);
            if (!cursor.moveToFirst()){
            }
            else {
                do {
                    String year,semester,course,points,grade;
                    year = cursor.getString(0);
                    semester = cursor.getString(1);
                    course = cursor.getString(2);
                    points = cursor.getString(3);
                    grade = cursor.getString(4);
                    DataProvider dataProvider  = new DataProvider(year,semester,course,points,grade);
                    listDataAdaptar.add(dataProvider);
                }
                while (cursor.moveToNext());
            }
        }
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_data_list, menu);

        }
        public boolean onContextItemSelected(MenuItem item) {
            AdapterView.AdapterContextMenuInfo info =
                    (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            int mySelectedRowIndex = info.position;
            switch (item.getItemId()) {
                case R.id.update_item:
                    courseDbHelper = new CourseDbHelper(getApplicationContext());
                    sqLiteDatabase = courseDbHelper.getReadableDatabase();
                    DataProvider raw2 = (DataProvider)listDataAdaptar.getItem(mySelectedRowIndex);

                    Intent i = new Intent(DataListActivity.this, UpdateCourseActivity.class);
                    String year = raw2.getYear();
                    String semester = raw2.getSemester();
                    String course =  raw2.getCourse();
                    String points =  raw2.getPoints();
                    String grade =  raw2.getGrade();
                    int semIndex;
                    if (semester.equals("A'")){
                        semIndex =1;
                    }
                    else if (semester.equals("B'")){
                        semIndex =2;
                    }
                    else{
                        semIndex=3;
                    }
                    i.putExtra("YEAR", year);
                    i.putExtra("SEMESTER", Integer.toString(semIndex));
                    i.putExtra("COURSE", course);
                    i.putExtra("POINTS", points);
                    i.putExtra("GRADE", grade);
                    i.putExtra("POS", Integer.toString(mySelectedRowIndex));

                    startActivity(i);


                    return true;
                case R.id.delete_item:
                    courseDbHelper = new CourseDbHelper(getApplicationContext());
                    sqLiteDatabase = courseDbHelper.getReadableDatabase();
                    DataProvider raw = (DataProvider)listDataAdaptar.getItem(mySelectedRowIndex);
                    courseDbHelper.deleteInformation(raw.getYear(), raw.getSemester(), raw.getCourse(), raw.getPoints(), raw.getGrade());
                    Toast.makeText(this,"delete, pos["+mySelectedRowIndex+"]",Toast.LENGTH_LONG).show();
                    finish();
                    startActivity(getIntent());
                    return true;
                default:
                    return super.onOptionsItemSelected(item);
            }
        }
        public void onBackPressed() {
            startActivity(new Intent(this, MainActivity.class));
        }


        private void hideActionBar() {
            //Hide the action bar only if it exists
            if (getSupportActionBar() != null) {
                getSupportActionBar().hide();
            }
        }
        }

ListDataAdapter.java

package com.example.ido.grades;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

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

/**
 * Created by Ido on 08/08/2015.
 */
public class ListDataAdaptar extends ArrayAdapter{
        List list = new ArrayList();
    public ListDataAdaptar(Context context, int resource) {
        super(context, resource);
    }

    static class LayoutHandler{
        TextView YEAR,SEMESTER,COURSE,POINTS,GRADE;
    }
    @Override
    public void add(Object object) {
        super.add(object);
        list.add(object);
    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        LayoutHandler layoutHandler;
        if (row == null){
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row  = layoutInflater.inflate(R.layout.row_layout,parent,false);
            layoutHandler = new LayoutHandler();
            layoutHandler.YEAR = (TextView)row.findViewById(R.id.textYear);
            layoutHandler.SEMESTER = (TextView)row.findViewById(R.id.textSemester);
            layoutHandler.COURSE = (TextView)row.findViewById(R.id.textCourse);
            layoutHandler.POINTS = (TextView)row.findViewById(R.id.textPoints);
            layoutHandler.GRADE = (TextView)row.findViewById(R.id.textGrade);
            row.setTag(layoutHandler);
        }
        else{
            layoutHandler = (LayoutHandler) row.getTag();

        }
        DataProvider dataProvider = (DataProvider) this.getItem(position);
        layoutHandler.YEAR.setText(dataProvider.getYear());
        layoutHandler.SEMESTER.setText(dataProvider.getSemester());
        layoutHandler.COURSE.setText(dataProvider.getCourse());
        layoutHandler.POINTS.setText(dataProvider.getPoints());
        layoutHandler.GRADE.setText(dataProvider.getGrade());
        return row;
    }
}
Boken
  • 4,825
  • 10
  • 32
  • 42
Idon89
  • 141
  • 4
  • 16
  • Try this: http://stackoverflow.com/questions/10612670/how-to-show-the-last-item-in-the-list-view-when-scrolled-to-get-new-items-dynami – Oscar LT Aug 13 '15 at 10:29
  • 1
    If you want this "little" listview with existing one then copy the original data in a new `ListDataAdaptar` and load the new listview. If you don't need the original listview then you can modify existing data and reload the listview. – Rohit5k2 Aug 13 '15 at 10:30
  • 1
    show your ListDataAdaptar class code – Rahul Sharma Aug 13 '15 at 10:30
  • 1
    @RahulSharma I think he is using the default ArrayListAdapter. – Bhargav Aug 13 '15 at 10:34
  • I added the ListDataAdapter activity. – Idon89 Aug 13 '15 at 10:34

4 Answers4

1

You can move to the last position of your current cursor and move to previous rows getting required data. Sort of:

ArrayList string;
if (cursor.moveToLast()){
   for (int i = 1; i<=6; i++) {
   string.add(cursor.getString(cursor.getColumnIndex("your_data")));
   cursor.moveToPrevious();
   } 
}
cursor.close();

The result will be ArrayList with last 6 strings of your cursor data. You can feed it to the new ArrayAdapter and show it on the screen.

Instead of ArrayList you can create another cursor as well with all existing data and feed it to already existing adapter for example as it's described here: https://stackoverflow.com/a/18290921/4890659

Community
  • 1
  • 1
Anton
  • 449
  • 2
  • 7
  • 20
0

Ignoring your code, you obviously have an Array of Objects your passing into the constructor of your Array Adapter.

Object[] data = new Object[]{...}
MyArrayAdapter myAdapter = new MyArrayAdapter(data ,... else)

You simply get this data array and append the last 6 elements to a new array.

Object[] data2 = new Object[6]
for(int i = data.length()-7; i<data.length(); i++){
    data2[data.length()-i] = data[i]

Then create a new Adapter passing the new data2 array.

MyArrayAdapter myAdapter = new MyArrayAdapter(data2, ... else)
0

Create method that will return the last 6 rows i cursor [SQL query].

cursor = courseDbHelper.getInformationLast_6(sqLiteDatabase);

SQL:

 SELECT * FROM table ORDER BY column DESC [ASC] LIMIT 6;
dieter_h
  • 2,707
  • 1
  • 13
  • 19
0

by this you can get 6 items in your list. Try with following code in your adapter class.

public int getCount() {
        return 6;
    }

than change your query to limit 6 by ascending order or descending order.

Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142