为什么我的模拟器上会得到不同的结果?如果使用模拟器 API23 ,则在RecyclerView上不会显示对服务器的数据检索。 但是,如果我使用 API19 的模拟器,那么结果会按照我的意愿出现。
我的代码中是否应该专门为此API23添加?因为我只使用INTERNET权限(已添加到AndroidManifest)作为此应用程序的一个示例。
请看这个结果
如上所示,如果我使用API模拟器23没有错误,数据就不会出现在屏幕模拟器上。我试过一个真正的设备,结果是相同的
但是当我使用模拟器API19时,数据也出现在屏幕上
我试过一个真实的设备,结果数据很好地显示在这个API19上。
我该怎么办? API 23有什么特殊处理吗?在这里,我无法找到解决方案。请帮忙
MainActivity
start_urls
HomeFragment
class DmozSpider(scrapy.Spider):
name = 'dmoz'
allowed_domains = ['dmoz.org']
start_urls = ['http://www.dmoz.org/Computers/Programming/Languages/Python/Books/']
ChannelAdapter
package com.transvision.bertho.transvisiondashboardapp;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.onesignal.OneSignal;
import cn.pedant.SweetAlert.SweetAlertDialog;
import page.DefaultFragment;
import page.HomeFragment;
import page.ProfileFragment;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OneSignal.startInit(this).init();
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
Fragment fragment = null;
fragment = new DefaultFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.root, fragment);
fragmentTransaction.commit();
new SweetAlertDialog(this, SweetAlertDialog.SUCCESS_TYPE)
.setTitleText("Good job!")
.setContentText("You clicked the button!")
.show();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
Fragment fragment = null;
String title = getString(R.string.app_name);
if (id == R.id.nav_camera) {
fragment = new HomeFragment();
title = "Home";
} else if (id == R.id.nav_gallery) {
fragment = new ProfileFragment();
title = "Profile";
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.root, fragment);
fragmentTransaction.commit();
getSupportActionBar().setTitle(title);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void showToast(String output){
Toast.makeText(this.getBaseContext(), output, Toast.LENGTH_SHORT).show();
}
}
频道
package page;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.transvision.bertho.transvisiondashboardapp.R;
import java.util.ArrayList;
import java.util.List;
import adapter.ChannelAdapter;
import butterknife.Bind;
import butterknife.ButterKnife;
import model.Channel;
import model.ChannelResponse;
import rest.ApiClient;
import rest.ApiInterface;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
@Bind(R.id.movies_recycler_view) RecyclerView recyclerView;
@Bind(R.id.swipe_layout) SwipeRefreshLayout swipeRefreshLayout;
private static final String TAG = HomeFragment.class.getSimpleName();
private ChannelAdapter adapter;
List<Channel> listChannel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, rootView);
listChannel = new ArrayList<>();
setUpSwipeLayout();
setUpAdapter();
setUpRecyclerview();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
load();
}
}, 500);
return rootView;
}
protected void setUpSwipeLayout()
{
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorAccent);
swipeRefreshLayout.setOnRefreshListener(this);
}
private void setUpAdapter(){
if(adapter == null){
adapter = new ChannelAdapter(listChannel, R.layout.list_channel, getActivity());
}
}
private void setUpRecyclerview(){
recyclerView.clearOnScrollListeners();
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
}
private void load(){
swipeRefreshLayout.setRefreshing(true);
ApiInterface apiService = ApiClient.getChannel().create(ApiInterface.class);
Call<ChannelResponse> call = apiService.getItems();
call.enqueue(new Callback<ChannelResponse>() {
@Override
public void onResponse(Call<ChannelResponse> call, Response<ChannelResponse> response) {
listChannel = response.body().getItems();
adapter = new ChannelAdapter(listChannel, R.layout.list_channel, getActivity());
recyclerView.setAdapter(adapter);
recyclerView.clearOnScrollListeners();
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter.notifyDataSetChanged();
Log.e(TAG, "CONNECTION SUCCESS");
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onFailure(Call<ChannelResponse> call, Throwable t) {
Log.e(TAG, t.toString());
showToast("CONNECTION ERROR");
swipeRefreshLayout.setRefreshing(false);
}
});
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
}
public void showToast(String output){
Toast.makeText(getActivity(), output, Toast.LENGTH_SHORT).show();
}
@Override
public void onRefresh() {
load();
}
}