0

我的工作RecyclerView,並嘗試使用上點擊監聽recyclcerview的每個項目使用接口RecyclerVIew onItemClickListener不工作

這裏是我的Activity類:

public class LegacyHomeActivity extends ActivityBaseDrawer { 
    private List<LegacyVideo> legacyVideoList = null; 
    private List<Video> videoList = new ArrayList<>(); 
    private RecyclerView mRecyclerView; 
    private LegacyModeHomeAdapter adapter; 

    @Override 
    public void onNetworkStateChanged(boolean connected) { 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     isLegacyMode = true; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_legacy_home); 
     if (getSupportActionBar() != null) { 
      setTitle(getString(R.string.footy_legacy_home)); 
     } 
     ImageView legacy_live_score_imageView = (ImageView) findViewById(R.id.legacy_live_score_imageView); 
     legacy_live_score_imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startActivity(new Intent(LegacyHomeActivity.this, LegacyLiveScoreActivity.class)); 
      } 
     }); 
     ImageView legacy_highlight_imageView = (ImageView) findViewById(R.id.legacy_highlight_imageView); 
     legacy_highlight_imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startActivity(new Intent(LegacyHomeActivity.this, LegacyHighlightsActivity.class)); 
      } 
     }); 
     ImageView legacy_news_imageView = (ImageView) findViewById(R.id.legacy_news_imageView); 
     legacy_news_imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startActivity(new Intent(LegacyHomeActivity.this, LegacyNewsActivity.class)); 
      } 
     }); 
     mRecyclerView = (RecyclerView) findViewById(R.id.legacy_mood_recyclerview); 
     final LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false); 
     mRecyclerView.setLayoutManager(layoutManager); 
     adapter = new LegacyModeHomeAdapter(getApplicationContext(), itemClickListener); 
     mRecyclerView.setAdapter(adapter); 
     mRecyclerView.setHasFixedSize(true); 
     swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); 
     swipeRefreshLayout.setColorSchemeResources(R.color.ThemeColor, 
       R.color.ThemeColor, R.color.ThemeColor); 
     swipeRefreshLayout 
       .setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 

        @Override 
        public void onRefresh() { 
         getLegacyVideoList(); 
        } 
       }); 

     circularProgressView = (CircularProgressView) findViewById(R.id.circularProgressView); 
     showLoadingProgress(); 
     getLegacyVideoList(); 
    } 

    LegacyVideoClickListener itemClickListener = new LegacyVideoClickListener() { 
     @Override 
     public void onItemClickListener(int position) { 
      Video video = videoList.get(position); 
      VideoPlayerUtil.initVideoPLayer(video, LegacyHomeActivity.this); 
     } 
    }; 

    private void getLegacyVideoList() { 
     FootyLightAPI api = new FootyLightAPI(getApplicationContext(), mResponseListener); 
     api.getLegacyHomeVideoList(); 
    } 

    private final FootyLightAPI.ResponseListener mResponseListener = new FootyLightAPI.ResponseListener() { 
     @Override 
     public void getResponse(int apiId, final String response) { 
      switch (apiId) { 
       case R.integer.ApiLegacyVideoList: 
        Log.e("Legacy ............", "Response:................" + response); 
        try { 
         final ObjectMapper mapper = new ObjectMapper(); 
         legacyVideoList = mapper.readValue(response, new TypeReference<List<LegacyVideo>>() { 
         }); 
         if (legacyVideoList != null && legacyVideoList.size() > 0) { 
          videoList.clear(); 
          for (LegacyVideo video : legacyVideoList) { 
           Log.e("Legacy video", "" + video.getTitle()); 
           Video videoItem = new Video(); 
           if (video.getItemType().equalsIgnoreCase("video")) { 
            videoItem.setTitle(video.getTitle()); 
            videoItem.setLink(video.getLink()); 
            videoItem.setThumb(video.getThumb()); 
            videoItem.setContentType(video.getContentType()); 
            videoItem.setContentUrl(video.getContentUrl()); 
            videoItem.setDmcaLabel(video.getDmcaLabel()); 
            videoItem.setDmcaContent(video.getDmcaContent()); 
            videoItem.setDmcaDisclaimer(video.getDmcaDisclaimer()); 
            videoItem.setDisplayType(video.getDisplayType()); 
            videoList.add(videoItem); 
           } 

          } 
         } 
         Log.e("VideoList", "........." + videoList.size()); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           showVideoAdapter(); 
           hideLoadingProgress(); 

          } 
         }); 


        } catch (Exception e) { 

        } 
        break; 
       default: 
        break; 
      } 
     } 

     @Override 
     public void getError(int apiId, int errorCode) { 
     } 

     @Override 
     public void getResponse(String trackingStr, int apiId, String response) { 

     } 

     @Override 
     public void getError(String trackingStr, int apiId, int errorCode) { 

     } 
    }; 

    public void showVideoAdapter() { 
     if (adapter != null) { 
      adapter.setVideos(videoList); 
     } 
    } 
} 

