2016-12-15 4 views
0

У меня есть RecyclerView с определенными данными, и каждый элемент recyclerView имеет кнопку, которая запускает второе действие. Во втором действии он должен отображать значения из определенного элемента, с которого нажата кнопка. Проблема заключается в том, что когда я нажимаю кнопку из позиции в позиции 0, у меня есть правильные значения, но когда я нажимаю кнопку в позиции 1, я получаю значения из положения 0:RecyclerView извлекает данные из последней позиции

кнопка в положении 2 - отображаются значения из позиции 1

кнопку в положении 3 - отображает значения из позиции 2

кнопку в положении 4 - отображает значения из позиции 3

и так далее ...

Th это является метод, где я заселить ViewHolder() и событие OnClick:

protected void populateViewHolder(PicturesHolder viewHolder, Pictures model, final int position) { 

       viewHolder.setImage(model.getDownloadURL()); 
       viewHolder.setLatitude(model.getLatitude()); 
       viewHolder.setLongitude(model.getLongitude()); 
       viewHolder.setDateView(model.getDate()); 

       viewHolder.imageButtonView.setOnClickListener(new View.OnClickListener(){ 
        @Override 
        public void onClick(View view){ 
         Toast.makeText(view.getContext(), "Launching second activity", Toast.LENGTH_SHORT).show(); 
         Intent intent = new Intent(view.getContext(),DetailsActivity.class); 
         TextView latitude = (TextView) findViewById(R.id.latitude); 
         TextView longitude = (TextView) findViewById(R.id.longitude); 
         String latitude_details = latitude.getText().toString(); 
         String longitude_details = longitude.getText().toString(); 
         intent.putExtra(EXTRA_LATITUDE,latitude_details); 
         intent.putExtra(EXTRA_LONGITUDE,longitude_details); 
         startActivity(intent); 
        } 
       }); 
      } 

Это SecondActivity, где отображаются данные:

public class DetailsActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_details); 

     Intent intent=getIntent(); 
     String mLatitude = intent.getStringExtra(MainActivity.EXTRA_LATITUDE); 
     String mLongitude = intent.getStringExtra(MainActivity.EXTRA_LONGITUDE); 

     TextView latitude = (TextView) findViewById(R.id.latitude_detail); 
     TextView longitude = (TextView) findViewById(R.id.longitude_detail); 

     latitude.setText(mLatitude); 
     longitude.setText(mLongitude); 

    } 
} 

Я не знаю, что я делаю неправильно , если вам нужно больше кода, не стесняйтесь спрашивать. Спасибо и приветствую!

+0

RecyclerView отличается от ListViews несколькими способами, но, возможно, наиболее очевидным отличием является то, как он имеет дело с представлениями. Есть предостережения с держателями обзора и содержанием, содержащимся внутри. Представления повторно используются, как только они выходят из экрана другой строкой, ожидающей рендеринга. Вы можете отслеживать это в режиме отладки или при регистрации. –

+0

напишите свой код «Адаптер». –

ответ

1

Заменить

TextView latitude = (TextView) findViewById(R.id.latitude); 
TextView longitude = (TextView) findViewById(R.id.longitude); 
String latitude_details = latitude.getText().toString(); 
String longitude_details = longitude.getText().toString(); 

С

String latitude_details = model.getLatitude(): 
String longitude_details = model.getLongitude(); 
+0

Вы должны объяснить, почему вам нужно внести эти изменения и * почему * значения 'position0' загружаются вместо' position1' –

0

вызова sethasstableids(true) из вашего ресайклера View роект в классе деятельности.

setHasStableIds - подсказка по оптимизации, которую вы можете предоставить рециклиру. Вы говорите «когда я предоставляю ViewHolder, его идентификатор уникален и не изменится».

0

Сделайте свой класс класса переопределенным равным и хэш-кодом.

public abstract class BaseListItem { 

    protected int mListItemType; 

    public BaseListItem(int itemType) { 
     mListItemType = itemType; 
    } 

    public int getListItemType() { 
     return mListItemType; 
    } 

    public abstract long getId(); 

    @Override 
    public boolean equals(Object o) { 
     if (!(o instanceof BaseListItem)) { 
      return false; 
     } 

     BaseListItem otherListItem = (BaseListItem) o; 
     return otherListItem.getId() == getId(); 
    } 

    @Override 
    public int hashCode() { 
     Long id = getId(); 
     return id.hashCode(); 
    } 

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