以前,我在SearchView
中成功实现了Activity
。现在,我正在寻找在ViewPager
适配器内部的一个片段中实现。但是不断地我得到一个空指针异常。
这是我的适配器
public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> implements
Filterable {
private Context mContext;
private ArrayList<ExampleItem> mExampleList;
private ArrayList<ExampleItem> contactListFiltered;
private OnItemClickListener mListener;
private ExampleAdapterListener listener;
public ExampleAdapter(Context context, ArrayList<ExampleItem> bookslist, ExampleAdapterListener listener) {
this.mContext = context;
this.listener = listener;
this.mExampleList = bookslist;
this.contactListFiltered = bookslist;
}
public void setOnItemClickListener(FragmentActivity activity) {
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList, FragmentActivity activity) {
mContext = context;
mExampleList = exampleList;
}
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
return new ExampleViewHolder(v);
}
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
ExampleItem currentItem = mExampleList.get(position);
String title = currentItem.getTitle();
// int likeCount = currentItem.getLikeCount();
// String imageUrl = currentItem.getImageUrl();
holder.mTextViewCreator.setText(title);
// holder.mTextViewLikes.setText("Likes: " + likeCount);
// Glide.with(mContext).load(imageUrl).apply(RequestOptions.circleCropTransform()).into(holder.mImageView);
}
@Override
public int getItemCount() {
return contactListFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
contactListFiltered = mExampleList;
} else {
ArrayList<ExampleItem> filteredList = new ArrayList<>();
for (ExampleItem row : mExampleList) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(row);
}
}
contactListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = contactListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
contactListFiltered = (ArrayList<ExampleItem>) filterResults.values;
notifyDataSetChanged();
}
};
}
public class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextViewCreator;
// public TextView mTextViewLikes;
// public ImageView mImageView;
public ExampleViewHolder(View itemView) {
super(itemView);
// mTextViewLikes = itemView.findViewById(R.id.text_view_likes);
// mImageView = itemView.findViewById(R.id.image_view);
mTextViewCreator = itemView.findViewById(R.id.text_title);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
mListener.onItemClick(position);
}
}
}
});
}
}
public interface ExampleAdapterListener {
void onContactSelected(ExampleItem contact);
}
}
在以下代码中,我得到了空指针异常。
@Override
public int getItemCount() {
return contactListFiltered.size();
}
我的片段代码是
public class Mylecture extends Fragment implements ExampleAdapter.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener, ExampleAdapter.ExampleAdapterListener {
public static final String YTD_LINK = "link";
private ProgressBar myProgressBar;
private RecyclerView mRecyclerView;
private ExampleAdapter mExampleAdapter;
private ArrayList<ExampleItem> mExampleList;
private SearchView searchView;
private RequestQueue mRequestQueue;
SwipeRefreshLayout mSwipeRefreshLayout;
String url;
public Mylecture() {
// Required empty public constructor
}
private RecyclerView grade, subject, gender, location;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.activity_jsonfeed, container, false);
Bundle bundle = getArguments();
if(bundle!=null){
url = bundle.getString("key_one");
}
mRecyclerView = view.findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.addItemDecoration(new MyDividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL, 36));
mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
mSwipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorBackground);
myProgressBar = view.findViewById(R.id.myProgressBar);
myProgressBar.setIndeterminate(true);
myProgressBar.setVisibility(View.VISIBLE);
mRequestQueue = Volley.newRequestQueue(getActivity());
// SearchBox
searchView = (SearchView) view.findViewById(R.id.search);
searchView.setIconifiedByDefault(false);
searchView.setFocusable(false);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String queryString) {
mExampleAdapter.getFilter().filter(queryString);
return false;
}
@Override
public boolean onQueryTextChange(String queryString) {
mExampleAdapter.getFilter().filter(queryString);
return false;
}
});
// EndSearch
// if (!CheckInternet.getInstance(getActivity()).isOnline()) {
//
//
// } else {
updateListContent();
mExampleList = new ArrayList<>();
mExampleAdapter = new ExampleAdapter(getActivity(), mExampleList, getActivity());
mExampleAdapter.setOnItemClickListener(getActivity());
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setAdapter(mExampleAdapter);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
updateListContent();
}
});
return view;
}
public void updateListContent() {
mSwipeRefreshLayout.setRefreshing(true);
if (mExampleList != null)
mExampleList.clear();
parseJSON();
}
private void parseJSON() {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
myProgressBar.setVisibility(View.GONE);
try {
JSONArray jsonArray = response.getJSONArray("hits");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject hit = jsonArray.getJSONObject(i);
String videoTitle = hit.getString("title");
String link = hit.getString("link");
mExampleList.add(new ExampleItem(videoTitle, link));
mExampleAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
mSwipeRefreshLayout.setRefreshing(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
mSwipeRefreshLayout.setRefreshing(false);
}
});
mRequestQueue.add(request);
}
@Override
public void onItemClick(int position) {
Intent ytdIntent = new Intent(getActivity(), YoutubePlayerActivity.class);
ExampleItem clickedItem = mExampleList.get(position);
ytdIntent.putExtra(YTD_LINK, clickedItem.getmLink());
startActivity(ytdIntent);
}
@Override
public void onRefresh() {
}
@Override
public void onContactSelected(ExampleItem contact) {
}
}
在该片段中,我正在从json在线加载一些数据并将其加载到RecyclerView
中,而我的基本需求是希望实现一个SearchView
,该搜索并显示基于我从json检索到的标题上。
以前,我在Activity
中成功实现了该功能,但是在一个片段中,我无法实现,并且抛出了空指针异常。
答案 0 :(得分:1)
在parseJSON
函数中,仅在ArrayList
中添加项目并不能帮助您在RecyclerView
中获取更新的数据。我建议您将其更改为以下内容。
获得一个函数来更新适配器中的列表并像下面那样修改适配器。
public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> implements
Filterable {
private Context mContext;
private ArrayList<ExampleItem> mExampleList = new ArrayList<ExampleItem>();
private ArrayList<ExampleItem> contactListFiltered = new ArrayList<ExampleItem>();
private OnItemClickListener mListener;
private ExampleAdapterListener listener;
public ExampleAdapter(Context context, ArrayList<ExampleItem> bookslist, ExampleAdapterListener listener) {
this.mContext = context;
this.listener = listener;
this.mExampleList = bookslist;
this.contactListFiltered = bookslist;
}
public void setOnItemClickListener(FragmentActivity activity) {
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList) {
mContext = context;
mExampleList = exampleList;
contactListFiltered = exampleList; // Add the exampleList here as well
}
// Here I added the update list function
public void updateList(ArrayList<ExampleItem> exampleList) {
mExampleList = exampleList;
contactListFiltered = exampleList; // Add the exampleList here as well
}
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
return new ExampleViewHolder(v);
}
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
ExampleItem currentItem = mExampleList.get(position);
String title = currentItem.getTitle();
holder.mTextViewCreator.setText(title);
}
@Override
public int getItemCount() {
return contactListFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
contactListFiltered = mExampleList;
} else {
ArrayList<ExampleItem> filteredList = new ArrayList<>();
for (ExampleItem row : mExampleList) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(row);
}
}
contactListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = contactListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
contactListFiltered = (ArrayList<ExampleItem>) filterResults.values;
notifyDataSetChanged();
}
};
}
public class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextViewCreator;
public ExampleViewHolder(View itemView) {
super(itemView);
mTextViewCreator = itemView.findViewById(R.id.text_title);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
mListener.onItemClick(position);
}
}
}
});
}
}
public interface ExampleAdapterListener {
void onContactSelected(ExampleItem contact);
}
}
然后按如下所示修改parseJSON
函数。
private void parseJSON() {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
myProgressBar.setVisibility(View.GONE);
try {
JSONArray jsonArray = response.getJSONArray("hits");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject hit = jsonArray.getJSONObject(i);
String videoTitle = hit.getString("title");
String link = hit.getString("link");
mExampleList.add(new ExampleItem(videoTitle, link));
// Move this outside of the for loop
// mExampleAdapter.notifyDataSetChanged();
}
// Update the list here and then call notifyDataSetChanged
mExampleAdapter.updateList(mExampleList);
mExampleAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
mSwipeRefreshLayout.setRefreshing(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
mSwipeRefreshLayout.setRefreshing(false);
}
});
mRequestQueue.add(request);
}
希望能解决您的问题。