Java 在android LinearLayout类中实现接口-RecycleViewGenericaAdapter
我有一个通用的Java 在android LinearLayout类中实现接口-RecycleViewGenericaAdapter,java,android,interface,Java,Android,Interface,我有一个通用的RecycleView,我有不同的行类,在这个行类中我想实现一个接口,我的目标是将文本从OnQueryTextListener传递到实现接口的活动或片段 public class PlantDocHeader extends LinearLayout implements RecycleViewGenericAdapter.RecyclerViewRowHeader<PlantDocViewModel> { private Button buttonQuest
RecycleView
,我有不同的行类,在这个行类中我想实现一个接口,我的目标是将文本从OnQueryTextListener
传递到实现接口的活动或片段
public class PlantDocHeader extends LinearLayout implements RecycleViewGenericAdapter.RecyclerViewRowHeader<PlantDocViewModel> {
private Button buttonQuestion;
private Button buttonPosts;
private TextView searchTxtField;
private ImageView imageViewExpandSearch;
private SearchView searchView;
private boolean expand = true;
SearchView.OnQueryTextListener onQueryTextListener;
private onTextChange onTextChange;
Resources res;
public PlantDocHeader(Context context) {
super(context);
}
public PlantDocHeader(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public PlantDocHeader(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
searchTxtField = findViewById(R.id.textView_plant_doc_header_search);
imageViewExpandSearch = findViewById(R.id.imageView_plant_doc_header_expand_button);
searchView = findViewById(R.id.searchView_plant_doc_header);
buttonQuestion = findViewById(R.id.button_plant_doc_header_filter_my_posts);
buttonPosts = findViewById(R.id.button_plant_doc_header_filter_question);
}
@Override
public void showData(PlantDocViewModel item) {
res = getResources();
buttonQuestion.setText(res.getString(R.string.question));
buttonQuestion.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AskQuestionFragment askQuestionFragment = new AskQuestionFragment();
ChangeFragment(askQuestionFragment, (Activity) getContext(), false);
}
});
buttonPosts.setText(res.getString(R.string.my_posts));
buttonPosts.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
PlantDocMyPostsFragment myPostsFragment = new PlantDocMyPostsFragment();
ChangeFragment(myPostsFragment, (Activity) getContext(), false);
}
});
searchTxtField.setText(res.getString(R.string.search));
imageViewExpandSearch.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(expand){
searchView.setVisibility(VISIBLE);
imageViewExpandSearch.setImageResource(R.drawable.collapse);
expand = false;
}else{
searchView.setVisibility(GONE);
imageViewExpandSearch.setImageResource(R.drawable.expand);
expand = true;
}
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Toast.makeText(getContext(), ""+newText, Toast.LENGTH_SHORT).show();
onTextChange.textSearch(newText);
return true;
}
});
}
public interface onTextChange {
void textSearch(String searchText);
}
}
公共类PlantDoHeader扩展LinearLayout实现RecycleViewGenericaAdapter.RecycleServiceEWRowHeader{
私人按钮查询;
私人按钮;
私有文本视图searchTxtField;
私有ImageView imageViewExpandSearch;
私有搜索视图搜索视图;
私有布尔扩展=真;
SearchView.OnQueryTextListener OnQueryTextListener;
私有onTextChange;
资源和资源;
公共种植园负责人(上下文){
超级(上下文);
}
公共PlantDocHeader(上下文上下文,@Nullable AttributeSet attrs){
超级(上下文,attrs);
}
公共PlantDocHeader(上下文上下文,@Nullable AttributeSet attrs,int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
}
@凌驾
充气时受保护的空隙(){
超级充气();
searchTxtField=findviewbyd(R.id.textView\u plant\u doc\u header\u search);
imageViewExpandSearch=findViewById(R.id.imageView\u plant\u doc\u header\u expand\u按钮);
searchView=findViewById(R.id.searchView\U plant\U doc\U header);
buttonQuestion=findViewById(R.id.button\u plant\u doc\u header\u filter\u my\u posts);
buttonPosts=findViewById(R.id.button\u plant\u doc\u header\u filter\u question);
}
@凌驾
公共无效显示数据(PlantDocViewModel项){
res=getResources();
setText(res.getString(R.string.question));
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
AskQuestionFragment AskQuestionFragment=新的AskQuestionFragment();
ChangeFragment(askQuestionFragment,(活动)getContext(),false);
}
});
buttonPosts.setText(res.getString(R.string.my_posts));
buttonPosts.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
PlantDocMyPostsFragment myPostsFragment=新的PlantDocMyPostsFragment();
ChangeFragment(myPostsFragment,(Activity)getContext(),false);
}
});
searchTxtField.setText(res.getString(R.string.search));
imageViewExpandSearch.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(展开){
searchView.setVisibility(可见);
imageViewExpandSearch.setImageResource(R.drawable.collapse);
expand=false;
}否则{
searchView.setVisibility(消失);
imageViewExpandSearch.setImageResource(R.drawable.expand);
expand=true;
}
}
});
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
Toast.makeText(getContext(),“”+newText,Toast.LENGTH_SHORT).show();
textSearch(newText);
返回true;
}
});
}
公共接口onTextChange{
无效文本搜索(字符串搜索文本);
}
}
这就是我得到的错误
尝试调用接口方法“void”
com.gardify.android.UI.PlantDoc.PlantDocHeader$onTextChange.textSearch(java.lang.String)'
关于空对象引用
RecycleViewGenericaAdapter
/**
* @param <T> is generic parameter type provided to List, OnRecyclerViewItemClickListener and RecyclerViewRow
* @param <V> generic type for header view Model
* @param <E> generic type for footer view Model
*/
public class RecycleViewGenericAdapter<T, V, E> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<T> mDataset;
private V mHeaderData;
private E mFooterData;
private static final int TYPE_HEADER = 000;
private static final int TYPE_ITEM = 111;
private static final int TYPE_FOOTER = 222;
private OnItemClickListener<T> onItemClickListener;
private OnItemClickListenerHeader<V> onItemClickListenerHeader;
private OnItemClickListenerFooter<E> onItemClickListenerFooter;
private int layoutId, layoutIdHeader, layoutIdFooter;
public RecycleViewGenericAdapter(List<T> mDataset, int layoutId, V mHeaderData, int layoutIdHeader,
E mFooterData, int layoutIdFooter, OnItemClickListener<T> onItemClickListener,
OnItemClickListenerHeader onItemClickListenerHeader, OnItemClickListenerFooter onItemClickListenerFooter) {
this.onItemClickListener = onItemClickListener;
this.onItemClickListenerHeader = onItemClickListenerHeader;
this.onItemClickListenerFooter = onItemClickListenerFooter;
this.mDataset = mDataset;
this.mHeaderData = mHeaderData;
this.mFooterData = mFooterData;
this.layoutId = layoutId;
this.layoutIdHeader = layoutIdHeader;
this.layoutIdFooter = layoutIdFooter;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder vh = null;
if (viewType == TYPE_ITEM) {
RecyclerViewRow<T> row = (RecyclerViewRow<T>) LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
vh = new ItemViewHolder(row);
}else if (viewType == TYPE_HEADER) {
RecyclerViewRowHeader<V> rowHeader = (RecyclerViewRowHeader<V>) LayoutInflater.from(parent.getContext()).inflate(layoutIdHeader, parent, false);
vh = new HeaderViewHolder(rowHeader);
} else if(viewType == TYPE_FOOTER) {
RecyclerViewRowFooter<E> footerRow = (RecyclerViewRowFooter<E>) LayoutInflater.from(parent.getContext()).inflate(layoutIdFooter, parent, false);
vh = new FooterViewHolder(footerRow);
}
return vh;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof RecycleViewGenericAdapter.ItemViewHolder) {
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.onBind((mHeaderData!=null? position-1 : position), itemViewHolder);
} else if (holder instanceof RecycleViewGenericAdapter.HeaderViewHolder) {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.onBind(headerViewHolder);
} else if (holder instanceof RecycleViewGenericAdapter.FooterViewHolder) {
FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
footerViewHolder.onBind(footerViewHolder);
}
}
@Override
public int getItemCount() {
if (mHeaderData != null && mFooterData != null) {
return mDataset.size() + 2;
} else if (mHeaderData != null || mFooterData != null) {
return mDataset.size() + 1;
}
return mDataset.size();
}
private int getLastPosition() {
return getItemCount() - 1;
}
private boolean isLastPosition(int position) {
return position == getLastPosition();
}
@Override
public int getItemViewType(int position) {
if (position == 0 && mHeaderData!=null) {
return TYPE_HEADER;
} else if (isLastPosition(position) && mFooterData!=null) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
/**
* Item ViewHolder
**/
public class ItemViewHolder extends RecyclerView.ViewHolder {
public RecyclerViewRow<T> mRow;
public ItemViewHolder(RecyclerViewRow<T> itemView) {
super((View) itemView);
mRow = itemView;
}
private void onBind(final int position, ItemViewHolder viewHolder) {
viewHolder.mRow.showData(mDataset.get(position));
((View) viewHolder.mRow).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(mDataset.get(position));
}
}
});
}
}
public interface RecyclerViewRow<T> {
void showData(T item);
}
public interface OnItemClickListener<T> {
void onItemClick(T position);
}
public void updateList(List<T> _mDataset){
this.mDataset= _mDataset;
notifyDataSetChanged();
}
/**
* Header ViewHolder
**/
public class HeaderViewHolder extends RecyclerView.ViewHolder {
public RecyclerViewRowHeader<V> mRowHeader;
public HeaderViewHolder(RecyclerViewRowHeader<V> itemView) {
super((View) itemView);
mRowHeader = itemView;
}
private void onBind(HeaderViewHolder viewHolder) {
viewHolder.mRowHeader.showData(mHeaderData);
((View) viewHolder.mRowHeader).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListenerHeader != null) {
onItemClickListenerHeader.onItemClickHeader(mHeaderData);
}
}
});
}
}
public interface RecyclerViewRowHeader<V> {
void showData(V item);
}
public interface OnItemClickListenerHeader<V> {
void onItemClickHeader(V position);
}
/**
* Footer ViewHolder
**/
public class FooterViewHolder extends RecyclerView.ViewHolder {
public RecyclerViewRowFooter<E> mRowFooter;
public FooterViewHolder(RecyclerViewRowFooter<E> itemView) {
super((View) itemView);
mRowFooter = itemView;
}
private void onBind(FooterViewHolder viewHolder) {
viewHolder.mRowFooter.showData(mFooterData);
((View) viewHolder.mRowFooter).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListenerFooter != null) {
onItemClickListenerFooter.onItemClickFooter(mFooterData);
}
}
});
}
}
public interface RecyclerViewRowFooter<E> {
void showData(E item);
}
public interface OnItemClickListenerFooter<E> {
void onItemClickFooter(E position);
}
}
/**
*@param是提供给列表、OnRecycleServiceItemClickListener和RecycleServiceWriw的通用参数类型
*@param头视图模型的泛型类型
*@param页脚视图模型的泛型类型
*/
公共类RecycleView通用适配器扩展了RecycleView.Adapter{
私有列表数据集;
私人V mHeaderData;
私有E-mFooterData;
私有静态最终整数类型\ U头=000;
专用静态最终整数类型_项=111;
私有静态最终整型_FOOTER=222;
私有OnItemClickListener OnItemClickListener;
私有OnItemClickListenerHeader OnItemClickListenerHeader;
私有OnItemClickListenerFooter OnItemClickListenerFooter;
私人内部layoutId、layoutIdHeader、layoutIdFooter;
公共回收EWGENERICAAPTER(列表mDataset、int layoutId、V mHeaderData、int layoutIdHeader、,
E mFooterData、int LayoutFooter、OnItemClickListener、OnItemClickListener、,
OnItemClickListenerHeader OnItemClickListenerHeader,OnItemClickListenerFooter OnItemClickListenerFooter){
this.onItemClickListener=onItemClickListener;
this.onItemClickListenerHeader=onItemClickListenerHeader;
this.onItemClickListenerFooter=onItemClickListenerFooter;
this.mDataset=mDataset;
this.mHeaderData=mHeaderData;
this.mFooterData=mFooterData;
this.layoutId=layoutId;
this.layoutIdHeader=layoutIdHeader;
this.layoutdfooter=layoutdfooter;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder vh=null;
if(viewType==类型\项){
RecyclerViewRow行=(RecyclerViewRow)LayoutFlater.from(parent.getContext()).inflate(layoutId,parent,false);
vh=新项目视图持有者(世界其他地区);
}else if(viewType==类型\标题){
RecyclerViewHeader rowHeader=(RecyclerViewHeader)
public class PlantDocFragment extends Fragment implements RecycleViewGenericAdapter.OnItemClickListener<PlantDocViewModel>, PlantDocHeader.OnTextChangeListener {
//...
RecycleViewGenericAdapter<PlantDocViewModel, PlantDocViewModel, Nullable> adapter = new RecycleViewGenericAdapter<>(plantDocList, R.layout.recycler_view_plant_doc_row_item, plantDocHeader, R.layout.recycler_view_plant_doc_header,
null, 0, this, null, null);
//...
@Override
public void textSearch(String searchText) {
Toast.makeText(getContext(), "searched text : "+searchText, Toast.LENGTH_SHORT).show();
}
public void setOnTextChange(onTextChange onTextChange) {
this.onTextChange = onTextChange;
}
implements PlantDocHeader.OnTextChange
adapter.setOnTextChange(this);
public class PlantDocHeader<T> extends LinearLayout {
private OnTextChangeListener onTextChangeListener;
public void setOnTextChangeListener(OnTextChangeListener onTextChangeListener) {
this.onTextChangeListener = onTextChangeListener;
}
public void setData(T data) {
}
}
public class RecycleViewGenericAdapter<T, V, E> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private OnItemClickListener<T> onItemClickListener;
private OnItemClickListenerHeader<V> onItemClickListenerHeader;
private OnItemClickListenerFooter<E> onItemClickListenerFooter;
private PlantDocHeader.OnTextChangeListener onTextChangeListener;
private int layoutId, layoutIdHeader, layoutIdFooter;
public RecycleViewGenericAdapter(List<T> mDataset, int layoutId, V mHeaderData, int layoutIdHeader,
E mFooterData, int layoutIdFooter) {
this.mDataset = mDataset;
this.mHeaderData = mHeaderData;
this.mFooterData = mFooterData;
this.layoutId = layoutId;
this.layoutIdHeader = layoutIdHeader;
this.layoutIdFooter = layoutIdFooter;
}
}
public class HeaderViewHolder extends RecyclerView.ViewHolder {
public RecyclerViewRowHeader<V> mRowHeader;
public HeaderViewHolder(RecyclerViewRowHeader<V> itemView) {
super((View) itemView);
mRowHeader = itemView;
}
private void onBind(HeaderViewHolder viewHolder) {
viewHolder.mRowHeader.setOnTextChangeListener(onTextChangeListener);
viewHolder.mRowHeader.showData(mHeaderData);
((View) viewHolder.mRowHeader).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListenerHeader != null) {
onItemClickListenerHeader.onItemClickHeader(mHeaderData);
}
}
});
}
}