[英]Get Position data from Item in RecyclerView
我最近從 ListView 遷移到 RecyclerView ......一切似乎都很好,除了我不知道如何從 RecyclerView 項目中獲取數據......在 ListView Item OnClick 中,我以前使用過getItemAtPosition
但它不在 RecyclerView 中...
這是代碼的相關部分... - MainActivity.java
private SDKP mSelectedPackage;
RecyclerView mRecyclerView;
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//I'm STUCK HERE!
mSelectedPackage = (SDKPackage) mRecyclerView.getItemAtPosition(position);
openContextMenu(view);
/*Toast.makeText(MainActivity.this, "Card at " + position + " is clicked", Toast.LENGTH_SHORT).show();*/
}
}));
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
{
mSelectedPackage.inflateMenu(menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
return mSelectedPackage.onMenuClick(this, item);
}
這是 inflateMenu(ContextMenu menu) 方法 -
public void inflateMenu(ContextMenu menu)
{
menu.setHeaderTitle(getPackageName());
if (isDownloading())
{
menu.add(Menu.NONE, 256, Menu.NONE, "Cancel download");
}
else if (isInstalled())
{
menu.add(Menu.NONE, 257, Menu.NONE, "Uninstall");
}
else
{
int i = 0;
for (SDKA archive : archives)
{
menu.add(Menu.NONE, i++, Menu.NONE, archive.getArchiveName());
}
}
}
public boolean onMenuClick(Activity parent, MenuItem item)
{
if (item.getItemId() >= 256)
uninstall();
else
{
SDKA archive = archives.get(item.getItemId());
if (archive != null)
{
archive.onClick(parent);
}
}
return true;
}
當我使用 ListView 時,我使用了 -
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long arg)
{
mSelectedPackage = (SDKP) mPackageList.getItemAtPosition(position);
openContextMenu(view);
}
});
recyclerview 中沒有getItemAtPosition()
等效項。 為了解決這個問題,您可以在您的適配器上創建一個接口並在您的ViewHolder
上實現該接口,它將偵聽您的onClick()
。
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
然后讓您的ViewHolder
實現接口。
public static class MyViewHolder extends RecyclerView.MyViewHolder implements View.OnClickListener {
private OnItemClickListener mListener;
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
public MyViewHolder(View itemView, OnItemClickListener listener) {
this(itemView);
mListener = listener;
}
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onItemClick(v, getPosition());
}
}
- 或者,您可以使用 rxjava。
你應該設置View.OnClickListener
到itemView
在RecyclerView.ViewHolder
類。
您可以通過多種方式實現這一目標
1 ) 通過實現 RecyclerView.OnItemTouchListener 來點擊監聽器
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } }
現在使用這個自定義類
recyclerView.addOnItemTouchListener( new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // TODO Handle item click } }) );
2)使用適配器中的接口在位置獲取項目
public class NewRecyclerView extends RecyclerView.Adapter<NewRecyclerView.ViewHolder> { private List<MyItem> myItems; private ItemListener myListener; public NewRecyclerView(List<MyItem> items, ItemListener listener) { myItems = items; myListener = listener; } public void setListener(ItemListener listener) { myListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.LAYOUT, parent, false)); // TODO } @Override public int getItemCount() { return myItems.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.setData(myItems.get(position)); } public interface ItemListener { void onItemClick(MyItem item); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { // TODO - Your view members public MyItem item; public ViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); // TODO instantiate/assign view members } public void setData(MyItem item) { this.item = item; // TODO set data to view } @Override public void onClick(View v) { if (myListener != null) { myListener.onItemClick(item); } } }
在您的活動或片段中實現 NewRecyclerView.ItemListener 將在點擊位置提供項目
有了@Bob 的建議,我就這樣做了,沒有太多代碼...... :)
在我的適配器中,我實現了一個自定義方法,如 -
public Object getMyPos(int pos){
return packages.get(pos);
}
然后在 RecyclerItem OnClick 中,我像這樣使用它 -
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
mSelectedPackage = (SDKP) ((ShAdapter)mRecyclerView.getAdapter()).getMyPos(position);
openContextMenu(view);
}
}));
從 RecyclerView 中的 Item 獲取 Position 數據
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
// on item click
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get position
int position = getAdapterPosition();
// check if item still exists
if (position != 0 || position!=RecyclerView.NO_POSITION){
// means if position is not equal to 0 and item exist
// then it should display a toast with the category name
// to the user when the category item or data is clicked
// get position of each item on recyclerView
CategoriesList clickedItem = categoriesLists.get(position);
Toast.makeText(v.getContext(), "You clicked " +clickedItem.getCatName(), Toast.LENGTH_SHORT).show();
/* CategoryList is the model class i created so change it
with your model class
*/
// if you want to send the user to an activity when the item is clicked then
// this is how to go about it
if (position == 1){
v.getContext().startActivity(new Intent(v.getContext(), LoginActivity.class));
}
else{
if (position == 2){
v.getContext().startActivity(new Intent(v.getContext(), SignUpActivity.class));
}
}
}
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.