0

アクティビティーに4つのタブを持つTabLayoutがあり、各タブごとにフラグメントを作成しました。私は、各フラグメントでRecyclerViewを持っている、と私はRecyclerViewに表示するAsyncTaskを使用してWebサービスからデータを取得RecyclerViewアダプターはTabLayoutで競合します

public class MyActivity extends AppCompatActivity { 

private static final String TAG = "RecyclerView"; 
private Toolbar toolbar; 
private static ViewPager viewPager; 
private static TabLayout tabLayout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* Allow activity to show indeterminate progressbar */ 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 

    setContentView(R.layout.student_regulations_list); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    viewPager = (ViewPager) findViewById(R.id.viewPager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
    tabLayout.setupWithViewPager(viewPager); 
    tabLayout.setOnTabSelectedListener(onTabSelectedListener(viewPager)); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new Fragment1(), getString(R.string.titleA)); 
    adapter.addFragment(new Fragment2(), getString(R.string.titleB)); 
    adapter.addFragment(new Fragment3(), getString(R.string.titleC)); 
    adapter.addFragment(new Fragment4(), getString(R.string.titleD)); 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(3); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
} 

private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager viewPager) { 
    return new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition());//setting current selected item over viewpager 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
     } 
    }; 
} 

//View Pager fragments setting adapter class 
class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>();//fragment arraylist 
    private final List<String> mFragmentTitleList = new ArrayList<>();//title arraylist 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    //adding fragments and title method 
    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

は、以下の私の活動コードです。 RecyclerViewの各項目はIDを持っています。私は、タブを切り替えてRecyclerViewの項目をクリックすると、ToastにIDが表示されます。以下

は、フラグメントのコードである:各断片を仮定

public class Fragment1 extends Fragment implements ClickListener { 

private static final String TAG = "RecyclerView"; 
private List<FeedItem> feedItemList; 
private RecyclerView mRecyclerView; 
private FeedsRecyclerAdapter mAdapter; 
final String url = "a valid url"; 
private View rootView; 
private ProgressBar progressBar; 

public StuRegGeneralListFragment() { 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
         @Nullable Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.fragment_student_regulations_list, container, false); 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    progressBar = (ProgressBar) rootView.findViewById(R.id.progress_bar); 

    /* Initialize recyclerview */ 
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    /*Downloading data from below url*/ 
    new AsyncHttpTask().execute(url); 
} 

@Override 
public void itemClicked(View view, int position) { 
    FeedItem item = feedItemList.get(position); 

    Intent intent = new Intent(getActivity(), JsonRequestFeedActivity.class); 
    intent.putExtra("url", Const.URL_JSON_OBJECT_REGS + item.getID()); 
    intent.putExtra("pid", item.getID()); 
    //startActivity(intent); 
    Toast.makeText(getActivity(), "Item ID: " + item.getID(), Toast.LENGTH_SHORT).show(); 
} 

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> { 

    @Override 
    protected void onPreExecute() { 
     progressBar.setVisibility(View.VISIBLE); 
     feedItemList = new ArrayList<FeedItem>(); 
    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     InputStream inputStream = null; 
     Integer result = 0; 
     HttpURLConnection urlConnection = null; 

     try { 
      /* forming th java.net.URL object */ 
      URL url = new URL(params[0]); 

      urlConnection = (HttpURLConnection) url.openConnection(); 

      /* for Get request */ 
      urlConnection.setRequestMethod("GET"); 

      int statusCode = urlConnection.getResponseCode(); 

      /* 200 represents HTTP OK */ 
      if (statusCode == 200) { 

       BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder response = new StringBuilder(); 
       String line; 
       while ((line = r.readLine()) != null) { 
        response.append(line); 
       } 

       parseResult(response.toString()); 
       result = 1; // Successful 
      } else { 
       result = 0; //"Failed to fetch data!"; 
      } 

     } catch (Exception e) { 
      Log.d(TAG, e.getLocalizedMessage()); 
     } 

     return result; //"Failed to fetch data!"; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     progressBar.setVisibility(View.GONE); 

     /* Download complete. Lets update UI */ 
     if (result == 1) { 
      updateRecyclerView(); 
     } else { 
      Log.e(TAG, "Failed to fetch data!"); 
     } 
    } 
} 

private void parseResult(String result) { 
    try { 
     JSONObject response = new JSONObject(result); 
     JSONArray posts = response.optJSONArray("posts"); 

     /*Initialize array if null*/ 
     if (null == feedItemList) { 
      feedItemList = new ArrayList<FeedItem>(); 
     } 

     for (int i = 0; i < posts.length(); i++) { 
      JSONObject post = posts.optJSONObject(i); 

      FeedItem item = new FeedItem(); 
      item.setID(post.optString("id")); 
      item.setDate(post.optString("date")); 
      item.setTitle(post.optString("title")); 
      item.setThumbnail(post.optString("thumbnail")); 
      feedItemList.add(item); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

public void updateRecyclerView() { 
    mAdapter = new FeedsRecyclerAdapter(getActivity(), feedItemList); 
    mRecyclerView.setAdapter(mAdapter); 

    mAdapter.setClickListener(this); 
} 

}

は、fragment2にID 6〜10 fragment1におけるID 1から5までRecyclerView 5つの項目を(有し、... )私は自分のアクティビティに入り、フラグメント1(例えば最初のアイテム)のアイテムをクリックすると、ID = 1がトーストに表示されますが、ID = 16が表示されます。

実際には、viewPager.setOffscreenPageLimit(3)のためです。私のアクティビティでは、fragment1とfagment2とfragment3とfragment4が作成され、最後にmAdapterにはitem1〜16が含まれていますが、フラグメント1に含まれています。 viewPager.setOffscreenPageLimit(int)によって指定されたフラグメントを作成した後に期待します。各フラグメントはそれ自身のアダプタを持っていますが、それは起こっていません。

何か助けていただければ幸いです。

答えて

0

私は間違いを見つけました。

私の活動と断片コードは正しいですが、私の間違いはRecyclerViewのClickListenerにありました。私の場合は実装が適切ではありませんでした。

私はそれに静的なclickListenerを使用しました。それがポイントでした!

関連する問題