2

Meine Anwendung verfügt über 2 Registerkarten mit zwei verschiedenen Layouts. Wenn ich die Anwendung ausführe, wird das Fragment, das in Tab1 (Position 0) angezeigt werden soll, in Tab2 angezeigt, und das Fragment, das in Tab2 (Position 1) sein soll, wird nicht angezeigt. Auch wenn ich den Bildschirm der Registerkarte Fokus Swipe nicht im tablayout WechselTablayout + View Pager zeigt das Fragment nicht in Position 0

Ich habe meinen Code unten

MainActivity.java

public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener 
{ 
    TabLayout tabLayoutTL; 
    TabLayout.Tab linearTab, gridTab; 
    ViewPager viewPagerVP; 
    ViewPagerAdapter viewPagerAdapter; 

    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPagerVP.setCurrentItem(tab.getPosition()); 
    } 

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

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


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     viewPagerVP = (ViewPager)findViewById(R.id.viewPagerVP); 
     viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     viewPagerVP.setAdapter(viewPagerAdapter); 

     tabLayoutTL = (TabLayout)findViewById(R.id.tabLayoutTL); 
     linearTab = tabLayoutTL.newTab(); 
     gridTab = tabLayoutTL.newTab(); 

     linearTab.setText("Linear"); 
     gridTab.setText("Grid"); 

     tabLayoutTL.addTab(linearTab, 0); 
     tabLayoutTL.addTab(gridTab, 1); 
     tabLayoutTL.setOnTabSelectedListener(this); 
    } 
} 

MainFragment.java

public class MainFragment extends Fragment { 

    private static final String FRAG_TYPE = "frag_type"; 
    int fragType; 
    RecyclerView recyclerViewRv; 

    public MainFragment() {} 

    public static MainFragment newInstance(int fragType) { 
     MainFragment mainFragment = new MainFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(FRAG_TYPE, fragType); 
     mainFragment.setArguments(args); 
     return mainFragment; 
    } 

    private void initialize() { 
     recyclerViewRv = (RecyclerView)getActivity().findViewById(R.id.recyclerViewRv); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     initialize(); 
     new BackBone().execute(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      fragType = getArguments().getInt(FRAG_TYPE); 
     } 
    } 

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

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 

    class BackBone extends AsyncTask<Void, Void, ArrayList<DataRecord>> { 

     ProgressDialog progressDialog; 
     private static final String flickrUrl = "http://www.flickr.com/services/feeds/photos_public.gne?tags=soccer&format=json&nojsoncallback=1"; 

     private String getData() { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(flickrUrl); 
      try { 
       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       String data = EntityUtils.toString(httpEntity); 
       return data; 
      } catch (Exception e) { 
       return "exception"; 
      } 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setTitle("Loading"); 
      progressDialog.setMessage("Please wait ......."); 
      progressDialog.show(); 
     } 

     @Override 
     protected ArrayList<DataRecord> doInBackground(Void... params) { 
      ArrayList<DataRecord> dataRecords = new ArrayList<>(); 
      try { 
       JSONObject jsonObject = new JSONObject(getData()); 
       JSONArray jsonArray = jsonObject.getJSONArray("items"); 
       for (int i = 0 ; i < jsonArray.length() ; i++) { 
        JSONObject jsonObject1 = jsonArray.getJSONObject(i); 
        DataRecord dataRecord = new DataRecord(); 
        dataRecord.setName(jsonObject1.getString("title")); 
        JSONObject mediaJSONObject = jsonObject1.getJSONObject("media"); 
        dataRecord.setUrl(mediaJSONObject.getString("m")); 
        dataRecords.add(dataRecord); 
       } 
      } catch (Exception e) {} 
      return dataRecords; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<DataRecord> dataRecords) { 
      super.onPostExecute(dataRecords); 
      DataRecordAdapter dataRecordAdapter = new DataRecordAdapter(getActivity(), dataRecords, fragType); 
      if (fragType == 1) { 
       recyclerViewRv.setLayoutManager(new LinearLayoutManager(getActivity())); 
       recyclerViewRv.setBackgroundColor(Color.GREEN); 
      } else if (fragType == 2){ 
       recyclerViewRv.setLayoutManager(new GridLayoutManager(getActivity(), 2)); 
       recyclerViewRv.setBackgroundColor(Color.BLUE); 
      } 
      recyclerViewRv.setAdapter(dataRecordAdapter); 
      progressDialog.dismiss(); 
     } 

    } 
} 
gegeben

ViewPagerAdapter .java

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0 : 
       MainFragment mainFragment = MainFragment.newInstance(1); 
       return mainFragment; 
      case 1 : 
       MainFragment mainFragment1 = MainFragment.newInstance(2); 
       return mainFragment1; 
      default : 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 
} 

Ich bin mir sicher, dass es mit den Fragmenten kein Problem gibt. Ich denke, das Problem ist mit dem tablayout. Ich kann nicht herausfinden, wo genau das Problem ist.

