2015-09-17 2 views
2

Это мой код
Когда я прокручиваю вверх и вниз, изображения добавляются и в другую позицию, даже в этой позиции путь изображения не существует. предположим, что изображения пути находятся в 1,2 и в 3 положении, но он также показывает изображение на 4,10,15 позиции и т.д.
, когда я прокручиваю вниз в Recyclerview, не работает должным образом

public class Contact_Adapter_RecyeckView extends 
RecyclerView.Adapter<Contact_Adapter_RecyeckView.ViewHolder> { 
private ArrayList<ContactBean> arraylist; 
private Context context; 

public Contact_Adapter_RecyeckView(Context context, 
     ArrayList<ContactBean> arrayListImages) { 
    this.arraylist = arrayListImages; 
    this.context = context; 
} 

// Create new views (invoked by the layout manager) 
@Override 
public Contact_Adapter_RecyeckView.ViewHolder onCreateViewHolder(
     ViewGroup parent, int viewType) { 
    // create a new view 
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
      R.layout.contact_adapter_recycleview, null); 

    // create ViewHolder 

    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
    return viewHolder; 
} 

// Replace the contents of a view (invoked by the layout manager) 
@Override 
public void onBindViewHolder(ViewHolder viewHolder, int pos) { 

    String image = arraylist.get(pos).getImage(); 

     File imgFile = new File(image); 
      if(imgFile.exists()) 
      { 

       viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile)); 

      } 


     //viewHolder.ivProfile.setImageBitmap(BitmapFactory.decodeFile(arraylist.get(pos).getImage())); 
     //viewHolder.ivProfile.setVisibility(View.VISIBLE); 

// inner class to hold a reference to each item of RecyclerView 
public static class ViewHolder extends RecyclerView.ViewHolder { 

    public ImageView ivProfile; 
    public View view; 
    public CardView cardview; 

    public ViewHolder(View itemLayoutView) { 
     super(itemLayoutView); 

     ivProfile = (ImageView) itemLayoutView 
       .findViewById(R.id.iv_user_profile); 


    } 
} 

// Return the size of your itemsData (invoked by the layout manager) 
@Override 
public int getItemCount() { 
    return arraylist.size(); 
}}  

Я видел это ссылки тоже некоторые другие тоже, но все-таки проблема в том жеscroll when change не смог найти

+0

Может быть, потому что 'imgFile.exists()' 'возвратного false', попробуйте установить изображение по умолчанию в блоке еще. – Rami

+0

переменная изображения содержит пробел, если путь изображения отсутствует – tarun

+0

Вам нужно сбросить изображение по умолчанию (пустое изображение) в блоке else, иначе механизм рециркуляции будет повторно использовать старый. – Rami

ответ

4

Вам необходимо сбросить изображение по умолчанию в блоке else, иначе механизм рециркуляции будет повторно использовать старое изображение.

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int pos) { 

    String image = arraylist.get(pos).getImage(); 
    File imgFile = new File(image); 
     if(imgFile.exists()){ 
      viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile)); 
     } else { 
     // here you set your default image, or you can just hide "viewHolder.ivProfile" 
     } 
} 
0

Потому что вы получите переработанные взгляды в onBindViewHolder(), то ImageView может переносить данные из предыдущей инициализации, так что вам нужно явно скрыть/очистить ImageView, если нет данных для текущего элемента:

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int pos) { 
    String image = arraylist.get(pos).getImage(); 
    File imgFile = new File(image); 
    if(imgFile.exists()) { 
     viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile)); 
    } else { 
     viewHolder.ivProfile.setVisibility(View.INVISIBLE); 
    } 
} 
+0

, когда я set invisible отлично работает, но то, что я хочу, если не содержит пути, должно показать изображение по умолчанию, которое уже установлено. – tarun

+0

спасибо, что он работает отлично. :-) Вы сэкономите много времени. вместо невидимого я устанавливаю изображение по умолчанию в блоке else. другой блок работал для меня. – tarun

+0

Рад, что это помогло! Пожалуйста, примите ответ, если он сработает для вас. – Egor

0

Прежде всего Когда вы пишете состояние внутри onBindViewHolder вы должны написать свое действие на состояние альтернативы также. Такие, как

if(condition){ 
    //Write your code for condition is true 
}else{ 
    //Write your code if condition is false 
} 

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

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int pos) { 
//To stop recycle 
holder.setIsRecyclable(false); 

//your code 
........... 

//your conditional work 
if(condition){ 
    //Write your code for condition is true 
}else{ 
    //Write your code if condition is false 
} 
} 
Смежные вопросы