Android CustomListAdapter notifydatachange()不起作用

时间:2014-04-28 13:01:01

标签: android android-adapter notifydatasetchanged

我想使用自定义 ArrayAdapter 显示项目列表。

我将通过单击按钮插入数据。

MainFragment.java

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

我的布局文件如下。

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;
        }
    }
}

MyFragment.java的布局文件是

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"
 />

我的数据库类是

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);
        }
}

点击按钮,数据被插入到db中。但它没有在UI中反映出来。 为什么我的列表视图没有更新?

由于

1 个答案:

答案 0 :(得分:2)

按如下方式更改适配器

    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();

    }
}

所以在你的适配器本身添加方法updateList并调用方法notifyDataSetChanged();

所以从您的活动开始,而不是致电notifyDataSetChanged();来电updateList(List<CustomModel> newList)

我相信这会奏效。