簡體   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