简体   繁体   English

RecylerView onClick获取项目位置

[英]RecylerView onClick get position of item

I have a RecyclerView that holds a bunch of cards (fetches data from the web, then populates cards) . 我有一个RecyclerView ,它拥有一堆卡片(从网络上获取数据,然后填充卡片) I have the cards forming properly after data is fetched, but now I would now like the set a listener for when each card is clicked. 提取数据后,卡可以正确形成,但是现在我希望为单击每张卡时设置一个侦听器。 Ideally, after each card is clicked , a new intent will be called with further details about that card's data. 理想情况下,在clicked每张卡之后,将调用一个新的intent ,其中包含有关该卡数据的更多详细信息。

Here is where I initialize the adapter. 这是我初始化适配器的地方。 arrList is an ArrayList that has already been filled from another class arrList是一个已经从另一个类填充的ArrayList

private void initializeAdapter() {
    RecycleViewAdapter adapter = new RecycleViewAdapter(arrList);
    rv.setAdapter(adapter);
    }

This is another class that holds the cards: 这是另一类持有卡片的类:

public class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener  {

        CardView cv;
        TextView crimeName,crimeID, crimeAddress, crimeDate, crimeWeapon;
        ImageView crimePhoto;

        PersonViewHolder(View itemView) {
            super(itemView);
            cv = (CardView)itemView.findViewById(R.id.cv);

            crimeName = (TextView) itemView.findViewById(R.id.crime_name);
            crimeID = (TextView) itemView.findViewById(R.id.crime_id);
            crimeAddress = (TextView) itemView.findViewById(R.id.crime_address);
            crimeDate = (TextView) itemView.findViewById(R.id.crime_date);
            crimeWeapon = (TextView) itemView.findViewById(R.id.crime_weapon);
            crimePhoto = (ImageView)itemView.findViewById(R.id.crime_photo);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            // WHAT DO I CALL HERE TO GET THE INDEX OF THE ITEM CLICKED ON ?? //
            Log.d("app", "clicked");

        }
    }

the onClick from above should go to this class (by an intent) and pass the index along with it: 上面的onClick应该转到此类(按意图),并将索引与之一起传递:

    import android.support.v4.app.Fragment;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;


    public class CrimeDetails extends ActionBarActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_crime_details);
            if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.container, new PlaceholderFragment())
                        .commit();
            }
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.crime_details, menu);
            return true;
        }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_crime_details, container, false);
            return rootView;
        }
        }
     }

How can I get the Clicked Position of the Card ? 如何获得卡的点击位置?

Thanks 谢谢

Do net set the onClickListener in your onCreateVH method but in onBindViewHolder 是否在onCreateVH方法中但在onBindViewHolder中设置了onClickListener

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    ((PersonViewHolder)holder).yourRootLayout.setOnClickListener(getPersonClickListener(position));
}

View.OnClickListener getPersonClickListener(final int position) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //TODO whatever you want with position
        }
    };
}

EDIT: tyczj is right. 编辑:tyczj是正确的。 Binding the Clicklistener in the onBindViewHolder is a very easy but maybe not the best Solution - however it will work! 在onBindViewHolder中绑定Clicklistener是一个非常简单但并非最佳的解决方案-它将起作用!

Another way is to use the getAdapterPosition() method from Viewholder itself and bind it in the onCreateViewHolder: 另一种方法是使用Viewholder本身的getAdapterPosition()方法并将其绑定在onCreateViewHolder中:

@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    final View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.yourLayoutXml, parent, false);
    final ViewHolder holder = new PersonViewHolder(view);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final int position = holder.getAdapterPosition();
            //check if position exists
            if (position != RecyclerView.NO_POSITION) {
                //TODO whatever you want
            }
        }
    });
    return holder;
}

您在ViewHolder使用getAdapterPosition()

I am doing this slightly different, using a different onClick call, then I can use the 我通过使用不同的onClick调用来做到这一点,然后可以使用

getAdapterPosition() getAdapterPosition()

method to determine which item was clicked. 确定单击哪个项目的方法。

    public static class MyViewHolder extends RecyclerView.ViewHolder {
    ...

        RelativeLayout myLayout = (RelativeLayout) v.findViewById(R.id.device_adap_layout);
        myLayout.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Context cxt = myLayout.getContext();                        
                        final Intent i = new Intent(cxt, NextActivity.class);
                        i.putExtra("ITEMNAME", mAdapterList.get(getAdapterPosition()));
                        cxt.startActivity(i, options.toBundle());
                    }
                });
    ...
    }

Create adapter class which extend Recycle view and override needed method: 创建扩展了回收视图并覆盖所需方法的适配器类:

public class Adapter extends RecyclerView.Adapter "<"Adapter.AdapterViewHolder">" { 公共类Adapter扩展了RecyclerView.Adapter“ <” Adapter.AdapterViewHolder“>” {

public List<Object> Items;
private Context context;

public Adapter(List<Object> items, Context context) {
    Items = items;
    this.context = context;
}

@Override
public int getItemCount() {
    return comentsItems.size();
}

@Override
public void onBindViewHolder(final AdapterViewHolder hd, int position) {
   int indexOfCard = position;
hd.itemText.setText("pos: "+ position);
}


@Override
public AdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.
            from(viewGroup.getContext()).
            inflate(R.layout.item_layout, viewGroup, false);

    return new AdapterViewHolder(itemView);
}

public static class AdapterViewHolder extends RecyclerView.ViewHolder {
    protected TextView itemText;
    public AdapterViewHolder(View v) {
        super(v);
  itemText = (TextView)v.findViewById(R.id. itemText);   
  }
}

} }

You should set the onClickListener in onBindViewHolder where you already have the position: 你应该设置onClickListeneronBindViewHolder ,你已经拥有的位置:

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener != null) {
                listener.onItemSelected(position);
            }
        }
    });
}

EDIT: Like @tyczj says, for the RecyclerView it's better to use getAdapterPosition in ViewHolder . 编辑:就像@tyczj说的那样,对于RecyclerView ,最好在getAdapterPosition中使用ViewHolder

When you populate the cardView with your data, you can also use the View's setTag() method to store the position. 当用数据填充cardView时,还可以使用View的setTag()方法存储位置。 Since you will get the View when onClick is called, you can simply call getTag() on the View to retrieve the position. 由于调用onClick时将获得View,因此只需在View上调用getTag()即可检索位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM