2016-11-26 4 views
0

У меня есть recyclerview, отображающий элементы из json-файла в Интернете, recyclerview также имеет уменьшенное изображение в каждом элементе списка.Как передать изображение из сети в другую деятельность в recyclerview

Когда я нажимаю на элемент, он начинает новое действие, как передать эскиз, полученный с сервера, на новый вид активности?

Вот мой новый код вида деятельности:

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

Здесь я просто передавая идентификатор изображения, который не помогает.

ответ

1

класс MyHolder:

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

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

Adapter onBindViewHolder:

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

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

} 

ItemModal класс:

public class ItemModal extends AppCompatActivity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_item_modal); 
     // ... 
     ImageView ItemImageV = (ImageView) findViewById(R.id.imageView); 
     String itemImage = getIntent().getStringExtra("ItemImage"); 
     Glide.with(this).load(itemImage) 
       .placeholder(R.drawable.ic_img_error) 
       .error(R.drawable.ic_img_error) 
       .into(ItemImageV); 

    } 
} 
+0

Как мне загрузить его из кеша вместо сети? – theOzmic

+0

Я думаю, что Glide уже делает это. Запустите приложение ehile, подключенное к студии Android, и посмотрите график сети под монитором Android. При открытии этой операции он не будет ничего нового. –

2

Измените свой на щелчок функции держателя вида нравится пыльник

@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.

+0

Как выбрать кеш через сеть? – theOzmic

+0

с использованием 'current.itemImage' не будет работать – theOzmic

+0

Он должен работать, потому что вы используете то же самое, когда привязываете данные элемента в onBindViewHolder –

Смежные вопросы