DataRecordAdapter.java

public class DataRecordAdapter extends RecyclerView.Adapter<DataRecordAdapter.MyViewHolder> { 

    ArrayList<DataRecord> dataRecords; 
    Context context; 
    int flag; 
    LayoutInflater layoutInflater; 

    public DataRecordAdapter(Context context, ArrayList<DataRecord> dataRecords, int flag) { 
     this.context = context; 
     this.dataRecords = dataRecords; 
     this.flag = flag; 
     layoutInflater = (LayoutInflater.from(context)); 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 
     if (flag == 1) { 
      view = layoutInflater.inflate(R.layout.linear_data_layout, parent, false); 
     } else { 
      view = layoutInflater.inflate(R.layout.grid_data_layout, parent, false); 
     } 
     MyViewHolder myViewHolder = new MyViewHolder(view); 
     return myViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     DataRecord dataRecord = dataRecords.get(position); 
     holder.textViewTV.setText(dataRecord.getName()); 
     Picasso.with(context).load(dataRecord.getUrl()).into(holder.imageViewIV); 
    } 

    @Override 
    public int getItemCount() { 
     return dataRecords.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder { 
     TextView textViewTV; 
     ImageView imageViewIV; 
     public MyViewHolder(View itemView) { 
      super(itemView); 
      textViewTV = (TextView)itemView.findViewById(R.id.textViewTV); 
      imageViewIV = (ImageView)itemView.findViewById(R.id.imageViewIV); 
     } 
    } 

} 

DataRecord.java

public class DataRecord { 
    String name, url; 

    public String getName() { 
     return name; 
    } 
[![enter image description here][1]][1] 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 
} 

tab 1 is empty

tab 2 is displaying the content which is supposed to be on tab1

einen Blick auf die Bilder, Jungs. Tab 1 ist leer und Tab 2 zeigt den Inhalt, der sich auf Tab 1 befinden soll. Tab 2 Inhalt wird nicht angezeigt.

+0

Wenn Sie <= 3 statische Fragmente verwenden, sollte Ihr Adapter 'FragmentPagerAdapter' erweitern. 'FragmentStatePagerAdapter' ist eine gute Wahl, wenn Sie eine große Anzahl von Fragmenten haben. Hier finden Sie weitere Details: https://developer.android.com/reference/android/support/v13/app/FragmentPagerAdapter.html –

Antwort

0

sollten Sie rufen:

viewPagerVP.setCurrentItem(0); 

auf onCreate Funktion von MainActivity.

+1

Ich habe es versucht, immer noch nicht funktioniert. Trotzdem sollte der View Pager Adapter diesen Job richtig machen. Es gibt das Fragment zurück, das im Viewpager platziert werden soll. Und ich habe auch den viewPagerVP.setCurrentItems (tab.getPosition()); in der onTabSeleted() was sollte funktionieren, wenn ich die Registerkarte auswählen. Aber es funktioniert auch nicht. –

0

Ich weiß, dass der Thread nicht live ist, aber das könnte jemandem helfen und einen Tag retten, den ich ausgeben musste. Ich stieß auf das gleiche Problem. Das Problem waren die gleichen viewIDs auf beiden Fragmenten. Definitiv, Viewpager und Fragment sollten das erledigt haben, aber irgendwie taten sie das nicht.

Für mich dies geschah für zwei verschiedene Fragmente nämlich FragmentHome und FragmentNotification. Beide mussten Daten unter Verwendung RecyclerView zeigen. Home war das erste Fragment in der linken und das nächste war die Benachrichtigung. Aber zuerst wurde leer angezeigt und Home-Inhalt wurde auf der nächsten Registerkarte angezeigt, wo der Inhalt der Benachrichtigung erwartet wurde. Da beide dieselben recyclerViews hatten, schrieb ich eine layout_recycler_wrapper.xml, um den Code wiederzuverwenden. In der eine RelativeLayout (R.id.rl_wrapper) war dort mit einem RecyclerView. Hauptursache war, dass ich einen dieser Layout_recycler_wrapper in beide Fragmentlayoutdateien unter Verwendung <include> einschloss. Also dieselbe ID (R.id.rl_wrapper) dieses Wrappers viewGroup (RelativeLayout) wurde mehr als einmal verwendet.

Dann schrieb ich Wrapper-Code direkt in XML-Dateien Fragment statt <include> Tag verwenden. Dann änderte ID von RelativeLayout Wrapper wie R.id.rl_wrapper_home und R.id.rl_wrapper_notification in entsprechenden Dateien.

Beim nächsten Lauf war das erste Fragment magisch FragmentHome. Yahooo ..... :)

So letztlich, die Verwendung von Ansichten mit der gleichen ID (auch wenn in verschiedenen Fragmenten) Problem erstellt. Dies ist ein möglicher Grund. Überprüfen Sie Ihre XML-Datei und entfernen Sie mögliche Wiederverwendungen von IDs, die möglicherweise auch Ihr Problem lösen.