Android 在TabFragment中单击RecyclerView时加载的项错误

Android 在TabFragment中单击RecyclerView时加载的项错误,android,android-recyclerview,android-adapter,android-tablayout,Android,Android Recyclerview,Android Adapter,Android Tablayout,我有一个很奇怪的问题。我有一个包含4个选项卡的TabFragment的main活动。其中3个选项卡的样式与线程列表相同。这三个选项卡是活动,观看和我在上。我遇到的问题是,当我在监视中单击一个项目时,它会从活动中的相同位置加载线程。我已经在我的适配器中实现了onClick,因为它只是我想要点击的RecyclerView的一部分,我想要点击它来打开这个页面,另一部分打开上下文菜单 我不知道如何解决这个问题,我甚至不确定标题是否与线程匹配,因为我不知道我实际上在搜索什么 下面是我在三个片段中设置适配器

我有一个很奇怪的问题。我有一个包含4个选项卡的
TabFragment
main活动。其中3个选项卡的样式与线程列表相同。这三个选项卡是
活动
观看
我在
上。我遇到的问题是,当我在
监视
中单击一个项目时,它会从
活动
中的相同位置加载线程。我已经在我的适配器中实现了onClick,因为它只是我想要点击的RecyclerView的一部分,我想要点击它来打开这个页面,另一部分打开上下文菜单

我不知道如何解决这个问题,我甚至不确定标题是否与线程匹配,因为我不知道我实际上在搜索什么

下面是我在三个片段中设置适配器的代码

mAdapter = new WatchedThreadAdapter(getContext(), mData);
mRecyclerView.setAdapter(mAdapter);
这是适配器内部的
onClick

mContext.startActivity(ActivePostPagerActivity.createIntent(mContext, position));
我的
WatchingFragment
如下所示:

    public class WatchingFragment extends Fragment {

    private View mRootView;
    private RecyclerView mRecyclerView;
    private GridLayoutManager mLayoutManager;
    private ThreadResponse mData;
    private WatchedThreadsRequestData mRequestData;
    private RecyclerView.Adapter mAdapter;
    private TextView mNoThreadTextView;
    private int mDataSize;

    private MyReceiver r;


    public WatchingFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mRootView = inflater.inflate(R.layout.fragment_watching, container, false);

        if (savedInstanceState == null) {
            initUI();
        }

        return mRootView;
    }

    private void initUI() {
        mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.watchedThreadRecyclerView);
        mNoThreadTextView = (TextView) mRootView.findViewById(R.id.noWatchedThreads);
        mLayoutManager = new GridLayoutManager(getActivity(), 1);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRequestData = new WatchedThreadsRequestData(getActivity());
        registerForContextMenu(mRecyclerView);

/*        mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener
                (getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        showItemSelectedAtPosition(position);

                    }
                }));*/

        loadData();

    }

    private void loadData() {
        mRequestData.getWatchedData(new WatchedThreadsRequestData.WatchedThreadsFeedback() {
            @Override
            public void onWatchedRequestReceived(ThreadResponse response) {
                mData = response;
                populateUIWithData();
                mDataSize = mData.getItems().size();
            }

            @Override
            public void onWatchedRequestFailed(Exception exception) {

            }
        });
    }

    private void populateUIWithData() {

        if (mData.getItems().size() == 0) {
            mNoThreadTextView.setVisibility(View.VISIBLE);
            mRecyclerView.setVisibility(View.GONE);
        } else {
            mAdapter = new WatchedThreadAdapter(getContext(), mData);
            mRecyclerView.setAdapter(mAdapter);
            mAdapter.notifyDataSetChanged();
            mRecyclerView.setVisibility(View.VISIBLE);
            mNoThreadTextView.setVisibility(View.GONE);
        }

        if (mData.getItems() != null && mData.getItems().size() > mDataSize) {
            mAdapter.notifyDataSetChanged();
            mDataSize = mData.getItems().size();
        }

    }

