如何在android中的Recycler View中更改图像(如单选按钮)?

时间:2016-09-22 13:32:18

标签: android android-recyclerview

我正在使用Recycler View。这就像一个网格视图。网格布局中共有9个图像。如果我单击上述任何一个图像,该图像必须更改为另一个图像。如果我点击另一张图片。最后一个想要重置。然后单击的图像将变为高亮显示的图像 这是我的代码......

holder.mLayout.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) {

            //for (int i = 0; i < data_collection.size(); i++) {

                holder.mLayout.setVisibility(View.VISIBLE);
                holder.mHighLighted.setVisibility(View.GONE);
                if (position == i) {

                }
            //}
            holder.mLayout.setVisibility(View.GONE);
            holder.mHighLighted.setVisibility(View.VISIBLE);

            mHighLight.onHighLight(position, view);
        }
    });

2 个答案:

答案 0 :(得分:0)

删除你不需要的东西。

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

    holder.textView.setText(elements.get(position).getName());
    holder.textView.setTypeface(typeface1);
    CircularImageView circularImageView = (CircularImageView) holder.linearLayout.findViewById(R.id.personazhe_layout_grid_item_image);
    //  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    //    circularImageView.setBackground(elements.get(position).getPhoto());
    //  }

circularImageView.setImageDrawable(elements.get(位置).getProfileImage());         //Picasso.with(context).load(elements.get(position).getProfileImage()).into(circularImageView);         holder.linearLayout.setOnClickListener(new View.OnClickListener(){             @覆盖             public void onClick(查看视图){

            if(pos != position){


            c.setImageDrawable(elements.get(position).getProfileImage());
            t.setText(elements.get(position).getName());
            seekBar.setProgress(0);
            pos = position;
            }

            //image = elements.get(position).getProfileImage();
            // textviews
          //  trajneri = elements.get(position).getTrajneri();
         //   mosha = elements.get(position).getMosha();
          //  vendbanimi = elements.get(position).getVendbanimi();
          //  vendlindja = elements.get(position).getVendlindja();
          //  arsimi = elements.get(position).getArsimi();
          //  name = elements.get(position).getName();
           // surname = elements.get(position).getSurname();
           // pos = elements.get(position).number();
          //  posi = position;


          //  button.performClick();
        }
    });
}

答案 1 :(得分:0)

ViewHolder模式是Android推动开发人员长时间使用的模式,然后(正确地)使用RecyclerViews强制使用它们。与简单的ListView相反的想法是,在滚动时尽可能多地重用视图以减少通货膨胀和资源识别。 ViewHolder应该作为在RecyclerView中更改/未创建的内容进行管理。

因此,将信息存储在必须持久的ViewHolder中将不起作用。为此,还有很多其他选择。让我们使用一个内部类来管理当前选定的视图位置及其相关图像。

假设我们有一个自定义ViewHolder,如下所示:

public class ImageViewHolder extends RecyclerView.ViewHolder{
    private ImageView iv;

    public ImageViewHolder(View v){
        iv = (ImageView) v.findViewById(R.id.iv);
    }

    public ImageVie getImageView(){
        return iv;
    }
}

利用该视图持有者是一个适配器DemoAdapter,我们可以修改它看起来像这样:

public class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    public interface SelectionListener{
        void onImageSelected(Bitmap bmp);
    }

    private static class SelectionHolder{
        protected int position;
        protected Bitmap originalBmp, newBmp;

        public SelectionHolder(int position, Bitmap originalBmp,
                Bitmap newBmp){
            this.position = position;
            this.originalBmp = originalBmp;
            this.newBmp = newBmp
        }
    }

    private SelectionHolder selectionHolder;
    private SelectionListener selectionListener;

    /*
     Pre-existing Adapter functionality
     */

    public void setSelectionListener(SelectionListener listener){
        selectionListener = listener;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        /*
         Pre-existing onBindViewHolder code
         */

        ImageView iv = holder.getImageView();

        if(selectionHolder != null && selectionHolder.position == position)
            iv.setImageBitmap(selectionHolder.newBmp);
        else{
            //set the image however you are doing it now
        }

        iv.setOnClickListener(
                new new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ImageView iv = (ImageView) v;
                        // Get the IV's current bmp
                        Bitmap originalBmp = getBitmapFromImageView(iv);
                        // Get the currently selected image's "new" image
                        // if it is null, set it to the original bmp
                        // this will initialize our "highlighting"
                        Bitmap newBmp = selectionHolder == null || selectionHolder.newBmp == null?
                            originalBmp: selectoinHolder.newBmp;

                        // set the selection holder
                        selectionHolder = new SelectionHolder(position, originalBmp, newBmp);

                        // notify our listener
                        if(selectionListener != null)
                            selectionListener.onImageSelected(bmp);

                        // refresh the adapter
                        DemoAdapter.this.notifyDataSetChanged();
                    }
                });
    }

    private Bitmap getBitmapFromImageView(ImageView iv){
        return ((BitmapDrawable)(iv.getDrawable()).getBitmap()
    }
}

然后,如果我们有一个需要所选图像的活动,可能会在它托管的ImageView中显示它

recyclerAdapter = new DemoAdapter(...);
recyclerAdapter.setSelectionListener(new SelectionListener(){
    @Override
    public void onImageSelected(Bitmap bmp){
        // set the bmp to your image view or whatever you want
    }
}