除非我输入搜索视图,否则 Recyclerview 不会显示
Recyclerview not showing unless I type in searchview
我已经实现了一些项目的 recyclerview(从 API 下载)。当我 运行 应用程序或转到此片段时,除非我开始在 SearchView 中输入内容,否则我看不到任何项目(searchview 和其他功能的功能正常)
请在此处找到 Gif
我正在使用 Volley 下载数据,使用 Picasso 下载图像。
我哪里错了?
注意:有几次它自然而然地显示项目(但就像 100 次中的 3 次)
这是我的 fragment.xml 布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.abed.whitelabel.Fragments.MainFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/search_view">
</android.support.v7.widget.SearchView>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/content_employee_list"></android.support.v7.widget.RecyclerView>
</LinearLayout>
</FrameLayout>
我的主要部分 MainFragment.java class:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
downloadEmployeeData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
MainFragment.setMainFragment(this);
sv = (SearchView)view.findViewById(R.id.search_view);
RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.content_employee_list);
mAdapter = new EmployeeAdapter(mainFragment.getContext(), employees_Array);
//mAdapter = new EmployeeAdapter(this, employees_Array); this was the old one
recyclerView.setAdapter(mAdapter);
//LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
LinearLayoutManager layoutManager = new LinearLayoutManager(mainFragment.getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
//Events for searching through list
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return false;
}
});
return view;
}
public void downloadEmployeeData() {
// here I download the data and fill the array
}
public class EmployeeAdapter extends RecyclerView.Adapter<EmployeesDataViewHolder> implements Filterable {
Context c;
ArrayList<EmployeesInfo> mEmployeesInfo;
ArrayList<EmployeesInfo> currentList;
public EmployeeAdapter(Context c, ArrayList<EmployeesInfo> mEmployeesInfo){
this.c = c;
this.mEmployeesInfo = mEmployeesInfo;
this.currentList = mEmployeesInfo;
}
@Override
public void onBindViewHolder(EmployeesDataViewHolder holder, int position) {
final EmployeesInfo employee = this.mEmployeesInfo.get(position);
holder.updateUI(employee);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.loadDetailsFragment(employee);
}
});
}
@Override
public int getItemCount() {
return mEmployeesInfo.size();
}
@Override
public EmployeesDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View card = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_employees, parent, false);
//VolleyGet.getInstance(getA)
return new EmployeesDataViewHolder(card);
}
// FOR search stuff
@Override
public Filter getFilter() {
return FilterHelper.newInstance(currentList,this);
}
public void setEmployeesInfo(ArrayList<EmployeesInfo> filteredEmployees)
{
this.mEmployeesInfo = filteredEmployees;
}
}
还有我的 DataViewHolder:
public class EmployeesDataViewHolder extends RecyclerView.ViewHolder{
private ImageView mainPhoto;
private TextView firstName;
private TextView lastName;
public EmployeesDataViewHolder(View itemView){
super(itemView);
mainPhoto = (ImageView)itemView.findViewById(R.id.list_photo);
firstName = (TextView)itemView.findViewById(R.id.list_firstName);
lastName = (TextView)itemView.findViewById(R.id.list_lastName);
}
public void updateUI(EmployeesInfo employee){
firstName.setText(employee.getFirstName());
lastName.setText(employee.getLastName());
Picasso.with(mainPhoto.getContext()).load(employee.getPhoto()).into(mainPhoto);
}
}
尝试更新代码中的这么多部分
RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.content_employee_list);
//LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
LinearLayoutManager layoutManager = new LinearLayoutManager(mainFragment.getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
mAdapter = new EmployeeAdapter(mainFragment.getContext(), employees_Array);
//mAdapter = new EmployeeAdapter(this, employees_Array); this was the old one
recyclerView.setAdapter(mAdapter);
在 downloadEmployeeData() 函数中下载所有员工数据后,如果没有添加,请添加以下行:
mAdapter.notifyDataSetChanged();
一定是你没有刷新你的适配器,一旦数据被添加到你的 downloadEmployeeData 函数中,当你点击搜索时,你的过滤器代码正在刷新数据。
我已经实现了一些项目的 recyclerview(从 API 下载)。当我 运行 应用程序或转到此片段时,除非我开始在 SearchView 中输入内容,否则我看不到任何项目(searchview 和其他功能的功能正常)
请在此处找到 Gif
我正在使用 Volley 下载数据,使用 Picasso 下载图像。
我哪里错了?
注意:有几次它自然而然地显示项目(但就像 100 次中的 3 次)
这是我的 fragment.xml 布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.abed.whitelabel.Fragments.MainFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/search_view">
</android.support.v7.widget.SearchView>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/content_employee_list"></android.support.v7.widget.RecyclerView>
</LinearLayout>
</FrameLayout>
我的主要部分 MainFragment.java class:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
downloadEmployeeData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
MainFragment.setMainFragment(this);
sv = (SearchView)view.findViewById(R.id.search_view);
RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.content_employee_list);
mAdapter = new EmployeeAdapter(mainFragment.getContext(), employees_Array);
//mAdapter = new EmployeeAdapter(this, employees_Array); this was the old one
recyclerView.setAdapter(mAdapter);
//LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
LinearLayoutManager layoutManager = new LinearLayoutManager(mainFragment.getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
//Events for searching through list
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return false;
}
});
return view;
}
public void downloadEmployeeData() {
// here I download the data and fill the array
}
public class EmployeeAdapter extends RecyclerView.Adapter<EmployeesDataViewHolder> implements Filterable {
Context c;
ArrayList<EmployeesInfo> mEmployeesInfo;
ArrayList<EmployeesInfo> currentList;
public EmployeeAdapter(Context c, ArrayList<EmployeesInfo> mEmployeesInfo){
this.c = c;
this.mEmployeesInfo = mEmployeesInfo;
this.currentList = mEmployeesInfo;
}
@Override
public void onBindViewHolder(EmployeesDataViewHolder holder, int position) {
final EmployeesInfo employee = this.mEmployeesInfo.get(position);
holder.updateUI(employee);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.loadDetailsFragment(employee);
}
});
}
@Override
public int getItemCount() {
return mEmployeesInfo.size();
}
@Override
public EmployeesDataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View card = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_employees, parent, false);
//VolleyGet.getInstance(getA)
return new EmployeesDataViewHolder(card);
}
// FOR search stuff
@Override
public Filter getFilter() {
return FilterHelper.newInstance(currentList,this);
}
public void setEmployeesInfo(ArrayList<EmployeesInfo> filteredEmployees)
{
this.mEmployeesInfo = filteredEmployees;
}
}
还有我的 DataViewHolder:
public class EmployeesDataViewHolder extends RecyclerView.ViewHolder{
private ImageView mainPhoto;
private TextView firstName;
private TextView lastName;
public EmployeesDataViewHolder(View itemView){
super(itemView);
mainPhoto = (ImageView)itemView.findViewById(R.id.list_photo);
firstName = (TextView)itemView.findViewById(R.id.list_firstName);
lastName = (TextView)itemView.findViewById(R.id.list_lastName);
}
public void updateUI(EmployeesInfo employee){
firstName.setText(employee.getFirstName());
lastName.setText(employee.getLastName());
Picasso.with(mainPhoto.getContext()).load(employee.getPhoto()).into(mainPhoto);
}
}
尝试更新代码中的这么多部分
RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.content_employee_list);
//LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
LinearLayoutManager layoutManager = new LinearLayoutManager(mainFragment.getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
mAdapter = new EmployeeAdapter(mainFragment.getContext(), employees_Array);
//mAdapter = new EmployeeAdapter(this, employees_Array); this was the old one
recyclerView.setAdapter(mAdapter);
在 downloadEmployeeData() 函数中下载所有员工数据后,如果没有添加,请添加以下行:
mAdapter.notifyDataSetChanged();
一定是你没有刷新你的适配器,一旦数据被添加到你的 downloadEmployeeData 函数中,当你点击搜索时,你的过滤器代码正在刷新数据。