如何将图像从网络传递到recyclerview中的另一个活动

时间:2016-11-26 22:29:39

标签: android android-intent android-recyclerview

我有一个recyclelerview在线显示json文件中的项目,recyclelerview在每个列表项中也有一个缩略图。

当我点击某个项目时,它会启动一项新活动,如何将从服务器获取的缩略图图像传递给新活动?

这是我的新活动代码:

public class ItemModal extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_modal);

        TextView ItemNameV = (TextView) findViewById(R.id.textView);
        TextView ItemDescV = (TextView) findViewById(R.id.textView2);
        TextView ItemPriceV = (TextView) findViewById(R.id.textView3);
        ImageView ItemImageV = (ImageView) findViewById(R.id.imageView);

        String itemName = getIntent().getStringExtra("ItemName");
        String itemDesc = getIntent().getStringExtra("ItemDesc");
        String itemPrice = getIntent().getStringExtra("ItemPrice");
        String itemImage = getIntent().getStringExtra("ItemImage");

        ItemNameV.setText(itemName);
        ItemDescV.setText(itemDesc);
        ItemPriceV.setText(itemPrice);
        ItemImageV.setId(Integer.parseInt(itemImage));
    }



}

以下是适配器代码:

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

    private Context context;
    private LayoutInflater inflater;
    List<DataItems> data= Collections.emptyList();
    DataItems current;
    int currentPos=0;

    // create constructor to innitilize context and data sent from MainActivity
    public AdapterItems(Context context, List<DataItems> data){
        this.context=context;
        inflater= LayoutInflater.from(context);
        this.data=data;
    }

    // Inflate the layout when viewholder created
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=inflater.inflate(R.layout.container_items, parent,false);
        MyHolder holder=new MyHolder(view);
        return holder;
    }

    // Bind data
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        // Get current position of item in recyclerview to bind data and assign values from list
        MyHolder myHolder= (MyHolder) holder;
        DataItems current=data.get(position);
        myHolder.textItemName.setText(current.itemName);
        myHolder.textDesc.setText(current.itemDesc);
        myHolder.textPrice.setText("# " + current.price);
        myHolder.textPrice.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));

        // load image into imageview using glide
        Glide.with(context).load(current.itemImage)
                .placeholder(R.drawable.ic_img_error)
                .error(R.drawable.ic_img_error)
                .into(myHolder.ivItem);

    }

    // return total item from List
    @Override
    public int getItemCount() {
        return data.size();
    }


    class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView textItemName;
        ImageView ivItem;
        TextView textDesc;
        TextView textPrice;

        // create constructor to get widget reference
        public MyHolder(View itemView) {
            super(itemView);
            textItemName = (TextView) itemView.findViewById(R.id.textItemName);
            ivItem = (ImageView) itemView.findViewById(R.id.ivItem);
            textDesc = (TextView) itemView.findViewById(R.id.textDesc);
            textPrice = (TextView) itemView.findViewById(R.id.textPrice);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {

            Intent intent = new Intent(context, ItemModal.class);
            intent.putExtra("ItemName", textItemName.getText().toString());
            intent.putExtra("ItemImage", ivItem.getId());
            intent.putExtra("ItemDesc", textDesc.getText().toString());
            intent.putExtra("ItemPrice", textPrice.getText().toString());
            Toast.makeText(context, textDesc.getText().toString() , Toast.LENGTH_SHORT ).show();
            context.startActivity(intent);
        }
    }

}

以下是开始新活动的代码:

public void onClick(View v) {

            Intent intent = new Intent(context, ItemModal.class);
            intent.putExtra("ItemName", textItemName.getText().toString());
            intent.putExtra("ItemImage", ivItem.getId());
            intent.putExtra("ItemDesc", textDesc.getText().toString());
            intent.putExtra("ItemPrice", textPrice.getText().toString());
            Toast.makeText(context, textDesc.getText().toString() , Toast.LENGTH_SHORT ).show();
            context.startActivity(intent);
        }

这里我只是传递了没有帮助的图像的ID。

2 个答案:

答案 0 :(得分:1)

MyHolder课程:

isset

适配器onBindViewHolder:

class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    String imageUrl;
    // .....

    @Override
    public void onClick(View v) {
        // ...
        intent.putExtra("ItemImage", imageUrl);
        context.startActivity(intent);
    }
}

ItemModal类:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    // ...
    myHolder.imageUrl = current.itemImage;

}

答案 1 :(得分:1)

将视图持有者的点击功能更改为类似于下面的

@Override
        public void onClick(View v) {
DataItems current=data.get(getAdapterPosition());
//getAdapterPosition() will return the clicked position
            Intent intent = new Intent(context, ItemModal.class);
            intent.putExtra("ItemName", current.itemName);
            intent.putExtra("ItemImage", current.itemImage);
            intent.putExtra("ItemDesc", current.itemDesc);
            intent.putExtra("ItemPrice", "# " + current.price);
            Toast.makeText(context, textDesc.getText().toString() , Toast.LENGTH_SHORT ).show();
            context.startActivity(intent);
        }

再次,您可以使用Glide在itemMod.class活动中加载图像 在Glide中,您可以定义它可以从缓存加载还是再次从网络重新加载 如果您从缓存设置它不会使用网络下载图像,它将重用下载的文件,以回收Recyclerview