Question

I want to disply list of items using Custom ArrayAdapter.

I will insert data by clicking a button.

MainFragment.java

@Override
        public void onClick(View v) {
            DatabaseClass feed = new DatabaseClass(getActivity());
            new DatabaseClass(getActivity()).getList();
            new MyFragment().updateList();
        }

My layout file is as follows.

main.xml

 <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <fragment
                    android:id="@+id/update"
                    android:name="com.android.MyFragment"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
            </LinearLayout>

MyFragment.java

import java.util.List;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyFragment extends ListFragment {

    // creating database reference
    private static DatabaseClass feed;
    private List<CustomModel> customList;
    private static CustomListAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        feed = new DatabaseClass(getActivity());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        // To get List of CustomModel objects
        feed.getList();

        // CUSTOM_LIST is list constant
        adapter = new CustomListAdapter(getActivity(),
                R.layout.update, Utils.CUSTOM_LIST);

        // setting adapter      
        setListAdapter(adapter);
        View view = inflater.inflate(R.layout.update, container, false);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    // this method is called after inserting data into database
    public void updateList() {
        if (adapter != null) {
            adapter.notifyDataSetChanged();
        } else {
            adapter = new CustomListAdapter(getActivity(),
                    R.layout.update, Utils.CUSTOM_LIST);
            adapter.notifyDataSetChanged();
        }
    }

    private class CustomListAdapter extends ArrayAdapter<CustomModel> {

        private final Context context;
        private final List<CustomModel> list;
        private TextView name, message;

        public CustomListAdapter(Context context, int resource,
                List<CustomModel> list) {
            super(context, resource, list);
            this.context = context;
            this.list = list;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.single_row, parent,
                    false);

            name = (TextView) view.findViewById(R.id.name);
            message = (TextView) view.findViewById(R.id.message);
            CustomModel obj = list.get(position);

            name.setText(obj.getName());
            message.setText(obj.getMessage());

            return view;
        }
    }
}

And layout file for MyFragment.java is

update.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list"
 />

My Database class is

DatabaseClass.java

    public void getList(){
        ourDatabase = this.getReadableDatabase();
        String sql = "SELECT * FROM " + DATABASE_TABLE;
        Cursor c = ourDatabase.rawQuery(sql, null);

        int iName = c.getColumnIndex(KEY_NAME);
        int iMessage = c.getColumnIndex(KEY_MESSAGE);

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            CustomModel model = new CustomModel();


            model.setName(c.getString(iFromName));
            model.setMessage(c.getString(iMessage));

            Utils.LIST.add(model);
        }
}

onclick of button, data is inserted into db. but it is not reflecting in UI. Why my list view is not updated?

Thanks

Was it helpful?

Solution

Change your adapter as follows

    private class CustomListAdapter extends ArrayAdapter<CustomModel> {

    private final Context context;
    private final List<CustomModel> list;
    private TextView name, message;

    public CustomListAdapter(Context context, int resource,
            List<CustomModel> list) {
        super(context, resource, list);
        this.context = context;
        this.list = list;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.single_row, parent, false);

        name = (TextView) view.findViewById(R.id.name);
        message = (TextView) view.findViewById(R.id.message);
        CustomModel obj = list.get(position);

        name.setText(obj.getName());
        message.setText(obj.getMessage());

        return view;
    }

    public void updateList(List<CustomModel> list) {

        this.list = list;
        notifyDataSetChanged();

    }
}

so add the method updateList in your adapter itself and call the method notifyDataSetChanged();

so from your activity instead of calling notifyDataSetChanged(); call updateList(List<CustomModel> newList)

I am sure this will work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top