2017-10-12 44 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); 
       } 
      } 
     };