【问题标题】:List is not refreshed after i delete an item in android删除android中的项目后列表未刷新
【发布时间】:2016-03-04 06:43:19
【问题描述】:

您好,我是android 的新手,正在制作Custom ListView 的演示,我已经制作了adapterListItem 自定义并绑定到我的Listview,一切正常,但我想当我从 list 删除项目时删除它

适配器

public class TimelineAdapter extends ArrayAdapter<Post> {

    private final LayoutInflater mInflater;


    public TimelineAdapter(Context context) {

        super(context, R.layout.list_item_post);
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }



    public void setData(List<Post> data) {
        setNotifyOnChange(true);
        clear();
        if (data != null) {
            addAll(data);
            notifyDataSetChanged();
        }
        notifyDataSetChanged();
    }


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

        Post post = getItem(position);
        PostListItem view;
        if (convertView == null) {
            view =  (PostListItem) mInflater.inflate(R.layout.list_item_post, parent, false);


        } else {
            view = (PostListItem) convertView;

        }
        view.setPost(post);
        notifyDataSetChanged();
        return view;
    }
}

片段

@Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);
        total = 0;
        mPullToRefreshLayout = (PullToRefreshLayout) getActivity().findViewById(R.id.ptr_layout);
        ActionBarPullToRefresh.from(getActivity()).allChildrenArePullable().listener(this).setup(mPullToRefreshLayout);

        mProgressBarLoading = (ProgressBar) getActivity().findViewById(R.id.progressBarLoading);
        mTextViewNoItems = (TextView) getActivity().findViewById(R.id.textViewNoItems);

        mTimelineAdapter = new TimelineAdapter(getActivity());

        mListViewTimeline = (ListView) getActivity().findViewById(R.id.listViewTimeline);
        mListViewTimeline.setEmptyView(mProgressBarLoading);

        mListViewTimeline.setAdapter(mTimelineAdapter);
        mTimelineAdapter.notifyDataSetChanged();

        mListViewTimeline.setOnScrollListener(this);

        //  mListViewTimeline.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
        mListViewTimeline.setVerticalScrollBarEnabled(false);

        Activity activity = getActivity();

        if(activity != null) {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    getLoaderManager().initLoader(0, null, TimelineFragment.this);
                    //Do something after 100ms
                }
            }, 1000);


            mTextViewNoItems.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(final View v) {
                    getLoaderManager().destroyLoader(0);

                    getLoaderManager().initLoader(0, null, TimelineFragment.this);
                    Log.d("CLICK", "REFRESH");

                }
            });
        }

    }

    @Override
    public Loader<List<Post>> onCreateLoader(int id, Bundle args) {

        mTimelineLoader = new TimelineLoader(getActivity(), mListViewTimeline);
        setHasOptionsMenu(true);
        return mTimelineLoader;
    }

    @Override
    public void onLoadFinished(Loader<List<Post>> arg0, List<Post> data) {


        mTimelineAdapter.setData(data);

        mTimelineAdapter.notifyDataSetChanged();


        mPullToRefreshLayout.setRefreshComplete();
        mTextViewNoItems.setVisibility(View.VISIBLE);
        mProgressBarLoading.setVisibility(View.INVISIBLE);
        mListViewTimeline.setEmptyView(mTextViewNoItems);

        if (data.isEmpty()) {
            getLoaderManager().destroyLoader(0);

            getLoaderManager().initLoader(0, null, TimelineFragment.this);
        }

    }


    @Override
    public void onLoaderReset(Loader<List<Post>> arg0) {

        mTimelineAdapter.setData(null);
        setHasOptionsMenu(true);
    }

列表项

if (which == 2) {

                    if (mPost.postUser.userID == sharedConnect.mCurrentUser.userID) {
                        // Log.e("Remove Post", "Success");


                        //Added by jigar..
                        tfragment = new TimelineFragment();
                        AlertDialog.Builder builder1 = new AlertDialog.Builder(getContext());

                        builder1.setMessage("Are you sure?");
                        builder1.setCancelable(true);

                        builder1.setPositiveButton(
                                "Yes",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();

//open = false;
                                        final AsyncTask<Void, Void, Boolean> deleted = new AsyncTask<Void, Void, Boolean>() {

                                            @Override
                                            protected Boolean doInBackground(Void... params) {

                                                Connect sharedConnect = Connect.getInstance(getContext());
                                                sharedConnect.deletePost(mPost.postID);


                                                return true;
                                            }

                                            protected void onPostExecute(Boolean result) {

                                                Toast.makeText(getContext(), "Deleted",
                                                        Toast.LENGTH_SHORT).show();
                                                tfragment = new TimelineFragment();
                                                tfragment.mTimelineAdapter.notifyDataSetChanged();

                                            }
                                        }.execute();


                                    }
                                });

                        builder1.setNegativeButton(
                                "No",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                        //  open = false;
                                    }
                                });

                        AlertDialog alert11 = builder1.create();
                        alert11.show();


                        //end
                    }

【问题讨论】:

  • 您能否粘贴您的列表项删除代码。我看不到一个:) 你为什么要调用 notifyDataSetChanged();在getView中???此外,您正在创建片段的新实例并重新加载该新实例的适配器,而不是您应该做的是获取已经加载的现有片段实例并重新加载其适配器简单:)
  • @SandeepBhandari-我可以把代码发给你吗?如果可能的话?请救救我兄弟..:(
  • 继续 :) 发送它或只在这里发布它,这将帮助大家指导你:) 只需发布您的删除代码就足够了如果这还不够,我们会考虑发送代码好吗? ??
  • @sulphuricAcid 在下面尝试我的解决方案,如果有问题请告诉我
  • @如何在我的自定义 listItem 类中获得位置,请查看我现有的代码。

标签: android listview pull-to-refresh notifydatasetchanged


【解决方案1】:

实现onResume()方法并在onResume()方法中加载适配器并通知数据集改变

【讨论】:

  • Hemant-谢谢你的快速回复,但是你能告诉我在哪里写我的意思是我有自定义类 mt listItem 并从中删除,所以?
  • 您必须在为列表视图加载适配器的类中编写 onResume()。
  • 我在我的片段中设置适配器并使用了 pulltorefresh。
  • mTimelineAdapter = new TimelineAdapter(getActivity());mListViewTimeline.setAdapter(mTimelineAdapter); mTimelineAdapter.notifyDataSetChanged();将此代码放在片段中的 onResume() 方法中
  • @hemant-我已经使用了你的代码。但什么也没发生..:(实际上,当我在做 pulltorefresh 时,我的列表会根据我的需要刷新。那么你能从 pulltorefresh 中的代码帮助我吗?
【解决方案2】:

首先谨慎使用adapter.notifiDataSetChanged()。当您在列表中添加或删除一行时,应该使用它。

要从列表中删除项目,请在您的 ListView 上设置 onItemclicklistener

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
        });

从中您将获得要删除的单击项目的位置。

现在在你的适配器中定义一个方法

   public void deleteRowFromUi(int position) {
    dataList.remove(position);
    notifyDataSetChanged();
}

并使用活动中的适配器实例从活动中调用此方法

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2010-12-21
    • 2017-08-02
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多