简体   繁体   English

android中删除按钮单击事件中的项目后如何刷新Listview?

[英]how to Listview Refresh after Delete an item on Button Click event in android?

I want to delete an item from Listview, and at a time Refresh Listview after deleting an item. 我想从Listview中删除一个项目,并在删除项目后一次刷新Listview。 How to possible? 怎么可能?

I am using get all item using JSON Parsing from database and delete an selected an item on click of button. 我正在使用从数据库中使用JSON解析获取所有项目,并在单击按钮时删除选定的项目。 delete successfully from database but Listview not refresh at a time. 从数据库中成功删除,但Listview一次无法刷新。 how to do? 怎么做?

I am using Json Parsing. 我正在使用Json解析。 not local database. 不是本地数据库。

In This case, How to refresh Listview when Deleting Item? 在这种情况下,如何在删除项目时刷新Listview? please Guide me. 请引导我。 Thanks in Advance. 提前致谢。

My Code is, Detail.java File 我的代码是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);
            }
        }
    }
}

And Adapter Class is, Adapter1.java File 和适配器类是,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 File is, 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 file is, 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>

in your custom adapter call this.notifyDataSetChanged(); 在您的自定义适配器中调用this.notifyDataSetChanged(); where you are performing delete functionality and deleting that element from arrayList which is set to that adapter 在其中执行删除功能并从设置为该适配器的arrayList中删除该元素

您正在编写删除操作,在该函数中,仅再次调用adapter.notifyDataSetChanged。因此,它在删除操作时再次取回数据,然后再次调用adapter.notifyDataSetChanged它将起作用

First of all Put you adapter code in Details.java class 首先将适配器代码放入Details.java类中

then change this, 然后改变这个

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

hope it will help you 希望对你有帮助

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

Why make it that complicated? 为什么要这么复杂?

Just call remove(Obj); 只需调用remove(Obj); in OnClickListener of your customized adapter Adapter1 's. 在您的自定义适配器Adapter1OnClickListener中。 And notifyDataSetChanged will be called in removed method too. 并且notifyDataSetChanged也将在删除的方法中调用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM