[英]How to set empty adapter and re-bind adapter to RecyclerView when data load from server
How to register an empty adapters
when accessed fragment
, and perform re-bind into RecyclerView
when data has been received by the server? 如何在访问
fragment
时注册一个empty adapters
,并在服务器接收到数据后如何将其重新绑定到RecyclerView
?
I'm still confused to set the adapter that it is empty, then when I connect to the database, the result will be visible when I use RecyclerView 我仍然对将适配器设置为空感到困惑,然后当我连接到数据库时,当我使用RecyclerView时结果将可见
Maybe someone can teach me how to make it happen 也许有人可以教我如何实现这一目标
My adapter 我的适配器
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();
}
}
My Fragment 我的片段
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();
}
}
And what about the correct way to give notify to the adapter that the data has been changed by using notifyDataSetChanged()
通过使用
notifyDataSetChanged()
向适配器通知数据已更改的正确方法又如何呢?
Please help me to understand the process 请帮助我了解过程
thank you 谢谢
Initialize ChannelAdapter with an empty list of channels and set it to recyclerview. 使用空的频道列表初始化ChannelAdapter并将其设置为recyclerview。 Then when you receive channels list from api update the list in adapter and call notifyDataSetChanged().
然后,当您从api接收频道列表时,请更新适配器中的列表,然后调用notifyDataSetChanged()。 This will update the recyclerview.
这将更新recyclerview。 You don't have to create a new adapter and set it again.
您不必创建新的适配器并重新设置。
Hope you can get what you want like this: In adapter, 希望您能得到想要的东西:在适配器中,
public void addItems(List<SomeTeam> list){
this.list.addAll(list);
notifyDataSetChanged();
}
public void clearItems(){
teams.clear();
}
And you can call this in your activity while setting list in adapter as : 您可以在将适配器中的列表设置为时在活动中调用此方法:
public void setSomeTeamList(List<SomeTeam>teamList){
teamAdapter.clearItems();
teamAdapter.addItems(teamList);
}
Hope you can get idea from above sample code. 希望您能从上面的示例代码中得到启发。
First of all initialize your list 首先初始化您的列表
List<Channel> listChannel = new ArrayList<Channel>();
now in your getChannelData()
you are creating new adapter while setting it to recyclerView
, though you have already created it in onCreateView()
现在在您的
getChannelData()
您正在创建新适配器,同时将其设置为recyclerView
,尽管您已经在onCreateView()
创建了它
recyclerView.setAdapter(adapter); //pass your adapter object instead of creating new object.
adapter.notifyDataSetChanged();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.