/*    private void showItemSelectedAtPosition(int position) {
        Threads selectedThread = mData.getItem(position);

        Intent intent = new Intent(getActivity(), ActivePostPagerActivity.class);
        intent.putExtra("Threads", Parcels.wrap(selectedThread.getThreadItem()));
        intent.putExtra("ActiveTitle", "Watching");

        startActivity(intent);

    }*/

    public void refresh() {

        Log.i("Refresh", "YES");

        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.detach(this).attach(this).commit();

    }

    @Override
    public void onPause() {
        super.onPause();
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(r);
    }

    @Override
    public void onResume() {
        super.onResume();

        r = new MyReceiver();
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(r,
                new IntentFilter("TAG_REFRESH"));

    }



    public class MyReceiver extends BroadcastReceiver {


        @Override
        public void onReceive(Context context, Intent intent) {
            WatchingFragment.this.refresh();
        }
    }

}
WatchingAdapter
如下所示

    public class WatchedThreadAdapter extends RecyclerView.Adapter<WatchedThreadAdapter.ViewHolder> {

    private Context mContext;
    private ThreadResponse mThread;
    private String mShareURL, mThreadID;
    private WatchedThreadsRequestData watchedThreadsRequestData;
    private HiddenThreadsRequest hiddenThreadsRequest;
    public static final int GALLERY_VIEW = 800;
    private boolean isWatched = false;
    private PopupMenu popupMenu;
    private MenuItem watchedMenuItem;

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener, PopupMenu.OnMenuItemClickListener {

        private TextView mThreadText, mTopicText, mNumPosts;
        private View mStickyView;
        private ImageButton mMoreOptionsButton;
        private LinearLayout mThreadTitleContainer;

        public ViewHolder(View v) {
            super(v);
            mThreadText = (TextView) v.findViewById(R.id.threadText);
            mTopicText = (TextView) v.findViewById(R.id.topicText);
            mNumPosts = (TextView) v.findViewById(R.id.numPosts);
            mStickyView = v.findViewById(R.id.sticky);
            mMoreOptionsButton = (ImageButton) v.findViewById(R.id.moreOptions);
            mThreadTitleContainer = (LinearLayout) v.findViewById(R.id.threadTitleContainer);
            mMoreOptionsButton.setOnClickListener(this);

            final View optionsButtonParent = (View) mMoreOptionsButton.getParent();
            optionsButtonParent.post(new Runnable() {
                @Override
                public void run() {
                    Rect rect = new Rect();
                    mMoreOptionsButton.getHitRect(rect);
                    rect.top -= 10;    // increase top hit area
                    rect.left -= 10;   // increase left hit area
                    rect.bottom += 10; // increase bottom hit area
                    rect.right += 10;  // increase right hit area
                    optionsButtonParent.setTouchDelegate(new TouchDelegate(rect, mMoreOptionsButton));
                }
            });

            final View numPostsParent = (View) mNumPosts.getParent();
            optionsButtonParent.post(new Runnable() {
                @Override
                public void run() {
                    Rect rect = new Rect();
                    mNumPosts.getHitRect(rect);
                    rect.top -= 20;    // increase top hit area
                    rect.left -= 20;   // increase left hit area
                    rect.bottom += 20; // increase bottom hit area
                    rect.right += 20;  // increase right hit area
                    numPostsParent.setTouchDelegate(new TouchDelegate(rect, mNumPosts));
                }
            });

        }


        @Override
        public void onClick(View v) {
            if (v == mMoreOptionsButton) {
                popupMenu = new PopupMenu(v.getContext(), v);
                popupMenu.inflate(R.menu.thread_options);
                popupMenu.getMenu();
                popupMenu.setOnMenuItemClickListener(this);
                setForceShowIcon(popupMenu);
                popupMenu.show();

                if (PreferenceConnector.readString(mContext, "share") != null) {
                    mShareURL = PreferenceConnector.readString(mContext, "share");
                }

                if (PreferenceConnector.readString(mContext, "threadID") != null) {
                    mThreadID = PreferenceConnector.readString(mContext, "threadID");
                }

                watchedMenuItem = popupMenu.getMenu().findItem(R.id.watch);

                if (mThread.getItem(getPosition()) != null && mThread.getItem(getPosition()).getThreadItem() != null) {
                    if (mThread.getItem(getAdapterPosition()).getThreadItem().getWatched() == 1) {
                        watchedMenuItem.setTitle("Unwatch");
                    } else {
                        watchedMenuItem.setTitle("Watch");
                    }
                }

            }

        }

        @Override
        public boolean onLongClick(View v) {
            return false;
        }

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            switch (item.getItemId()) {

                case R.id.watch:
                    if (PreferenceConnector.readString(mContext, "authToken") == null) {
                        final AlertDialog.Builder loginDialog = new AlertDialog.Builder(mContext);
                        loginDialog.setTitle("You're not logged in")
                                .setMessage("You need to be logged in to be able to watch a thread")
                                .setPositiveButton("Login", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent loginIntent = new Intent(mContext, LoginActivity.class);
                                        mContext.startActivity(loginIntent);
                                        dialog.dismiss();
                                    }
                                })
                                .setNegativeButton("Close", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                    }
                                });

                        AlertDialog dialog = loginDialog.create();

                        dialog.show();
                    } else if (mThread.getItem(getAdapterPosition()) != null && mThread.getItem(getAdapterPosition()).getThreadItem() != null
                            && mThread.getItem(getAdapterPosition()).getThreadItem().getWatched() == 0) {
                        watchedThreadsRequestData = new WatchedThreadsRequestData(mContext);
                        watchedThreadsRequestData.setWatchedThread(mThreadID, new WatchedThreadsRequestData.WatchedThreadsFeedback() {
                            @Override
                            public void onWatchedRequestReceived(ThreadResponse response) {
                                mThread = response;
                                Toast.makeText(mContext, "Thread watched",
                                        Toast.LENGTH_SHORT).show();

                                watchedMenuItem.setTitle("Unwatch");
                            }

                            @Override
                            public void onWatchedRequestFailed(Exception exception) {
                                Toast.makeText(mContext, "Thread wasn't watched: " + exception.toString(), Toast.LENGTH_LONG).show();

                            }
                        });

                        isWatched = true;

                    } else {
                        watchedThreadsRequestData = new WatchedThreadsRequestData(mContext);
                        watchedThreadsRequestData.removeWatchedThread(mThreadID, new WatchedThreadsRequestData.WatchedThreadsFeedback() {
                            @Override
                            public void onWatchedRequestReceived(ThreadResponse response) {
                                mThread = response;
                                Toast.makeText(mContext, "Thread unwatched", Toast.LENGTH_SHORT).show();

                                watchedMenuItem.setTitle("Watch");

                            }

                            @Override
                            public void onWatchedRequestFailed(Exception exception) {

                            }
                        });

                        isWatched = false;


                    }
                    return true;
                case R.id.shareThread:
                    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    sharingIntent.putExtra(Intent.EXTRA_TEXT, mShareURL);
                    sharingIntent.setType("text/plain");
                    mContext.startActivity(Intent.createChooser(sharingIntent, "Share via"));
                    return true;
                case R.id.hideThread:
                    if (PreferenceConnector.readString(mContext, "authToken") == null) {
                        final AlertDialog.Builder loginDialog = new AlertDialog.Builder(mContext);
                        loginDialog.setTitle("You're not logged in")
                                .setMessage("You need to be logged in to be able to hide a thread")
                                .setPositiveButton("Login", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent loginIntent = new Intent(mContext, LoginActivity.class);
                                        mContext.startActivity(loginIntent);
                                        dialog.dismiss();
                                    }
                                })
                                .setNegativeButton("Close", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                    }
                                });

                        AlertDialog dialog = loginDialog.create();

                        dialog.show();
                    } else {

                        if (mThread.getItem(getAdapterPosition()).getThreadItem().isSticky()) {

                            Toast.makeText(mContext, "You can't hide a this thread.",
                                    Toast.LENGTH_SHORT).show();


                        } else {

                            hiddenThreadsRequest = new HiddenThreadsRequest(mContext);
                            hiddenThreadsRequest.setHiddenThread(mThreadID, new HiddenThreadsRequest.HiddenThreadsFeedback() {
                                @Override
                                public void onHiddenRequestReceived(ThreadResponse response) {

                                    Toast.makeText(mContext, "Thread hidden",
                                            Toast.LENGTH_SHORT).show();

                                    removeAt(getPosition());

                                }

                                @Override
                                public void onHiddenRequestFailed(Exception exception) {

                                    Toast.makeText(mContext,
                                            "Oops! Something went wrong there, please try again",
                                            Toast.LENGTH_SHORT).show();

                                }
                            });
                        }
                    }
                    return true;
                default:
                    Toast.makeText(mContext, "Somethings Wrong",
                            Toast.LENGTH_SHORT).show();
                    return true;
            }
        }

    }

    public WatchedThreadAdapter(Context context, ThreadResponse response) {
        mContext = context;
        mThread = response;

        if (mThread == null) {
            mThread = new ThreadResponse();
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;

        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_thread, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final Threads threadItem = mThread.getItem(position);

        if (threadItem.getThreadItem() != null) {

            if (threadItem.getThreadItem().getName() != null)
                holder.mThreadText.setText(threadItem.getThreadItem().getName());

            holder.mThreadTitleContainer.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showItemSelectedAtPosition(holder.getAdapterPosition());
                }
            });

            holder.mThreadText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showItemSelectedAtPosition(holder.getAdapterPosition());
                }
            });

            holder.mNumPosts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showItemSelectedAtPosition(holder.getAdapterPosition());
                }
            });

            if (threadItem.getThreadItem().getTopic_name() != null) {
                holder.mTopicText.setText(threadItem.getThreadItem().getTopic_name());
                holder.mTopicText.setAlpha(0.7f);
            }

            if (threadItem.getThreadItem().getNum_posts() != null) {
                int numPosts = Integer.parseInt(threadItem.getThreadItem().getNum_posts());
                if (numPosts > 1000) {
                    holder.mNumPosts.setText("1K");
                } else {
                    holder.mNumPosts.setText(threadItem.getThreadItem().getNum_posts());
                }

            }

            if (threadItem.getThreadItem().isSticky()) {
                holder.mStickyView.setVisibility(View.VISIBLE);
            } else {
                holder.mStickyView.setVisibility(View.GONE);
            }

            if (threadItem.getThreadItem().getThread_url() != null) {
                PreferenceConnector.writeString(mContext, "share", threadItem.getThreadItem().getName()
                        + " - " + Constants.DEV_URL + "talk/" +
                        threadItem.getThreadItem().getTopic_url() + '/' +
                        threadItem.getThreadItem().getThread_url());
            }

            if (threadItem.getThreadItem().getId() != null) {
                PreferenceConnector.writeString(mContext, "threadID", threadItem.getThreadItem().getId());
            }

        }

    }

    @Override
    public int getItemCount() {
        return mThread.getItems().size();
    }

    public static void setForceShowIcon(PopupMenu popupMenu) {
        try {
            Field[] fields = popupMenu.getClass().getDeclaredFields();
            for (Field field : fields) {
                if ("mPopup".equals(field.getName())) {
                    field.setAccessible(true);
                    Object menuPopupHelper = field.get(popupMenu);
                    Class<?> classPopupHelper = Class.forName(menuPopupHelper
                            .getClass().getName());
                    Method setForceIcons = classPopupHelper.getMethod(
                            "setForceShowIcon", boolean.class);
                    setForceIcons.invoke(menuPopupHelper, true);
                    break;
                }
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    private void showItemSelectedAtPosition(int position) {

        PreferenceConnector.writeBoolean(mContext, "fromNewThread", false);

        mContext.startActivity(ActivePostPagerActivity.createIntent(mContext, position));

//        mContext.startActivityForResult(ActivePostPagerActivity.createIntent(mContext, position), GALLERY_VIEW);


    }

    public void removeAt(int position) {

        mThread.getItems().remove(position);
        notifyItemRemoved(position);
        notifyItemChanged(position, mThread.getItems().size());

    }


}
公共类WatchedThreadAdapter扩展了RecyclerView.Adapter{ 私有上下文; 私有线程响应mThread; 私有字符串mShareURL,mThreadID; 私有WatchedThreadsRequestData WatchedThreadsRequestData; 私有HiddentThreadsRequest HiddentThreadsRequest; 公共静态最终int画廊_视图=800; 私有布尔值isWatched=false; 私有弹出菜单弹出菜单; 私有菜单项监视菜单项; 公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener、View.OnLongClickListener、PopupMenu.OnMenuItemClickListener{ 私有文本查看多线程文本、多线程文本、多线程; 私人视图mStickyView; 私有图像按钮MMoreOptions按钮; 专用线路布局MThread Title容器; 公共视图持有者(视图v){ 超级(五); mThreadText=(TextView)v.findviewbyd(R.id.threadText); mTopicText=(TextView)v.findViewById(R.id.topicText); mNumPosts=(TextView)v.findViewById(R.id.numPosts); mStickyView=v.findViewById(R.id.sticky); mMoreOptionsButton=(ImageButton)v.findViewById(R.id.moreOptions); mThreadTitleContainer=(LinearLayout)v.findViewById(R.id.threadTitleContainer); mMoreOptionsButton.setOnClickListener(此); 最终视图选项ButtonParent=(视图)MMoreOptions Button.getParent(); options按钮parent.post(新的Runnable(){ @凌驾 公开募捐{ Rect Rect=新的Rect(); mMoreOptionsButton.getHitRect(rect); rect.top-=10;//增加顶部命中区域 rect.left-=10;//增加左侧命中区域 rect.bottom+=10;//增加底部命中区域 rect.right+=10;//增加右击区域 optionsButtonParent.setTouchDelegate(新的TouchDelegate(rect,mmoreoptionButton)); } }); 最终视图numPostsParent=(视图)mNumPosts.getParent(); options按钮parent.post(新的Runnable(){ @凌驾 公开募捐{ Rect Rect=新的Rect(); mNumPosts.getHitRect(rect); rect.top-=20;//增加顶部命中区域 rect.left-=20;//增加左侧命中区域 rect.bottom+=20;//增加底部命中区域 rect.right+=20;//增加右击面积 setTouchDelegate(新的TouchDelegate(rect,mNumPosts)); } }); } @凌驾 公共void onClick(视图v){ 如果(v==MMoreOptions按钮){ popupMenu=新的popupMenu(v.getContext(),v); 弹出菜单。充气(右菜单。螺纹选项); popupMenu.getMenu(); setOnMenuItemClickListener(这个); setForceShowIcon(弹出菜单); show(); if(PreferenceConnector.readString(mContext,“share”)!=null){ mShareURL=PreferenceConnector.readString(mContext,“共享”); } if(PreferenceConnector.readString(mContext,“threadID”)!=null){ mThreadID=PreferenceConnector.readString(mContext,“threadID”); } watchedMenuItem=popupMenu.getMenu().findItem(R.id.watch); if(mThread.getItem(getPosition())!=null&&mThread.getItem(getPosition()).getThreadItem()!=null){ if(mThread.getItem(getAdapterPosition()).getThreadItem().getWatched()==1){ watchedMenuItem.setTitle(“Unwatch”); }否则{ watchedMenuItem.setTitle(“Watch”); } } } } @凌驾 仅长按公共布尔值(视图v){ 返回false; } @凌驾 公共布尔onMenuItemClick(菜单项){ 开关(item.getItemId()){ 案件R.id.watch: if(PreferenceConnector.readString(mContext,“authToken”)==null){ final AlertDialog.Builder loginDialog=新建AlertDialog.Builder(mContext); loginDialog.setTitle(“您未登录”) .setMessage(“您需要登录才能查看线程”) .setPositiveButton(“登录”,新建DialogInterface.OnClickListener(){ @凌驾 public void onClick(DialogInterface dialog,int which){ 意向登录=新意向(mCont)