我的应用程序有2个标签,有两种不同的布局。当我运行应用程序时,应该在tab1(位置0)中显示的片段显示在tab2中,并且应该在tab2(位置1)中的片段不显示。此外,当我滑动屏幕时,tablayout中的标签焦点没有改变
我在下面给出了我的代码
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;
}
}
看看图片家伙。选项卡1为空,选项卡2显示选项卡1上的内容。选项卡2内容不显示。
答案 0 :(得分:0)
你应该致电:
onCreate
在MainActivity的class StdOutListener(StreamListener):
tweet_number=0 # class variable
def __init__(self,max_tweets):
self.max_tweets=max_tweets # max number of tweets
def on_data(self, data):
self.tweet_number+=1
try:
tweet = json.loads(data)
with open('your_data.json', 'a') as my_file:
json.dump(tweet, my_file)
except BaseException:
print('Error')
pass
if self.tweet_number>=self.max_tweets:
sys.exit('Limit of '+str(self.max_tweets)+' tweets reached.')
def on_error(self, status):
print ("Error " + str(status))
if status == 420:
print("Rate Limited")
return False
l = StdOutListener(1000) # Here you can set your maximum number of tweets (1000 in this example)
函数上。
答案 1 :(得分:0)
我知道线程不是活的,但这可能会帮助某人并节省我必须花费的一天。我遇到了同样的问题。问题是两个片段上的viewID相同。当然,viewpager和fragment应该已经解决了这个问题,但是他们并没有这样做。
对我来说,这是两个不同的片段,即 FragmentHome 和 FragmentNotification 。两者都必须使用 recyclerView 显示数据。 Home是左边的第一个片段,接下来是通知。但首先显示为空白,主页内容显示在预期通知内容的下一个选项卡上。由于两者都有相同的recyclerViews,我写了一个 layout_recycler_wrapper.xml 来重用代码。其中 RelativeLayout ( R.id.rl_wrapper )与 recyclerView 在一起。
根本原因是我使用<include>
在两个片段布局文件中包含了这个layout_recycler_wrapper。因此,包装器viewGroup( RelativeLayout )的相同ID( R.id.rl_wrapper )被多次使用。
然后我直接在片段的xml文件中编写了包装代码,而不是使用<include>
标记。然后在相应的文件中将 RelativeLayout 包装的ID更改为 R.id.rl_wrapper_home 和 R.id.rl_wrapper_notification 。
在下一次运行中,第一个片段神奇地 FragmentHome 。 Yahooo .....:)
因此,最终,使用具有相同ID的视图(即使在不同的片段中)也会产生问题。这是一个可能的原因。检查您的XML文件并删除ID的可能重用,这也可能为您解决问题。