2017-01-31 1 views
0

У меня есть gridview с 3 ячейками, и каждая ячейка будет иметь ImageView и ImageButton, чтобы добавить изображение из галереи или камеры.При замене одного изображения все остальные ImageViews заменяются в Gridview

Но когда я пытаюсь установить выбранное изображение в ячейке с сеткой gridview, он заменяет все ячейки вместо одной ячейки с одним щелчком.

Вот адаптер для GridView

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

    public static final String TAG="===GridView Pics==="; 
    ViewClickCallback viewClickCallback; 
    Context context; 
    List<UserGrid> userGridList; 
    UserGrid userGridWrapper; 
    String ImageData; 

    public Adapter_For_GridView(ViewClickCallback viewClickCallback,Context context) { 
     this.viewClickCallback=viewClickCallback; 
     this.context=context; 
    } 

    @Override 
    public Adapter_For_GridView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.user_profile_photo_single_item,parent,false); 
     ViewHolder viewHolder=new ViewHolder(view); 
     Log.d(TAG,"On Create View Holder "); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(Adapter_For_GridView.ViewHolder holder, int position) { 
     userGridWrapper=userGridList.get(position); 

     Log.d(TAG,"On Bind View Holder- Value of isUpload "+userGridWrapper.isUpload()); 
     Log.d(TAG,"On Bind View Holder Image Data "+ImageData); 
     Log.d(TAG,"On Bind View Holder Position "+position+" "+"User Grid Wrapper "+userGridWrapper); 
     Log.d(TAG,"On Bind View Holder User Grid Wrapper Get Image Path "+userGridWrapper.getImagePath()); 

     if (ImageData!=null){ 
      Log.d(TAG,"Image Data is Not Null "+ImageData); 
      userGridWrapper.setUpload(true); 
      if (userGridWrapper.isUpload()){ 
       holder.imageButton.setImageResource(R.drawable.ic_clear_black_24dp); 
       Picasso.with(context).load(ImageData) 
         .into(holder.imageView); 
      } 
     } 
     else{ 
      holder.imageButton.setImageResource(R.drawable.ic_add_black_24dp); 
     } 


    } 

    @Override 
    public int getItemCount() { 
     Log.d(TAG,"Value at GetItemCount of GridList "+userGridList.size()); 
     if (userGridList!=null){ 
      return userGridList.size(); 
     } 
     return 2; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     ImageView imageView; 
     ImageButton imageButton; 


     public ViewHolder(View itemView) { 
      super(itemView); 
      Log.d(TAG,"On View Holder"); 
      itemView.setOnClickListener(this); 
      imageView= (ImageView) itemView.findViewById(R.id.User_Pics); 
      imageButton= (ImageButton) itemView.findViewById(R.id.imageButton); 
      imageButton.setOnClickListener(this); 

     } 

     @Override 
     public void onClick(View v) { 
      Log.d(TAG,"Image Button Clicked "+getAdapterPosition()+" Get Layout Position "+getLayoutPosition()); 
      if (viewClickCallback!=null){ 
       Log.d(TAG,"ViewClickcalleback is not null "); 
       viewClickCallback.viewClicked(getAdapterPosition()+1); 
      } 

     } 
    } 

    public void setUserGridList(List<UserGrid> userList){ 
     this.userGridList=userList; 
    } 

    public void setImagePath(String path,int position){ //GETTING IMAGE HERE FROM ONACTIVITYRESULT TO THIS ADAPTER 
     this.ImageData=path; 
     Log.d(TAG,"Position of Grid "+position); //POSITION OF CLICKED ITEM 
     Log.d(TAG,"Set Image Path "+path); //IMAGE PATH OF SELECTED IMAGE 
     notifyDataSetChanged(); 
     } 
    } 

LogCat из onactivityresult

