如何以编程方式在Android中向上或向下滚动ListView手势

4
我是安卓的新手,在我的演示应用程序中实现了下拉刷新和自定义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
你可以将 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
        }        
});

0
在你的Activity类中添加以下代码,以便在另一个类中获取它的实例并刷新你的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(); 

我已经在我的listItem类中添加了这些行,但还没有完成。>:( - sulphuric Acid
我能在Fragment中使用它吗?因为我正在使用Fragment代替Activity。 - sulphuric Acid
是的,你可以在Fragment中使用它,但需要将MainActivity的实例变量更改为private static YourFragment instance; 并在getInstance()中返回相同的实例,并通过YourFragment.getInstance().refreshListView()调用方法,其余代码保持不变。 - zeeali
如果我的回答真的对您有帮助,请不要忘记给我投票并接受我的答案。 - zeeali
1
希望这能对你有所帮助或者给你解决问题的灵感。愉快编程 :) - zeeali
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接