2016-06-24 22 views
0

empty adaptersにアクセスするときにfragmentにアクセスする方法と、サーバがデータを受信したときにRecyclerViewに再バインドする方法はありますか?サーバからのデータロード時に空のアダプタを設定し、RecyclerViewにアダプタを再バインドする方法

私はデータベースに接続するときに、結果は私がRecyclerView

を使用するときに多分誰かがどのようにそれが

を実現するために私を教えることができる表示されます、まだそれが空であるアダプタを設定して混乱しています

マイアダプタ

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

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

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

} 

マイ・フラグメント

データは notifyDataSetChanged()

を使用することによって変更されたアダプタに知らせる与えるための正しい方法について

package page; 

import android.app.Activity; 
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.ArrayList; 
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(); 

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


     adapter = new ChannelAdapter (listChannel, R.layout.list_channel, getActivity()); 

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


     getChannelData(); 

     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())); 
       adapter.notifyDataSetChanged(); 
       showToast("CONNECTION SUCCESS"); 
      } 

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

そして、何

がであなたに

+0

でそれを作成しているのに、あなたのgetChannelData()あなたは、新しいアダプタを作成しているでは今、すべてのあなたのリストを初期化

List<Channel> listChannel = new ArrayList<Channel>(); 

の初あなたのリサイクラービューにデータを読み込むloadermanagerの。このリンクを参考にしてくださいhttps://developer.android.com/reference/android/app/LoaderManager.html – sijeesh

答えて

0

初期ChannelAdapterに感謝し、私は、プロセスを理解するのに役立ちますチャネルの空のリストとそれをrecyclerviewに設定します。 apiからチャンネルリストを受け取ったら、アダプタのリストを更新してnotifyDataSetChanged()を呼び出します。これにより、recyclerviewが更新されます。 新しいアダプタを作成して再度設定する必要はありません。アダプタで 、

public void addItems(List<SomeTeam> list){ 
    this.list.addAll(list); 
    notifyDataSetChanged(); 
} 

public void clearItems(){ 
    teams.clear(); 
} 

とアダプタにリストを設定しながらとして、あなたの活動でこれを呼び出すことができます:

+0

私はいくつかのコードを提供するのを手伝ってもらえますか? –

+0

@Ritenは何を手に入れましたか – user3215142

0

はあなたがこのように欲しいものを得ることを願って

public void setSomeTeamList(List<SomeTeam>teamList){ 
    teamAdapter.clearItems(); 
    teamAdapter.addItems(teamList); 
} 

は、あなたがすることを願って上記のサンプルコードからアイデアを得る。

+0

こんにちは@私はhttps://s31.postimg.org/7etgngkhn/error.pngを手に入れます 何が起こるか説明できますか? –

+0

@BerthoJoris、clearItems関数は、あなたのアダプタで定義されたチーム配列リストですか? – Riten

+0

addItems()関数のthis.teams.addAll(list)とclearItems()のteams.clearを実行します。 – Riten

0

recyclerViewにそれを設定しながら、あなたはすでにあなたが利用することができますonCreateView()

recyclerView.setAdapter(adapter); //pass your adapter object instead of creating new object. 
adapter.notifyDataSetChanged(); 
+0

こんにちは@RRR私はあなたのコード、接続の成功を使用するが、画面上の項目の表示がありません。たぶんあなたはそのことについて何かを知っているでしょうか? –

+0

あなたの回答からデータを取得しているかどうかをチェックしてください。 –

+0

response.body()。getItems()<<このレスポンスをPHPのようにvar_dumpする方法は?しかし、私がresponse.code()を記録すると、結果200 –

関連する問題