Wdrażam szufladę nawigacji z RecyclerView, korzystając z samouczka this, ale nie chcę stosować całego samouczka, po prostu chcę obsłużyć kliknięcie użytkownika. Mam wdrożyła onClickListener
wewnątrz ViewHolder
mojego MyAdapter
Klasa:RecyclerView onItemClicked callback
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
int Holderid; ImageView imageView, profile;
TextView textView, Name, email, drawerTitle;
private ClickListener listener;
// ViewHolder Constructor with View and viewType as a parameter
public ViewHolder(View itemView, int ViewType, ClickListener listener) {
super(itemView);
if (ViewType == TYPE_HEADER){
itemView.setClickable(false);
Name = (TextView) itemView.findViewById(R.id.user_name);
email = (TextView) itemView.findViewById(R.id.user_email);
profile = (ImageView) itemView.findViewById(R.id.circleView);
Holderid = 0;
}
if(ViewType == TYPE_ITEM) {
itemView.setClickable(true);
textView = (TextView) itemView.findViewById(R.id.rowText);
imageView = (ImageView) itemView.findViewById(R.id.rowIcon);
Holderid = 1;
// Handle item click and set the selection
}
if(ViewType == TYPE_SEPARATOR){
itemView.setClickable(false);
drawerTitle = (TextView) itemView.findViewById(R.id.drawerTitle);
Holderid = 2;
}
this.listener = listener;
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
int pos;
@Override
public void onClick(View v) {
if (listener != null) {
listener.onItemClicked(getPosition());
pos= getPosition();
Log.d("TAG", "Item clicked at position " + getPosition());
}
}
@Override
public boolean onLongClick(View v) {
if (listener != null) {
return listener.onItemLongClicked(getPosition());
}
return false;
}
public interface ClickListener {
public void onItemClicked(int position);
public boolean onItemLongClicked(int position);
}
}
Co nie mogę zrozumieć, jak zastosować ClickListener
do obiektu MyAdapter
:
mAdapter = new MyAdapter(dataList, mSelectedPositions, ...?);
tak, że gdy użytkownik klika jeden przedmiot, mogę obsłużyć kliknięcie użytkownika na MainActivity
.
Utworzyłem Adapter ten sposób (jak opisano w poradniku):
Cały MyAdapter
Klasa: http://pastie.org/private/cibcsj3zieorlkcgh2rm1g
i to jest moja klasa główną działalność onCreate
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* Assigning the toolbar object ot the view
and setting the the Action bar to our toolbar */
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
// enable ActionBar app icon to behave as action to toggle nav drawer
getSupportActionBar().setDisplayHomeAsUpEnabled(true); //pulsante drawer
getSupportActionBar().setHomeButtonEnabled(true); //pulsante dietro
//Initializing
mTitle = mDrawerTitle = getTitle();
SharedPreferences usrData = getSharedPreferences(
usr_loggedin,
MODE_PRIVATE);
AVATARresID = R.mipmap.aka;
// Add Drawer Item to dataList
dataList = new ArrayList<>();
dataList = prepareDatalist(dataList, NAME, EMAIL, AVATARresID);
mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
mRecyclerView.setHasFixedSize(true);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mAdapter = new MyAdapter(dataList, mSelectedPositions); //**ERROR HERE**
mRecyclerView.setAdapter(mAdapter);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// Drawer Listener set to the Drawer toggle
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState(); // Finally we set the drawer toggle sync State
}
Jak czy wyciągam wynik onClick
, który jest obecny w klasie MyAdapter
z powrotem do mojego ,
int pos;
@Override
public void onClick(View v) {
if (listener != null) {
listener.onItemClicked(getPosition());
pos= getPosition();
Log.d("TAG", "Item clicked at position " + getPosition());
}
}
dzięki czemu mogę obsługiwać działania w zależności od pozycji klikniętego przedmiotu?
ja przedłużony 'realizuje View.OnClickListener' i ' mAdapter = new MyAdapter (DataList, mSelectedPositions, this); 'zrobiłeś tak, jak powiedziałeś, ale słowo kluczowe' this' nie staje się 'ClickListener' ... co masz na myśli? –
musisz zaimplementować 'ViewHolder.OnClickListener' – Blackbelt
W ten sposób zaimplementowałem' implementuje RecyclerView.ViewHolder.ClickListener' ale mówi 'nie można rozwiązać symbolu ClickListener' ... –