2016-03-08 4 views
4

Я новичок в андроиде и реализовал pull to refresh и пользовательский ListView в своем демонстрационном приложении. Я удаляю элемент из класса listItem, когда я получаю dong pull, чтобы обновить этот элемент, который был удален из моего ListView, но это необходимо для этого, я хочу удалить этот элемент после его удаления. Я попытался notifyDatasetChange, который не будет работать в моем case.So я хочу сделать потянув мой список вниз так, список программно будет обновить, пожалуйста, помогите мне сделать it.thank выКак прокручивать ListView в андроиде программно до восходящего движения

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

ответ

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(); 
+0

, но я удалить элемент из отдельного class.ListItem является отдельным class.so где поставить этот код? –

+0

Я добавил эти строки в свой класс listItem, но не выполнил.> :( –

+0

Я обновил свой ответ для вас, проверьте его один раз. – zeeali

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