01-31 18:13:47.917 9146-9146/com.example.com.pro_working1 D/===User Profile===: User Profile On Activity Result Calling 25 -1 
01-31 18:13:47.927 9146-9146/com.example.com.pro_working1 D/===User Profile===: On Activity Result Calling--Request Code 25 
01-31 18:13:47.927 9146-9146/com.example.com.pro_working1 D/===User Profile===: Intent Data Intent { dat=content://media/external/images/media/19276 typ=image/jpeg flg=0x1 } 
01-31 18:13:47.927 9146-9146/com.example.com.pro_working1 D/===User Profile===: On Activity Result Position 0 
01-31 18:13:48.687 9146-9146/com.example.com.pro_working1 D/===User Profile===: Image Name content://media/external/images/media/19276 
01-31 18:13:48.687 9146-9146/com.example.com.pro_working1 D/===User Profile===: Image /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:48.687 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Position of Grid 0 
01-31 18:13:48.687 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Set Image Path /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:48.777 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Value at GetItemCount of GridList 3 
01-31 18:13:48.777 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Value at GetItemCount of GridList 3 
01-31 18:13:48.777 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Value at GetItemCount of GridList 3 
01-31 18:13:48.787 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder- Value of isUpload false 
01-31 18:13:48.787 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Image Data /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:48.787 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Position 0 User Grid Wrapper [email protected] 
01-31 18:13:48.787 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder User Grid Wrapper Get Image Path null 
01-31 18:13:48.787 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Image Data is Not Null /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Value at GetItemCount of GridList 3 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder- Value of isUpload false 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Image Data /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Position 1 User Grid Wrapper [email protected] 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder User Grid Wrapper Get Image Path null 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Image Data is Not Null /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Value at GetItemCount of GridList 3 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder- Value of isUpload false 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Image Data /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder Position 2 User Grid Wrapper [email protected] 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: On Bind View Holder User Grid Wrapper Get Image Path null 
01-31 18:13:49.557 9146-9146/com.example.com.pro_working1 D/===GridView Pics===: Image Data is Not Null /storage/sdcard0/pictures/Social/1/Spread-Unconditional-Love_www.example.com-101.jpg 

ответ

0

Это происходит потому, что вы используете одного varibale ImageData для хранения пути выбранного изображения. Поэтому, когда представления воссоздаются в gridview, это значение varibale будет таким же, что и первое условие true в нижнем фрагменте кода.

if (ImageData!=null){ 
    Log.d(TAG,"Image Data is Not Null "+ImageData); 
    userGridWrapper.setUpload(true); 
    if (userGridWrapper.isUpload()){ 
     holder.imageButton.setImageResource(R.drawable.ic_clear_black_24dp); 
     Picasso.with(context).load(ImageData) 
       .into(holder.imageView); 
    } 
} 
else{ 
    holder.imageButton.setImageResource(R.drawable.ic_add_black_24dp); 
} 

Теперь, когда он вступил в первое условие if, вы устанавливаете значение загрузки true, прежде чем проверять его значение. Который снова будет перераспределять true. Следовательно, он заполняет все представления теми же данными.

Решение

Изменение ниже метод:

public void setImagePath(String path,int position){ //GETTING IMAGE HERE FROM ONACTIVITYRESULT TO THIS ADAPTER 
this.ImageData=path; 
userGridList.get(position).setUpload(true); 
Log.d(TAG,"Position of Grid "+position); //POSITION OF CLICKED ITEM 
Log.d(TAG,"Set Image Path "+path); //IMAGE PATH OF SELECTED IMAGE 
notifyDataSetChanged(); 
} 

изменить также проверить состояние для заполнения изображения:

if (userGridWrapper.isUpload()){ 
    holder.imageButton.setImageResource(R.drawable.ic_clear_black_24dp); 
    Picasso.with(context).load(ImageData) 
      .into(holder.imageView); 

} 
else{ 
holder.imageButton.setImageResource(R.drawable.ic_add_black_24dp); 
} 
+0

то что я должен делать. У меня также есть класс-оболочка с установщиками и методами getter 'String imageData и boolean isUpload'. Что я могу сделать, чтобы сделать «ImageData String» доступной только для нажатой ячейки – Ritu

+0

, вы можете либо создать ** ImageData ** varibale в классе оболочки, то же, что isUpload, а затем установить этот varibale для объекта класса-оболочки, получив его из списка, используя позицию в ** setImagePath ** или использовать ** isUpload ** boolean falg to dififerentiate – Sanjeet

0

Проблема заключается в том, что у вас есть только один путь как поле. Вы назначаете новое значение this.ImageData=path;. После вызова notifyDataSetChanged(); ваш адаптер обновит свои данные и вызовет onBindViewHolder() для каждого видимого элемента. Затем он будет загружать для каждого вызова новое изображение для пути, который равен ImageData.

Что вам нужно, это список путей. Вы также должны проверить, загружено ли уже изображение. Если это то же изображение, вам больше не придется загружать его. Возможно, вы можете реализовать небольшой кеш для этого.

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