2016-06-23 10 views
0

RecyclerViewをサンプルアプリケーションに追加しようとすると、エラーE/RecyclerView: No adapter attached; skipping layoutが返されます。RecyclerViewエラー:アダプタが接続されていません。レイアウトをスキップする

これにより、首尾よく私のサーバーから取得されたデータは、(空の)画面上には表示されませんので

この私のコードで

MainActivity

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 page.DefaultFragment; 
import page.HomeFragment; 
import page.ProfileFragment; 

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    private final static String API_KEY = "7e8f60e325cd06e164799af1e317d7a7"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_test); 

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

    } 

    @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.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
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.List; 

import adapter.ChannelAdapter; 
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 { 

    private RecyclerView recyclerView; 

    private static final String TAG = HomeFragment.class.getSimpleName(); 

    @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); 

     recyclerView = (RecyclerView) rootView.findViewById(R.id.movies_recycler_view); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

     getChannelData(); 

     // Inflate the layout for this fragment 
     return rootView; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

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

    public void getChannelData() { 
     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) { 
       int statusCode = response.code(); 
       List<Channel> channel = response.body().getItems(); 
       recyclerView.setAdapter(new ChannelAdapter(channel, R.layout.list_channel, getActivity())); 
      } 

      @Override 
      public void onFailure(Call<ChannelResponse> call, Throwable t) { 
       // Log error here since request failed 
       Log.e(TAG, t.toString()); 
       showToast("CONNECTION ERROR"); 
      } 
     }); 
    } 

    public void showToast(String output){ 
     Toast.makeText(getActivity(), output, Toast.LENGTH_SHORT).show(); 
    } 
} 

マイアダプタ

package adapter; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import com.transvision.bertho.transvisiondashboardapp.R; 

import java.util.List; 

import model.Channel; 


public class ChannelAdapter extends RecyclerView.Adapter<ChannelAdapter.ChannelViewHolder> { 

    private List<Channel> channels; 
    private int rowLayout; 
    private Context context; 

    public static class ChannelViewHolder extends RecyclerView.ViewHolder { 

     LinearLayout moviesLayout; 
     TextView movieTitle; 
     TextView data; 
     TextView movieDescription; 
     TextView rating; 

     TextView name; 
     TextView code; 
     TextView description; 
     TextView number; 
     TextView definition; 
     TextView paket; 
     ImageView logo; 

     public ChannelViewHolder(View v) { 
      super(v); 
      moviesLayout = (LinearLayout) v.findViewById(R.id.movies_layout); 
      name = (TextView) v.findViewById(R.id.title); 
      definition = (TextView) v.findViewById(R.id.subtitle); 
      description = (TextView) v.findViewById(R.id.description); 
//   rating = (TextView) v.findViewById(R.id.rating); 
     } 
    } 

    public ChannelAdapter(List<Channel> channels, int rowLayout, Context context) { 
     this.channels = channels; 
     this.rowLayout = rowLayout; 
     this.context = context; 
    } 

    @Override 
    public ChannelAdapter.ChannelViewHolder onCreateViewHolder(ViewGroup parent, 
                  int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false); 
     return new ChannelViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ChannelViewHolder holder, final int position) { 
     holder.name.setText(channels.get(position).getName()); 
     holder.definition.setText(channels.get(position).getDefinition()); 
     holder.description.setText(channels.get(position).getDescription()); 
//  holder.rating.setText(channels.get(position).getVoteAverage().toString()); 
    } 

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

} 

私のコードで何か問題はありますか?コード配置に間違っていますか?

おかげで、インターネットからデータを取得

+0

コードが –

+0

こんにちは@SaeedJassani私はすでに追加し、問題を見つけるのに役立ちます:

public void addChannel(Channel channel) { channels.add(channel); notifyDatasetChanged();//even better notifyItemInserted(); } 

今すぐあなたの応答のリスナーにあなたはアダプタになったレスポンスボディを追加します。あなたは、Channelを追加したいです私のアダプタは –

+0

より上です。あなたのアダプタコードは問題ありません。リスト "channels"が空ではないと確信していますか?ロギングを試みてください...レイアウトをスキップすることはこれとは関係ありません。AFAIK –

答えて

0

async作業であり、あなたの場合は、通常の正しい方法をかもしれないが、あなたが応答を取得するまで、あなたはrecyclerViewに任意のadapterを結合しない、ここで、時間がかかりすぎると、これではありませんいくつかの理由(例えばなしのインターネット接続)のための任意の応答を得ることはありません、そしてrecyclerView.setAdapterは実行されませんので、私はあなたが最初に空のアダプタを作成することをお勧め、あなたが応答を取得するたびそれからちょうどadapterを更新:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

    recyclerView = (RecyclerView) rootView.findViewById(R.id.movies_recycler_view); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    //Pass empty list to (predefined) adapter 
    adapter = new ChannelAdapter (new ArrayList<>(), rowLayout, getActivity()); 
    //Bind it to recyclerView 
    recyclerView.setAdapter(adapter); 

    getChannelData(); 
    // Inflate the layout for this fragment 
    return rootView; 
} 

ケースに合わせてアダプタにメソッドを追加するお使いのアダプタの

@Override 
     public void onResponse(Call<ChannelResponse> call, Response<ChannelResponse> response) { 

      //Use a loop to add channels you got 
      adapter.addChannel(responsebodyItems); 
     } 
+0

こんにちは@FarShaD上記の手順に従おうとしましたが、何らかのエラーが発生します:https://s31.postimg.org/e3kzzalbv/contoh.png –

関連する問題