1

Ich habe ein wirklich seltsames Problem. Ich habe meine MainActivity mit einer TabFragment mit 4 Tabs. 3 dieser Registerkarten haben den gleichen Stil mit einer Liste von Threads. Die drei Registerkarten sind Active, Watching und I'm On. Das Problem, das ich habe, ist, dass, wenn ich auf ein Element in Watching klicke, es den Thread von der gleichen Position in Active lädt. Ich habe den onClick in meinem Adapter implementiert, weil es nur ein bestimmter Teil des RecyclerView ist, den ich anklicken möchte, um zu dieser Seite zu gelangen, und ein anderer Teil, um das Kontextmenü zu öffnen.Falscher Artikel wird geladen in RecyclerView in TabFragment

Ich weiß nicht, wie ich dieses Problem lösen soll und ich bin mir nicht einmal sicher, ob der Titel mit dem Thread übereinstimmt, da ich nicht weiß, wonach ich eigentlich suchen möchte.

Hier ist mein Code, um den Adapter in einem der drei Fragmente zur Einstellung

mAdapter = new WatchedThreadAdapter(getContext(), mData); 
mRecyclerView.setAdapter(mAdapter); 

und hier ist der onClick innerhalb des Adapters

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

Meine WatchingFragment wie folgt aussieht:

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(); 
     } 
    } 

} 

und die WatchingAdapter sieht so aus

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()); 

    } 


} 

Wenn Sie weitere Informationen benötigen, zögern Sie bitte nicht zu sagen. Vielen Dank für Ihre Zeit und Geduld.

+0

Bitte geben Sie Fragment und Adapter-Klasse Code, so dass diese Frage spezifischer –

+0

@AbhishekSingh bitte siehe bearbeitet Post sein wird. Vielen Dank – BilalMH

Antwort

0

Ich habe es herausgefunden, in meiner ActivePostPager.createInstance() Methode habe ich eine Überprüfung festgeschrieben, um zu sehen, wo die Seite ist. Es ist jetzt gelöst !!

Verwandte Themen