user3291590
user3291590

Reputation: 279

custom adapter do not refresh the listview for onclicklistener in android

I delete database entry using onclicklistener but it is not refreshing the listview. how can i refresh this listview?

This is main class for listview:

public class AFragment extends Fragment implements OnItemClickListener {

    protected static final String file_name ="user";
    ListView list;
    Database entry;
    View v;
    String values[];
    MySimpleArrayAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        SharedPreferences settings = getActivity().getSharedPreferences(file_name, 0);
        String name =  settings.getString("name", null);


        entry = new Database(getActivity());
        entry.open();
        values=entry.planlist(name);
        entry.close();
        if(values.length>0){
            v = inflater.inflate(R.layout.activity_afragment, container,false);
            adapter = new MySimpleArrayAdapter(getActivity(), values);
            list=(ListView)v.findViewById(R.id.list);

            list.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            list.setOnItemClickListener(this);


        }else{
            v = inflater.inflate(R.layout.activity_my_tabs_listener, container,false);
        }
//      Toast.makeText(getActivity(),String.valueOf(values.length), Toast.LENGTH_LONG).show();
        return v;
    }


    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub
        Intent i = new Intent(getActivity(),Details.class);
        i.putExtra("sub", values[arg2]);
        startActivity(i);
        Toast.makeText(getActivity(), "clicked", Toast.LENGTH_SHORT).show();
    }

}


Here i use onclicklistener to delete data from database but it is not refreshing:

public class MySimpleArrayAdapter extends ArrayAdapter<String>  {

      private final Context context;
      private final String[] values;
      public Business aFragment = new Business();
      int mypos =0;
      ViewHolder holder;
      View row;
      public MySimpleArrayAdapter(Context context, String[] values) {
        super(context,R.layout.activity_my_simple_array_adapter, values);
        this.context = context;
        this.values = values;
      }


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

        mypos = position;
        row = convertView;
        holder = new ViewHolder();
        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(R.layout.activity_my_simple_array_adapter, parent, false);

            TextView textView = (TextView) row.findViewById(R.id.text);
            Button btn = (Button) row.findViewById(R.id.button1);
            holder.tv = textView;
            holder.btn = btn;
            row.setTag(holder);
        }else{
            holder = (ViewHolder)row.getTag();
        }
        holder.tv.setText(values[position]);
        final int id = position;
        holder.btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Database entry = new Database(context);
                entry.open();
                entry.delete(values[id]);
                entry.close();
//              Toast.makeText(getContext(), String.valueOf(id), Toast.LENGTH_LONG).show();
            }
        });

        return row;
      }

    static class ViewHolder{

        TextView tv;
        Button btn;

    }
} 

Upvotes: 1

Views: 5018

Answers (5)

Dan Levin
Dan Levin

Reputation: 714

as anil said, you should put notifyDataSetChanged(); inside the onClickListener this basically tells the adapter to render the list again and will call getView() again for every visible item in the list, if your code crashes, you should check two things: first - debug the program and check that the new data fits what you want, in your case, check that the entry was deleted properly.

second - debug the getView method, step through each call and see what gives you the crash.

in your case the problem is that you are only updating the database, but in fact your listview data is taken from the values[] array which is not updated after you delete the database entry, you should create a function for updating it.

Upvotes: 1

Jay Vyas
Jay Vyas

Reputation: 2712

You can do one thing.

Firstly create a method called myAdapter(). In this put your creation of adapter code,so you can create new adapter for loading new data by simply calling myAdapter() method.

Whenever there should be modification in your ListView just called the following code,

listview.invalidate();

Then simply call the myAdapter().

That's it.Hope this is useful to you..:)

Upvotes: 0

Blackbelt
Blackbelt

Reputation: 157437

you are removing it from the database but you are not removing it from the dataset that fills up your ListView. The simplest thing you can do is to change values from array to ArrayList, and since you are using an ArrayAdapter, you can call remove(int position). You need a List<T> of objects otherwise remove will throws an exception.

Upvotes: 0

tasomaniac
tasomaniac

Reputation: 10342

If you do lots of adding and deleting to the list I think you should do the things below.

  • You should use ArrayList<String> instead of simple String[] so that you can easily delete. Database deletion do not effect the list directly unless you use Loaders
  • After you delete and item from the list, you should call notifyDataSetChanged() to the adapter. If you do not call this method, the list wont be updated.

    adapter.notifyDataSetChanged();

Upvotes: 0

Looking Forward
Looking Forward

Reputation: 3585

Put adapter.notifyDataSetChanged(); on click of ListView

@Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Database entry = new Database(context);
                entry.open();
                entry.delete(values[id]);
                entry.close();
                adapter.notifyDataSetChanged();

//              Toast.makeText(getContext(), String.valueOf(id), Toast.LENGTH_LONG).show();
            }

Upvotes: 0

Related Questions