【问题标题】:How to Scroll a ListView in android programatically to up to down gesture如何以编程方式在android中滚动ListView到上下手势
【发布时间】:2016-06-22 01:10:03
【问题描述】:

我是 android 新手,在我的演示应用中实现了拉动刷新和自定义 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();   
            }    
        }   
    }

【问题讨论】:

    标签: android listview loader pull-to-refresh


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      将以下代码添加到您的活动类中,以在另一个类中获取它的实例并刷新您的 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 是一个单独的类。那么该代码放在哪里?
      • 我已经在我的 listItem 类中添加了这一行但没有完成。>:(
      • 我也可以在片段中使用它吗,因为我有片段代替活动。
      • 是的,你可以在Fragment中使用它,但是将MainActivity的实例变量更改为私有静态YourFragment实例;并在getInstance()中返回相同,并通过YourFragment.getInstance().refreshListView()调用方法,其余代码相同。
      • 我希望,它可能对您有所帮助或为您提供了解决问题的想法。快乐编码:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多