-1

this is my code. I get new data and I need to refresh the list . I'm using base adapter for making my listview .

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lv=(ListView) findViewById(R.id.listView1);
    lv.setAdapter(new myAdapter(this));

}

class SingleRow{
    String title; 
    String description;
    int image ; 
    SingleRow(String title,String description, int image) {
        this.title=title; 
        this.description=description;
        this.image=image;
    }
}

class myAdapter extends BaseAdapter{
    ArrayList<SingleRow> list; 
    Context context;
    myAdapter(Context c){
        context=c; 
        list=new ArrayList<SingleRow>();
        Resources res=c.getResources();
        String[] titles=res.getStringArray(R.array.titiles);
        String[] descriptions=res.getStringArray(R.array.descriptions);
        int[] images={R.drawable.a1 ,R.drawable.a2,R.drawable.a3,R.drawable.a49};
        for(int i =0; i<4;i++){  
            list.add(new SingleRow(titles[i], descriptions[i], images[i]));
        }
    }

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

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

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row= inflater.inflate(R.layout.custom_list_items, parent,false);

        TextView title= (TextView) row.findViewById(R.id.title);
        TextView description= (TextView) row.findViewById(R.id.desc);
        ImageView image=(ImageView) row.findViewById(R.id.imageView1);

        SingleRow temp= list.get(position);

        title.setText(temp.title);
        description.setText(temp.description);
        image.setImageResource(temp.image);
        return row;
    }

Where should I put notifyDataSetChanged() or other methods to refresh my list and show new data ?

thanks

mohsen
  • 451
  • 2
  • 6
  • 15
  • 2
    possible duplicate of [how to refresh custom listview using baseadapter in android](http://stackoverflow.com/questions/13672700/how-to-refresh-custom-listview-using-baseadapter-in-android) – Shruti Sep 16 '14 at 12:40
  • in "on button click" ... notifyDataSetChanged will not help you ... becuase you change `list` content only in myAdapter constructor ... – Selvin Sep 16 '14 at 12:41

2 Answers2

1

NotifyDataSetChanged works to notify your data set associated with the Adapter.Now Ideally when ever you are setting an adapter after that you should call notifydatasetChanged to make the previous data set invalidate and load the new dataset from your adapter.

It is also not suggested to create a fresh adapter object everytime.

You can do something like this:->

Myadapter adapter = new Myadapter(context,dataset of your custom arraylist);//Constructor

after that whenever you will get new data set call this

adapter.ArrayList<T> = new ArrayList<T>;

then

adapter.notifyDataSetChanged();

If you don't want to change anything then in your code after your new adapter call...call adapter.notifyDataSetChanged();

EDIT:

in Activity:

ArrayList<SingleRow> rows = new ArrayList<SingleRow>();
myAdapter theAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv=(ListView) findViewById(R.id.listView1);
    Resources res = getResources();
    String[] titles=res.getStringArray(R.array.titiles);
    String[] descriptions=res.getStringArray(R.array.descriptions);
    int[] images={R.drawable.a1 ,R.drawable.a2,R.drawable.a3,R.drawable.a49};
    for(int i =0; i<4;i++){  
        rows.add(new SingleRow(titles[i], descriptions[i], images[i]));
    }
    theAdapter = new myAdapter(this, rows);
    lv.setAdapter(theAdapter);
}

void doAdd()
{
    rows.add(new new SingleRow(...some values...);
    theAdapter.notifyDataSetChanged()
}

void doClear()
{
    rows.clear();
    theAdapter.notifyDataSetChanged()
}

in adapter:

myAdapter(Context c, ArrayList<SingleRow> rows)
{
    context=c;
    list = rows;
}   

you can aslo take a look at ArrayAdapter implementation ...

Selvin
  • 6,598
  • 3
  • 37
  • 43
Chiradeep
  • 973
  • 12
  • 32
0

Anytime you call list.add(something) you should call notifyDtaSetChnged();.

If it is happened out of BaseAdpter class, use adapter.NotifyDataSetChnged().

blackgreen
  • 34,072
  • 23
  • 111
  • 129
Sepehr Behroozi
  • 1,780
  • 1
  • 17
  • 32