首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在单击回收器视图时获取当前值

如何在单击回收器视图时获取当前值
EN

Stack Overflow用户
提问于 2018-09-05 15:06:31
回答 4查看 91关注 0票数 0
代码语言:javascript
运行
复制
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {


private String[] mDatasetname;

private Integer[] mexp;
Context context;
public ToggleButton select;
Integer selectedcountint=0;
  private Bitmap[] mpro;

private String[] mloc;
private String[] mobj;

private String[] mselected;
 public ArrayList<String> nselected = new ArrayList<>();



public static class MyViewHolder extends RecyclerView.ViewHolder{

    public CardView mCardView;
    public TextView mTextView;
    public TextView texp;
    public Button pdf;
    public ToggleButton select;
    public ImageView pro;
    public TextView loc;




    public MyViewHolder(View v){

        super(v);


        mCardView = (CardView) v.findViewById(R.id.card_view);
        mTextView = (TextView) v.findViewById(R.id.tv_text);
       texp = (TextView) v.findViewById(R.id.setexp);
        pdf = (Button) v.findViewById(R.id.moreinfo);
        select = (ToggleButton) v.findViewById(R.id.select);
        pro = (ImageView) v.findViewById(R.id.setpropic);
        loc = (TextView) v.findViewById(R.id.setlocation);



    }


}

public MyAdapter(String[] myDataset,Integer[] exp,Bitmap[] pro,String[] loc,String[] obj){


    mDatasetname = myDataset;

    mexp=exp;
    mpro=pro;
    mloc=loc;

    mobj=obj;



}



@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

    context=parent.getContext();
    View vs = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
    MyViewHolder vh = new MyViewHolder(vs);
    return vh;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position){




    holder.mTextView.setText(mDatasetname[position]);
    holder.texp.setText(String.valueOf(mexp[position])+" yrs");
    holder.pro.setImageBitmap(mpro[position]);
    holder.loc.setText(mloc[position]);
    holder.select.setText("rejected");

    holder.pdf.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent();
            intent =  new Intent(context, PdfViewer.class);
            intent.putExtra("obj",mobj[position]);
            context.startActivity(intent);


        }
    });



    holder.select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked==true) {
                holder.select.setChecked(true);
                holder.select.setText("selected");
              nselected.remove(mobj[position]+",rejected");
               nselected.add(mobj[position]+",selected");
                Log.d("dei", String.valueOf(nselected));
                selectedcountint=selectedcountint+1;

                Intent intent = new Intent("custom-message");
                //            intent.putExtra("quantity",Integer.parseInt(quantity.getText().toString()));
                Bundle args = new Bundle();
                args.putSerializable("ARRAYLIST",(Serializable)nselected);
                intent.putExtra("BUNDLE",args);
                intent.putExtra("totalval",selectedcountint);

                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);


            } else {
                holder.select.setChecked(false);
                holder.select.setText("rejected");
                nselected.remove(mobj[position]+",selected");
                nselected.add(mobj[position]+",rejected");
                Log.d("dei", String.valueOf(nselected));
                selectedcountint=selectedcountint-1;


                Intent intent = new Intent("custom-message");
                //            intent.putExtra("quantity",Integer.parseInt(quantity.getText().toString()));
                Bundle args = new Bundle();
                args.putSerializable("ARRAYLIST",(Serializable)nselected);
                intent.putExtra("BUNDLE",args);
                intent.putExtra("totalval",selectedcountint);

                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);






            }
        }
    });







}


@Override
public int getItemCount() { return mDatasetname.length; }

}

我的应用程序中有一个回收器视图。我有个问题。有一个项目,所以当我点击项目a时,点击b中的函数被执行。如果你帮我清理下面的代码,那就太好了,因为我是编程新手,所以我不能解决这个问题。

EN

回答 4

Stack Overflow用户

发布于 2018-09-05 15:59:51

代码语言:javascript
运行
复制
if(getAdapterPosition() != RecyclerView.NO_POSITION) {
  ...
  mobj[getAdapterPosition()]
  ...
}
票数 1
EN

Stack Overflow用户

发布于 2018-09-05 15:34:47

最好在ViewHolder中设置数据和侦听器。您应该在ViewHolder类中创建一个方法,并将列表中的项目作为参数传递。在此方法中,您将复制用于设置文本和侦听器的所有代码。然后在onBindViewHolder中调用此方法。

首先创建一个将成为我们的Adapter项的类(您应该更改字段的名称,因为我不知道它们应该代表什么,这只是一个示例):

代码语言:javascript
运行
复制
class AdapterItem {

   private String firstString;
   private Integer integerValue;
   private Bitmap bitmap;
   private String secondString;
   private String thirdString;

   // create also getters, setters for fields
}

您的适配器构造函数将如下所示:

代码语言:javascript
运行
复制
public MyAdapter(ArrayList<AdapterItem> data){
   this.data = data;
}

onBindViewHolder方法:

代码语言:javascript
运行
复制
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position){
    holder.bind(data[position]);
}

在ViewHolder类中:

代码语言:javascript
运行
复制
void bind(AdapterItem item) {
    mTextView.setText(item.getFirstString());

    pdf.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(context, PdfViewer.class);
        intent.putExtra("obj", item.getThirdString());
        v.getContext().startActivity(intent);
        }
   });

}
票数 0
EN

Stack Overflow用户

发布于 2018-09-05 16:32:24

正如@andrei正确指出的那样,从obj[]数组中获取正确字符串的代码应该如下所示:

代码语言:javascript
运行
复制
public MyAdapter(Context context, String[] myDataset,Integer[] exp,Bitmap[] pro,String[] loc,String[] obj){
    mContext = context; // make mContext as a variable like others
    mDatasetname = myDataset;
    mexp=exp;
    mpro=pro;
    mloc=loc;
    mobj=obj;
}

    holder.pdf.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent();
            intent =  new Intent(context, PdfViewer.class);
            intent.putExtra("obj",mobj[holder.getAdapterPosition()]);
            mContext.startActivity(intent);
        }
    });

类似地,将所有出现的position替换为holder.getAdapterPosition(),因为holder.getAdapterPosition()将始终在代码中为回收器视图的项提供更新的位置,就像您在没有使用notifyDataSetChanged()方法的情况下更新或删除项一样,那么onBindViewHolder将不会被再次调用,因此位置将变得不一致。有关详细信息,请参阅此answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52179065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档