如何以编程方式在Android中滚动ListView到最多向下的手势

时间:2016-03-08 07:27:36

标签: android listview loader pull-to-refresh

我是android的新手,并在我的演示应用程序中实现了pull to refresh和自定义ListView。我正在从listItem类中删除一个项目,当我正在刷新该项目从我的ListView中删除但它必须要这样做时,我想删除该项目一旦删除。我尝试过notifyDatasetChange这在我的所以我想以编程方式将我的列表拉下来,所以列表会刷新,请帮我做。感谢你

public class TimelineFragment extends BaseFragment implements LoaderManager.LoaderCallbacks<List<Post>>, OnRefreshListener, OnScrollListener {
    private static boolean inBackground = false;

    public static android.widget.PopupMenu popupMenu;
    private int index = -1;
    private int top = 0;
    public static TimelineAdapter mTimelineAdapter;
    public TimelineLoader mTimelineLoader;
    public PullToRefreshLayout mPullToRefreshLayout;
    public static ListView mListViewTimeline;
    ProgressBar mProgressBarLoading;
    TextView mTextViewNoItems;
    ImageView im;
    Menu mm;
    int total;
    Activity activity;
    private int hot_number = 0;
    private TextView ui_hot = null;

    int lastPosition;
    int lastTop;

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

        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_timeline, container, false);
        setHasOptionsMenu(true);
        return rootView;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    private boolean isAppIsInBackground(Context context) {
        boolean isInBackground = true;
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isInBackground = false;
        }
        return isInBackground;
    }

    public void updateHotCount(final int new_hot_number) {
        hot_number = new_hot_number;
        if (ui_hot == null) return;

        if (new_hot_number == 0)
            ui_hot.setVisibility(View.INVISIBLE);
        else {
            ui_hot.setVisibility(View.VISIBLE);
            ui_hot.setText(Integer.toString(new_hot_number));
        }    
    }

    @Override
    public void onPause() {
        super.onPause();

        if (isAppIsInBackground(getActivity())) {

            Log.d("ACTION", "RETURN FROM BACGRKOUDN");
            getLoaderManager().destroyLoader(0);
            getLoaderManager().initLoader(0, null, TimelineFragment.this);
        }
    }

    public void onStop() {
        super.onStop();

if(mTimelineLoader != null) {
    mTimelineLoader.stopLoading();
}
        lastPosition = mListViewTimeline.getFirstVisiblePosition();
        View v = mListViewTimeline.getChildAt(0);
        lastTop = (v == null) ? 0 : v.getTop();

//       lastPosition = mListViewTimeline.getSelectedItemPosition();
//       int lastPositionInGroup = lastPosition - mListViewTimeline.getFirstVisiblePosition();
//       lastTop = mListViewTimeline.getChildAt( lastPositionInGroup ).getTop();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        getActivity().getMenuInflater().inflate(R.menu.search_post, menu);

        final View menu_hotlist = menu.findItem(R.id.activity22).getActionView();
        ui_hot = (TextView) menu_hotlist.findViewById(R.id.hotlist_hot);

        SharedPreferences preferences = getActivity().getSharedPreferences("Notifications", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();

        updateHotCount(preferences.getInt("notifications", 0));    

        new MyMenuItemStuffListener(menu_hotlist, "Show hot message") {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), ActivityActivity.class);
                intent.putExtra("View_mode", true);
                startActivity(intent);
            }
        };   
    }

    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if (id == R.id.search22) {
            //   Log.d("MyApp", "action bar clicked");    

            Intent intent = new Intent(getActivity(), SearchPostActivity.class);
            intent.putExtra("View_mode", true);
            startActivity(intent);    
        }
        if (id == R.id.activity22) {
            Intent intent = new Intent(getActivity(), ActivityActivity.class);
            intent.putExtra("View_mode", true);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }

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

    @Override
    public void onRefreshStarted(View view) {

        getLoaderManager().destroyLoader(0);
        getLoaderManager().initLoader(0, null, this);
        mTextViewNoItems.setVisibility(View.INVISIBLE);
        mProgressBarLoading.setVisibility(View.VISIBLE);
        mListViewTimeline.setEmptyView(mProgressBarLoading);        
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        if (firstVisibleItem + visibleItemCount >= totalItemCount && visibleItemCount != 0) {
            if (mTimelineLoader.loadMore() && !mTimelineLoader.loading()) {
                total = totalItemCount - 1;
                lastPosition = view.getFirstVisiblePosition();
                View v = view.getChildAt(0);
                lastTop = (v == null) ? 0 : v.getTop();
                mTimelineLoader.onContentChanged();   
            }    
        }   
    }

2 个答案:

答案 0 :(得分:0)

您可以将您的ListView包装在SwipeRefreshLayout中,它将实现最多向下的手势。

https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

https://developer.android.com/training/swipe/add-swipe-interface.html

示例:

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swiperefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

并在您的活动中使用java代码

SwipeRefreshLayout swipeRefreshLayout =(SwipeRefreshLayout)findViewById(R.id.swiperefresh);

swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh() {
                //Do something here
                swipeRefreshLayout.setRefreshing(false); // For end refreshing animation
        }        
});

答案 1 :(得分:0)

将以下代码添加到您的活动类中,以便在另一个类中获取它的实例并刷新ListView:

private static MainActivity instance;

@Override
protected void onStart() {
    super.onStart();
    instance = this;
}

public static MainActivity getInstance(){
    return instance;
}

public void refreshListView(){
    mTimelineAdapter = new TimelineAdapter(getActivity());
    mListViewTimeline.setAdapter(mTimelineAdapter);
    mTimelineAdapter.notifyDataSetChanged();
}

现在,您可以使用以下代码从要删除行的班级中调用refreshListView()

// call this after removal to refresh the List View
MainActivity.getInstance().refreshListView();