這裏是我的適配器類

public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> { 
    private List<Video> videoList; 
    private Context mContext; 
    private LegacyVideoClickListener onVideosRVItemClickListener; 

    private LayoutInflater getLayoutInflater() { 
     return LayoutInflater.from(mContext); 
    } 

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) { 
     this.mContext = mContext; 
     this.onVideosRVItemClickListener = onVideosRVItemClickListener; 
    } 

    public void setVideos(List<Video> videosList) { 
     this.videoList = videosList; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false); 
     return new ItemViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ItemViewHolder holder, final int position) { 
     Video video = videoList.get(position); 
     Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage); 
     holder.categoryName.setText(video.getTitle()); 
     holder.title_image_btn.setText(video.getDisplayType()); 
     holder.VideosItemClickListener(position, onVideosRVItemClickListener); 
    } 

    @Override 
    public int getItemCount() { 
     if (videoList != null) { 
      return videoList.size(); 
     } 
     return 0; 
    } 

    public class ItemViewHolder extends RecyclerView.ViewHolder { 
     private TextView categoryName; 
     private ImageView categoryImage; 
     private Button title_image_btn; 

     public ItemViewHolder(View itemView) { 
      super(itemView); 
      categoryName = (TextView) itemView.findViewById(R.id.categoryName); 
      categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage); 
      title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn); 
     } 

     public void VideosItemClickListener(final int position, final LegacyVideoClickListener videosRVItemClickListener) { 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        videosRVItemClickListener.onItemClickListener(position); 
       } 
      }); 
     } 

    } 
} 

最後我使用這個接口監聽器:

public interface LegacyVideoClickListener { 
    public void onItemClickListener(int position); 
} 

此過程做工精細所有我的應用程序的其他部分,但不工作的這種情況。我不知道問題在哪裏。請幫幫我 。

回答

0

你這種方法:

@Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     final String element = mDataset[position]; 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //your code 
      } 
     }); 
    } 
+0

這不是一個好方法。因爲onBindViewHolder將在回滾器視圖滾動時被調用。所以每當列表滾動時,即使有一點點,它都會爲當前可見的所有項目設置onClickListener,這是無效的。 – CodeCameo

+0

不,它沒有被調用。方法綁定被稱爲永遠recyclerView滾動 –

+0

是啊...這就是我剛纔所說的。當你再次滾動一下時,它會再次爲同一個itemView調用'setOnClickListener',不是嗎? – CodeCameo

-1
@Override 
public void onBindViewHolder(RecyclerViewAdapter.ItemViewHolder holder, int position) { 
     holder.name.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 

} 

嘗試這樣

+0

我覺得我使用的接口與你所提到的一樣。我的代碼中是否有任何問題?@Akshay –

+0

對不起,但我很難遵循你的代碼,我不是很先進的android,但你能告訴我你到底在做什麼@Md Aslam Hossin,但如果你想點擊一個項目上述recyclerView是你可以做的方式,如果你能詳細說明你想要什麼,我可以幫助 –

0

檢查該樣本

的onclick可以在適配器

private Listener mListener; 

使用自定義接口

interface Listener { 
    void performOperation(int Position); 
} 

