0

所以基本上,我在ViewPagerTabLayout中有两个选项卡,用于在选项卡视图中存储两个片段。事实上,我在recycler view中使用card view,而card view就像Like Button。基本上,当用户点击按钮时,它应该出现在下一个选项卡上 - 但它不会。只有当用户离开整个页面并返回到该页面并选择该选项卡时,才会显示所选的card view。我检查了我的数据库,它正在做它应该是,但它是不更新的recycler view为什么当我进入下一个选项卡时,我的recyclerview不会更新?

这是在card view我的liking内容代码:

IN CUSTOM ADAPTER CLASS 
holder.likebutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Database database = new Database(fragment.getContext()); 
       database.likeContent(userID, contentID, name); 
      } 
     }); 

DATABASE CLASS 
public void likeContent(int userID, int contentID, String name){ 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(USER_ID, userID); 
    contentValues.put(CONTENT_ID, contentID); 
    contentValues.put(NAME, name); 
    sqLiteDatabase.insert(DB_TABLE_NAME, null, contentValues); 
} 

BACKGROUND CLASS 
public void showFavourites(final ArrayList<Integer> likes){ 
     theURL = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     requestQueue = Volley.newRequestQueue(fragment.getActivity()); 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest 
       (theURL, new Response.Listener<JSONArray>(){ 
        @Override 
        public void onResponse(JSONArray jsonArray) { 
         try { 
          for (int i = 0; i < jsonArray.length(); i++) { 
           ... 
           adapter.notifyDataSetChanged(); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener(){ 

        @Override 
        public void onErrorResponse(VolleyError volleyError) { 

        } 
       } 
       ); 
     requestQueue.add(jsonArrayRequest); 
    } 

SECOND TAB CLASS 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.likes, container, false); 
     recyclerView = (RecyclerView) rootView.findViewById(R.id.rlikes); 
     recyclerView.setHasFixedSize(true); 
     list = new ArrayList<UserInfo>(); 
     adapter = new CAdapter(list, SecondTab.this); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setAdapter(adapter); 
     conditionNames = new ArrayList<>(); 
     Background = new Background(SecondTab.this, list, adapter); 
     inputs = new ArrayList<>(); 
     populate(); 
     return rootView; 
    } 

    public void populate(){ 
     background.showFavourites(inputs); 
    } 

所以后,我点击它在database更新Custom Adapter Classlike按钮,但它不会在第二个选项卡更新recyclerview

编辑:我的寻呼机适配器:

public class TabAdapter extends FragmentPagerAdapter{ 

    String tabNames[] = new String[] {"Current", "Likes"}; 
    Context context; 

    public PodcastGUITabAdapter(FragmentManager fragmentManager, Context context){ 
     super(fragmentManager); 
     this.context = context; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position){ 
      case 0: 
       return new CurrentTab(); 
      case 1: 
       return new LikesTab(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return tabNames.length; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabNames[position]; 
    } 

} 

我缺少什么?

+0

后寻呼机适配器代码。很可能你需要在getItem函数中返回一个新的fragment实例。 –

+0

@vipulmittal,我编辑了我的问题以包含'getItem()'函数 –

+0

将与从onCreate填充列表相关的代码放入onResume。此外,如果这不工作检查http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager –

回答

0

我有同样的问题,并使用广播解决它。

我在两个标签中注册了BroadcastReceiver

然后,更新数据库后,我发送一个广播,它被两个选项卡和onReceive方法接收,我将数据重新加载到回收站视图。

如何使用广播(所有代码进入YourFragementClass):

首先需要声明广播:

public static final String BROADCAST_NAME = "com.yourapp.broadcast_name"; 

发送广播:

getContext().sendBroadcast(new Intent(BROADCAST_NAME)); 

注册广播接收机:

private static IntentFilter broadcastIntentFilter = new IntentFilter(BROADCAST_NAME); 
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override public void onReceive(Context context, Intent intent) { 
      YourFragmentClass.this.refreshRecyclerAdapter(); 
     } 
    }; 
private boolean broadcastReceiverRegistered = false; 

还需要注销并在onDestroy()onResume()重新注册接收器:

@Override 
    public void onResume() { 
     super.onResume(); 
     getActivity().registerReceiver(broadcastReceiver, broadcastIntentFilter); 
     broadcastReceiverRegistered = true; 
    } 

    @Override 
    public void onDestroy() { 
     if(broadcastReceiverRegistered) { 
      getActivity().unregisterReceiver(broadcastReceiver); 
      broadcastReceiverRegistered = false; 
     } 
     super.onDestroy(); 
    } 

你应该实现YourFragmentClass.this.refreshRecyclerAdapter();方法是这样的:

private void refreshRecyclerAdapter() { 
     List<Items> items = getYourItems(); 
     ItemsRecyclerAdapter adapter = new ItemsRecyclerAdapter(getActivity(), items); 
     mRecyclerView.setAdapter(adapter); 
    } 
+0

我该如何使用它? –

相关问题