繁体   English   中英

RecylerView onClick获取项目位置

[英]RecylerView onClick get position of item

我有一个RecyclerView ,它拥有一堆卡片(从网络上获取数据,然后填充卡片) 提取数据后,卡可以正确形成,但是现在我希望为单击每张卡时设置一个侦听器。 理想情况下,在clicked每张卡之后,将调用一个新的intent ,其中包含有关该卡数据的更多详细信息。

这是我初始化适配器的地方。 arrList是一个已经从另一个类填充的ArrayList

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

这是另一类持有卡片的类:

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");

        }
    }

上面的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;
        }
        }
     }

如何获得卡的点击位置?

谢谢

是否在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
        }
    };
}

编辑:tyczj是正确的。 在onBindViewHolder中绑定Clicklistener是一个非常简单但并非最佳的解决方案-它将起作用!

另一种方法是使用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()

我通过使用不同的onClick调用来做到这一点,然后可以使用

getAdapterPosition()

确定单击哪个项目的方法。

    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());
                    }
                });
    ...
    }

创建扩展了回收视图并覆盖所需方法的适配器类:

公共类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);   
  }
}

}

你应该设置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);
            }
        }
    });
}

编辑:就像@tyczj说的那样,对于RecyclerView ,最好在getAdapterPosition中使用ViewHolder

当用数据填充cardView时,还可以使用View的setTag()方法存储位置。 由于调用onClick时将获得View,因此只需在View上调用getTag()即可检索位置。

暂无
暂无

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

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