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.
Bitte geben Sie Fragment und Adapter-Klasse Code, so dass diese Frage spezifischer –
@AbhishekSingh bitte siehe bearbeitet Post sein wird. Vielen Dank – BilalMH