2

我的應用程序有兩個選項卡和兩種不同的佈局。當我運行應用程序時,應該顯示在tab1(位置0)中的片段顯示在tab2中,並且應該位於tab2(位置1)中的片段不顯示。此外,當我刷一下Tab鍵焦點並不在tablayout改變屏幕Tablayout +查看尋呼機沒有顯示位置0的片段

我已經給下面

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

    } 
} 

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

我相信這些碎片沒有問題。我認爲問題出在tablayout上。我無法弄清楚問題出在哪裏。

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

看一看圖像傢伙。標籤1是空的,標籤2顯示標籤1上的內容。標籤2的內容不顯示。

+0

當使用<= 3個靜態片段時,您的適配器應該擴展'FragmentPagerAdapter'。當你有大量的片段時,「FragmentStatePagerAdapter」是一個不錯的選擇。在這裏你可以找到更多的細節:https://developer.android.com/reference/android/support/v13/app/FragmentPagerAdapter.html –

回答

0

你應該叫:

viewPagerVP.setCurrentItem(0); 

onCreate MainActivity的功能。

+1

我試過了,仍然無法正常工作。無論如何,視圖尋呼機適配器應該正確地完成這項工作。它返回放置在viewpager中的片段。另外我還設置了viewPagerVP.setCurrentItems(tab.getPosition());在onTabSeleted()應該工作,當我選擇選項卡。但它也行不通。 –

0

我知道該線程並非活着,但這可能有助於某人並節省我必須花費的時間。我遇到了同樣的問題。問題是兩個片段上的相同viewID。當然,viewpager和fragment應該已經處理了這個,但是不知爲何它們沒有。

對我來說,這是發生了兩個不同的片段即FragmentHomeFragmentNotification。兩者都必須使用recyclerView顯示數據。首頁是第一個片段,然後是通知。但是首先顯示爲空白,並且在預計通知內容的下一個標籤上顯示了家庭內容。由於兩者具有相同的recyclerViews,我寫了一個layout_recycler_wrapper.xml以重用代碼。其中一個RelativeLayoutR.id.rl_wrapper)在那裏與recyclerView。 根本原因是我使用<include>在這兩個片段佈局文件中都包含了這個layout_recycler_wrapper。因此,該包裝視圖組(RelativeLayout)的相同ID(R.id.rl_wrapper)被多次使用。

然後,我直接在碎片的xml文件中編寫包裝代碼,而不是使用<include>標籤。然後改變ID爲RelativeLayout包裝爲R.id.rl_wrapper_homeR.id.rl_wrapper_notification在各自的文件中。

在下一次運行中,第一個片段是神奇的FragmentHome。 Yahooo ..... :)

因此,最終,使用具有相同ID的視圖(即使在不同的片段中)也會產生問題。這是一個可能的原因。檢查你的XML文件,並刪除可能重複使用的ID,這也可能爲你解決問題。

相關問題