如何以编程方式将 android 中的 ListView 滚动到上下手势

How to Scroll a ListView in android programatically to up to down gesture

我是 android 的新手,在我的演示应用程序中实现了下拉刷新和自定义 ListView。我正在从 listItem class 中删除一个项目,当我想要刷新时,该项目已从我的 ListView 中删除,但必须这样做,我想在 deleted.I 尝试过 notifyDatasetChange 后删除该项目这在我的 case.So 中不起作用 我想以编程方式将我的列表下拉,以便刷新列表,请帮我做 it.Thank 你

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

您可以将 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>

并在您的 activity 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
        }        
});

将以下代码添加到您的 activity class 以在另一个 class 中获取它的实例并刷新您的 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();
}

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

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