정말 이상한 문제가 있습니다. 내 MainActivity
에 TabFragment
과 4 개의 탭이 있습니다. 이러한 탭 중 3 개는 스레드 목록과 동일한 스타일을가집니다. 세 개의 탭은 Active
, Watching
및 I'm On
입니다. 문제는 내가 Watching
에있는 항목을 클릭하면 Active
의 같은 위치에서 스레드를로드한다는 것입니다. 내 어댑터에 onClick을 구현 한 것은 RecyclerView의 특정 부분 일 뿐이므로 클릭하여이 페이지로 연결하고 다른 부분은 컨텍스트 메뉴를 열어주기를 원하기 때문입니다.잘못된 항목이로드 중입니다. TabFragment의 RecyclerView를 클릭하십시오.
이 문제를 해결하는 방법을 모르겠지만 실제로 검색하려고하는 내용을 모르는 상태에서 제목이 스레드와 일치하는지 확실하지 않습니다.
다음은 세 조각
mAdapter = new WatchedThreadAdapter(getContext(), mData);
mRecyclerView.setAdapter(mAdapter);
을의에 어댑터를 설정하기위한 내 코드의 여기
mContext.startActivity(ActivePostPagerActivity.createIntent(mContext, position));
내 WatchingFragment
은 다음과 같습니다 어댑터 내부의 onClick
입니다 :
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());
}
}
당신이 말을 hesitiate하지 마십시오 필요한 다른 정보가 있다면. 시간과 인내심에 진심으로 감사드립니다.
조각과 어댑터 클래스 코드를 넣어주세요.이 질문은 좀 더 구체적이 될 것입니다. –
@AbhishekSingh이 (가) 편집 된 게시물을 참조하십시오. 고맙습니다 – BilalMH