2016-11-26 8 views
0

온라인에서 json 파일의 항목을 표시하는 recyclerview가 있고, recyclerview에는 각 목록 항목의 축소판 이미지도 있습니다.네트워크에서 recyclerview의 다른 활동으로 이미지를 전달하는 방법

항목을 클릭하면 새로운 활동이 시작됩니다. 서버에서 가져온 미리보기 이미지를 새 활동으로 전달하려면 어떻게해야합니까? 내가 여기

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



} 

는 어댑터 코드입니다 : 여기

내 새로운 활동 코드 그냥 이드의 이미지를 전달하는 데 도움이되지 않습니다.

답변

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

어댑터 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

글라이드가 이미 이것을했다고 생각합니다. 안드로이드 스튜디오에 연결된 앱을 실행하고 안드로이드 모니터 아래의 네트워크 그래프를보십시오. 액티비티를 열면 새로운 것이 전혀 다운로드되지 않습니다 –

2

이 캐시에서로드하거나 경우 다시 네트워크에서 를 다시로드 할 수 있습니다 어떠했는지 당신은 당신이 정의 할 수 있습니다 글라이드에서 itemMod.class 활동 에 이미지를로드 글라이드를 사용하여 다시

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

를 넣고 좋아하는 뷰 홀더의 클릭 기능에 변경 캐시에서 설정하면 네트워크를 사용하여 이미지를 다운로드하지 않고 recyclerview 용으로 다운로드 된 이미지를 다시 사용합니다.

+0

네트워크를 통한 캐시는 어떻게 선택합니까? – theOzmic

+0

'current.itemImage'를 사용하면 작동하지 않습니다 – theOzmic

+0

onBindViewHolder에서 항목 데이터를 바인딩하는 동안 동일 항목을 사용하고 있기 때문에 작동해야합니다 –

관련 문제