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,这也可能为你解决问题。

相关问题