2017-10-12 46 views
1

我在活动中实现RecyclerView火力地堡 RecyclerAdapter,并希望得到onClickListener实现它,虽然我试图做到这一点,但东西是不正确的在我的代码我想,请帮助我找到什么是错误的。我已经搜索了另一个问题,但没有得到理解,并找不到解决我的问题。获取onClickListener上RecyclerView与火力地堡中的Android

我使用过Android Studio

火力适配器类文件:

public class HomePage extends AppCompatActivity { 

@Override 
    public void onStart() { 
     super.onStart(); 
     FirebaseUser currentUser = mAuth.getCurrentUser(); 
     if (currentUser == null) { 
      sentToStart(); 
     } 

    FirebaseRecyclerAdapter<post, postViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<post, postViewHolder>(

      post.class, 
      R.layout.post_row_recycle_home, 
      postViewHolder.class, 
      mDatabaseReference 
    ) { 
     @Override 
     protected void populateViewHolder(postViewHolder viewHolder, post model, int position) { 
      viewHolder.setwebViewPost(model.getWebViewPost()); 
     } 
    }; 
    mrecyclerView.setAdapter(firebaseRecyclerAdapter); 

} 


public static class postViewHolder extends RecyclerViewPager.ViewHolder { 
    View mView; 

    public postViewHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
     mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mClickListener.onItemClick(v, getAdapterPosition()); 
      } 
     }); 
    } 

    private postViewHolder.ClickListener mClickListener; 

    public interface ClickListener { 
     public void onItemClick(View view, int position); 
    } 

    public void setOnClickListener(postViewHolder.ClickListener clickListener) { 
     mClickListener = clickListener; 
    } 

    public void setwebViewPost(String webViewPost) { 
     WebView webView = (WebView) mView.findViewById(R.id.webView_news); 
     webView.loadUrl(webViewPost); 
    } 

} 

@Override 
public postViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    postViewHolder viewHolder = super.onCreateViewHolder(parent, viewType); 
    viewHolder.setOnClickListener(new postViewHolder().ClickListener() { 
     @Override 
     public void onItemClick (View view,int position){ 
      Toast.makeText(this, "Item clicked at " + position, Toast.LENGTH_SHORT).show(); 
     } 

    }); 
    return viewHolder; 
} 
+0

so你的'onClick'方法(在'postViewHolder'构造函数中)不被调用或者是什么? – pskink

+0

请不要破坏你的帖子。通过在Stack Exchange网络上发布,您已授予SE无法撤销的权利(根据[CC BY-SA 3.0许可证](https://creativecommons.org/licenses/by-sa/3.0))发布该内容/))。通过SE政策,任何破坏行为都将得到回复。如果你想从你的账户中取消关联这篇文章,请参阅[关于解除关联请求的正确途径?](https://meta.stackoverflow.com/q/323395) – adiga

回答

1

移动onClickListener内onBindViewHolder。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    holder.itemView.setOnClickListener(new postViewHolder().ClickListener() { 
     @Override 
     public void onItemClick (View view,int position){ 
      Toast.makeText(this, "Item clicked at " + position, Toast.LENGTH_SHORT).show(); 
     } 

    }); 
} 

编辑:

取下接口,因为它是redundant.Your逝去从viewholder到onCreateViewHolder其值是不必要的。而是处理点击里面的视图。检查更新的班级。

public class HomePage extends AppCompatActivity { 

@Override 
public void onStart() { 
    super.onStart(); 
    FirebaseUser currentUser = mAuth.getCurrentUser(); 
    if (currentUser == null) { 
     sentToStart(); 
    } 

    FirebaseRecyclerAdapter<post, postViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<post, postViewHolder>(post.class, R.layout.post_row_recycle_home, postViewHolder.class, mDatabaseReference) { 
     @Override 
     protected void populateViewHolder(postViewHolder viewHolder, post model, int position) { 
      viewHolder.setwebViewPost(model.getWebViewPost()); 
     } 
    }; 
    mrecyclerView.setAdapter(firebaseRecyclerAdapter); 

} 

public static class postViewHolder extends RecyclerViewPager.ViewHolder { 
    View mView; 

    public postViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //Show the webViewPost Here 
      } 
     }); 
    } 

    public void setwebViewPost(String webViewPost) { 
     WebView webView = (WebView) mView.findViewById(R.id.webView_news); 
     webView.loadUrl(webViewPost); 
    } 

} 

@Override 
public postViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    postViewHolder viewHolder = super.onCreateViewHolder(parent, viewType); 
    return viewHolder; 
    } 
} 
+0

不在内部创建任何“postViewHolder” onBindViewHolder' – pskink

+0

他的代码中没有viewholder是不同的权利?我说移动从onCreateViewHolder点击代码到onBindViewHolder。 – Anonymous

+0

不,不要添加任何在'onBindViewHolder'中使用'position'参数的点击监听器 - 你应该在'ViewHolder'中做这件事,这里不是 – pskink

0

请参阅我的做法,从谷歌的样品+ GoogleIO的YouTube会议采取:

用途:

onCreateViewHolder(ViewGroup中的父母,INT viewType)


newsAdapter = new FirebaseRecyclerAdapter<ModelNews, NewsItemHolder>(
       ModelNews.class, 
       R.layout.item_news, 
       NewsItemHolder.class, 
       FirebaseDatabase.getInstance() 
         .getReference(FIREBASE_NEWS) 
         .orderByChild(FIREBASE_ORDER_BY_FIELD) 
         .limitToFirst(20)) { 

      @Override 
      public NewsItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); 
       final NewsItemHolder newsItemHolder = new NewsItemHolder(view); 

       newsItemHolder.holder.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         int pos = newsItemHolder.getAdapterPosition(); 
         if (pos != RecyclerView.NO_POSITION) { 
          ModelNews clicked = newsAdapter.getItem(pos); 
          if (clicked.getIsExternal() && !hasConnection) { 
           showSnackbar(R.string.news_with_wifi); 
           return; 
          } 
          goToDetails(clicked.getID(), clicked.getIsExternal()); 
         } 
        } 
       }); 

       return newsItemHolder; 
      } 

      @Override 
      public void populateViewHolder(
        final NewsItemHolder view, 
        ModelNews data, 
        final int position) { 

       // Set news title 
       view.titleView.setText(data.getTitle()); 

       // hide OR show wifi icon 
       view.needWifiIcon(data.getIsExternal()); 

       // Set news image 
       mImageLoader.loadImage(data.getThumbUrl(), view.thumbView, true); 

       // Set news description 
       view.descView.setText(data.getContent()); 
      } 

      @Override 
      public void onDataChanged() { 
       if (newsProgessBar.getVisibility() != View.GONE) { 
        newsProgessBar.setVisibility(GONE); 
       } 
      } 
     };