删除按钮上的一个项目后如何Listview刷新在Android中的事件?

时间:2014-11-26 11:52:29

标签: android listview refresh

我想从Listview中删除一个项目,并在删除项目后一次刷新Listview。怎么可能?

我正在使用从数据库中使用JSON Parsing获取所有项目,并在单击按钮时删除所选项目。从数据库中成功删除但Listview一次不刷新。怎么办?

我正在使用Json Parsing。不是本地数据库。

在这种情况下,如何在删除项目时刷新Listview? 请指导我。 在此先感谢。

我的代码是, Detail.java文件

public class Detail extends Activity {
    ListView lstDetail = null;
    /** String */
    String urlGetDetailData = null;

    /** Declare another variable for Listview */
    Adapter1 adapter1 = null;
    ArrayList<Detail> myList = new ArrayList<Detail>();
    /** Hashmap for ListView */
    ArrayList<HashMap<String, String>> dataList = null;

    /** JSON Node names */
    public static final String TAG_MEMBER_ID = "mem_id";
    public static final String TAG_ID = "id";
    public static final String TAG_USER_ID = "userid";
    public static final String TAG_STATUS = "Status";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        onCreateActivity(R.layout.detail);

        initializeWidgets();
    }

    private void initializeWidgets() {
        /** ListView */
        lstDetail = (ListView) findViewById(R.id.lstDetail);

        urlGetDetailData = "http://example.com/getdata.php?id="
                + strId;

        new GetDetailData().execute();
        myList.remove(position);
        Adapter1.this.notifyDataSetChanged();

    }

    /**
     * Async task class to get json by making HTTP call
     * */
    private class GetDetailData extends AsyncTask<Void, Void, Void> {
        JSONObject jsonobject;
        JSONArray jsonarray;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            dataList = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONFunctions.getJSONfromURL(urlGetDetailData);

            try {
                // Locate the array name in JSON
                jsonarray = jsonobject.getJSONArray("data");

                for (int i = 0; i < jsonarray.length(); i++) {

                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects

                    map.put("mem_id", String.valueOf(jsonobject
                            .getString(TAG_MEMBER_ID)));
                    map.put("id",
                            jsonobject.getString(TAG_ID));

                    map.put("userid", jsonobject.getString(TAG_USER_ID));
                    map.put("Status", jsonobject.getString(TAG_STATUS));

                    dataList.add(map);
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (dataList.size() != 0) {
                lstDetail.setVisibility(View.VISIBLE);
                Adapter1 = new Adapter1(Detail.this,
                        dataList);
                lstDetail.setAdapter(Adapter1);
            } else {
                lstDetail.setVisibility(View.GONE);
            }
        }
    }
}

适配器类是, Adapter1.java文件

public class Adapter1 extends BaseAdapter {
    public ArrayList<HashMap<String, String>> arrData = null;
    Context context = null;
    LayoutInflater layoutInflater = null;
    HashMap<String, String> getDetailData = new HashMap<String, String>();

    /** String */
    String strMemberId = null, urlDelete = null;

    /** Constructor */
    public Adapter1(Context context,
            ArrayList<HashMap<String, String>> arrData) {
        layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
        this.arrData  = arrData;
    }

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

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = layoutInflater.inflate(
                    R.layout.list_item, null);

            viewHolder = new ViewHolder();
            getData = arrData.get(position);

            /** Initialize Widgets */

            viewHolder.imgCancel = (ImageView) convertView
                    .findViewById(R.id.imgCancel);