被achived在適配器初始化喲UR在構造聽者這樣

mListener = (Listener) context; 

在你bindViewHolder方法現在

holder.yourView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      mListener.performOperation(position); 
     } 
    }); 

在活動實施這樣

public class LegacyHomeActivity extends ActivityBaseDrawer implements listner { 

@Override 
public void performOperation(int Position) { 
    //Do whatever you want to do with this position 
} 

} 
0

通onVideosRVItemClickListener該接口在ItemViewHolder構造。

@Override 
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false); 
     return new ItemViewHolder(view, onVideosRVItemClickListener); 
    } 

    @Override 
    public void onBindViewHolder(ItemViewHolder holder, final int position) { 
     Video video = videoList.get(position); 
     Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage); 
     holder.categoryName.setText(video.getTitle()); 
     holder.title_image_btn.setText(video.getDisplayType()); 

    } 

    public class ItemViewHolder extends RecyclerView.ViewHolder { 
     private TextView categoryName; 
     private ImageView categoryImage; 
     private Button title_image_btn; 

     public ItemViewHolder(View itemView, final LegacyVideoClickListener videosRVItemClickListener) { 
      super(itemView); 
      categoryName = (TextView) itemView.findViewById(R.id.categoryName); 
      categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage); 
      title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        videosRVItemClickListener.onItemClickListener(getAdapterPosition()); 
       } 
      }); 
     } 

    } 
0

你的接口適配器類應該是這樣的

public class LegacyModeHomeAdapter extends RecyclerView.Adapter<LegacyModeHomeAdapter.ItemViewHolder> { 
    private List<Video> videoList; 
    private Context mContext; 
    public static LegacyVideoClickListener onVideosRVItemClickListener; 

    private LayoutInflater getLayoutInflater() { 
     return LayoutInflater.from(mContext); 
    } 

    public LegacyModeHomeAdapter(Context mContext, LegacyVideoClickListener onVideosRVItemClickListener) { 
     this.mContext = mContext; 
     this.onVideosRVItemClickListener = onVideosRVItemClickListener; 
    } 

    public void setVideos(List<Video> videosList) { 
     this.videoList = videosList; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = getLayoutInflater().inflate(R.layout.layout_legacy_mode_home_video_item, parent, false); 
     return new ItemViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ItemViewHolder holder, final int position) { 
     Video video = videoList.get(position); 
    Picasso.with(mContext).load(video.getThumb()).into(holder.categoryImage); 
     holder.categoryName.setText(video.getTitle()); 
     holder.title_image_btn.setText(video.getDisplayType()); 
     holder.VideosItemClickListener(position, onVideosRVItemClickListener); 
    } 

    @Override 
    public int getItemCount() { 
     if (videoList != null) { 
      return videoList.size(); 
     } 
     return 0; 
    } 

    public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private TextView categoryName; 
     private ImageView categoryImage; 
     private Button title_image_btn; 

     public ItemViewHolder(View itemView) { 
      super(itemView); 
      categoryName = (TextView) itemView.findViewById(R.id.categoryName); 
      categoryImage = (ImageView) itemView.findViewById(R.id.categoryImage); 
      title_image_btn = (Button) itemView.findViewById(R.id.title_image_btn); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      onVideosRVItemClickListener.onItemClickListener(getPosition(), v); 
     } 
    } 
    public void setOnItemClickListener(LegacyVideoClickListener clickListener) { 
      LegacyModeHomeAdapter.onVideosRVItemClickListener = clickListener; 
    } 
    public interface LegacyVideoClickListener { 
     public void onItemClickListener(int position, View v); 
    } 
} 

而且你的適配器使用級應該是這樣的

adapter.setOnItemClickListener(new LegacyModeHomeAdapter.LegacyVideoClickListener() { 
     @Override 
     public void onItemClick(int position, View v) { 
      //Your code 
     } 
    }); 

使用這種交際方式您可以準確地實現onclick監聽器功能。 請讓我知道如果你仍然有麻煩。

0
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     public Button btMyButton; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
       // your implementation. In order to get position you can use `getAdapterPosition()` method    
     } 
    } 
相關問題