            viewHolder.imgCancel
                    .setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            strMemberId = arrData.get(
                                    position).get(
                                    Detail.TAG_MEMBER_ID);
                            urlDelete = "http://example.com/delete.php?mem_id="
                                    + strMemberId;
                            new DeleteComments().execute();
                        }
                    });

            /** TextView */
            viewHolder.txtMemberId = (TextView) convertView
                    .findViewById(R.id.txtMemberId);
            viewHolder.txtId = (TextView) convertView
                    .findViewById(R.id.txtId);

            viewHolder.txtDesc = (TextView) convertView
                    .findViewById(R.id.txtDesc);

            /** Set Value */


            viewHolder.txtMemberId.setText(getDetailData 
                    .get(Detail.TAG_MEMBER_ID));
            viewHolder.txtId.setText(getDetailData
                    .get(Detail.TAG_ID));

            viewHolder.txtDesc.setText(getDetailData
                    .get(Detail.TAG_STATUS));

            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        return convertView;
    }

    /** ViewHolder Class */
    @SuppressLint("NewApi")
    public static class ViewHolder {
        ImageView imgCancel = null;
        TextView txtMemberId = null, txtId = null,txtDesc = null;
    }

    public class DeleteComments extends AsyncTask<Void, Void, Void> {
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            ServiceHandler sh = new ServiceHandler();
            String jsonStr = sh.makeServiceCall(urlDelete,
                    ServiceHandler.GET);
            Log.d("Response : delete join comments", ">" + jsonStr);

            return null;
        }

        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

        };
    }
}

detail.xml文件是,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/re/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" >

    <ListView
        android:id="@+id/lstDetail"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>
</RelativeLayout>

list_item.xml文件是,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/re/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:id="@+id/contentLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/txtId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="111" />

        <TextView
            android:id="@+id/txtDesc"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <ImageView
        android:id="@+id/imgCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/cancel" />

    <TextView
        android:id="@+id/txtMemberId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/txtUserEventId"
        android:layout_alignBottom="@+id/txtUserEventId"
        android:layout_alignParentLeft="true"
        android:text="222" />
</RelativeLayout>

5 个答案:

答案 0 :(得分:5)

在自定义适配器调用this.notifyDataSetChanged();中执行删除功能并从arrayList中删除该元素,该元素设置为该适配器

答案 1 :(得分:0)

你正在写删除动作,在那个函数中只调用adapter.notifyDataSetChanged。所以它refr on delete action再次获取数据然后再次调用adapter.notifyDataSetChanged它将起作用

答案 2 :(得分:0)

首先将适配器代码放在Details.java类

然后改变这个,

public class DeleteComments extends AsyncTask<Void, Void, Void> {
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            ServiceHandler sh = new ServiceHandler();
            String jsonStr = sh.makeServiceCall(urlDelete,
                    ServiceHandler.GET);
            Log.d("Response : delete join comments", ">" + jsonStr);

            return null;
        }

        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Adapter1.remove(Adapter1.getItem(position));
        };
    }

希望它会帮助你

答案 3 :(得分:0)

     @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder = null;
            if (convertView == null) {
                convertView = layoutInflater.inflate(
                        R.layout.list_item, null);

                viewHolder = new ViewHolder();
                getData = arrData.get(position);

                /** Initialize Widgets */

                viewHolder.imgCancel = (ImageView) convertView
                        .findViewById(R.id.imgCancel);

                viewHolder.imgCancel
                        .setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                strMemberId = arrData.get(
                                        position).get(
                                        Detail.TAG_MEMBER_ID);
                                urlDelete = "http://example.com/delete.php?mem_id="
                                        + strMemberId;
                                new DeleteComments().execute();
                            }
                        });

                /** TextView */
                viewHolder.txtMemberId = (TextView) convertView
                        .findViewById(R.id.txtMemberId);
                viewHolder.txtId = (TextView) convertView
                        .findViewById(R.id.txtId);

                viewHolder.txtDesc = (TextView) convertView
                        .findViewById(R.id.txtDesc);

                /** Set Value */


                viewHolder.txtMemberId.setText(getDetailData 
                        .get(Detail.TAG_MEMBER_ID));
                viewHolder.txtId.setText(getDetailData
                        .get(Detail.TAG_ID));

                viewHolder.txtDesc.setText(getDetailData
                        .get(Detail.TAG_STATUS));

                convertView.setTag(viewHolder);

            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
bDelete.setOnClickListener(new OnClickListener(){
@Override
            public void onClick(View view)
            {
                arrData.remove(position);
                notifyDataSetChanged():
            }

});


            return convertView;
        }

答案 4 :(得分:0)

为什么要这么复杂?

只需拨打自定义适配器remove(Obj);的{​​{1}}中的OnClickListener即可。并且Adapter1也将在删除的方法中调用。