我在这里遵循了这个例子:https://developer.android.com/training/material/lists-cards.html
发生了什么:
列表(RecyclerView)在滚动时混合数据。即当我向下滚动后向上滚动时,会重复一些列表项,而不会显示正确的内容。
这是我的onBindViewHolder
方法:
// cardsData is a List of MyCardItem (MyCardItem is just a holder of information,
// such as an id, String title, String summary, and other info to display on a card
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position)
{
// Update view here
if (!cardsData.isEmpty())
{
viewHolder.updateDisplay(cardsData.get(position), activity, position);
}
}
这是我在ViewHolder类中找到的updateDisplay
方法:
// Set ID
if (item.getID() != null)
{
mIDView.setText(item.getID());
}
// Set Title
if (item.getTitle() != null)
{
mTitleView.setText(item.getTitle());
}
// Set Summary
if (item.getSummary() != null)
{
mSummaryView.setText(Html.fromHtml(item.getSummary()));
}
// Image
if (item.hasImage())
{
// Display image here
}
我认为某些与有时数据为空的事实有关,因此我选择不显示它。并非所有项目(卡片)都有要显示的图像,因此这就是我检查项目是否应该有图像的原因。如果确实如此,那么我会做一些花哨的代码来显示图像(并制作其他视图GONE
,这样我只能显示图像等。)
在调试时,我强制所有卡片在标题中显示他们的ID和位置。我可以确认所有ID和位置都在适当的位置。当我强制(删除if检查id,title和summary)时,要显示的id,title和summary,即使为null,该内容也不会受到影响。但是,这并不能解决我的图像情况(不会总是有图像)。然后我会有一些图像占据某个ID /位置的位置,它应该不(即不显示摘要文本,它显示的图像不是应该在那里。)
有关为什么在我的RecyclerView中发生这种情况的任何输入?
答案 0 :(得分:12)
RecyclerView
与ListView
和GridView
一样,尽可能重复使用视图。这意味着当您滚动时,从顶部掉落的视图将用于底部的视图等。这极大地提高了内存效率和滚动性能。这意味着如果您未在新项目上重置所有状态,您将看到上次使用此视图时遗留下来的状态。
相反,您应该始终重置所有状态:
if (item.getID() != null) {
mIDView.setText(item.getID());
} else {
mIDView.setText("");
}
// etc...
此外,不应该在任何情况下需要检查cardsData.isEmpty()
- 相反,每当您更新cardsData
时,您应该调用相应的notifyXXX
方法(例如notifyItemInserted()或更糟糕的情况notifyDataSetChanged()),它会自动相应地自动刷新列表。
答案 1 :(得分:4)
实施
public long getItemId(int position) {}
否则,您将在 RecyclerView 中看到重复的项目。
答案 2 :(得分:3)
添加这两个,你很高兴!
private Button btn_play;
MediaPlayer mp;
int duration;
private ImageView imageView;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_names);
int resID = getResources().getIdentifier("audio", "raw", getPackageName());
mp = MediaPlayer.create(NamesOfALLAH.this, resID);
duration = mp.getDuration();
btn_play = (Button) findViewById(R.id.btn_play);
imageView = (ImageView) findViewById(R.id.imageView_Names);
btn_play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp.isPlaying()) {
mp.pause();
btn_play.setText("Play");
} else {
mp.start();
btn_play.setText("Pause");
changeImage1();
changeImage2();
changeImage3();
changeImage4();
changeImage5();
}
}
});
}
public void changeImage1() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.drawable.a1);
}
}, 6000);
}
public void changeImage2() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.drawable.a2);
}
}, 8000);
}
public void changeImage3() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.drawable.a3);
}
}, 10000);
}
public void changeImage4() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.drawable.a4);
}
}, 11000);
}
public void changeImage5() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(R.drawable.a5);
}
}, 12000);
}
答案 3 :(得分:1)
除了之前的回答,您还可以查看空虚视图,例如:
if (TextUtils.isEmpty(viewHolder.item.getText())) {
viewHolder.item.setText(object.getItem());
}
答案 4 :(得分:0)
详细说明ViliusK的答案。这个实现将起作用:
$query = "INSERT INTO Proteos (User, Mail ) VALUES ('{$user}','{$mail}' ) ";
mysqli_query($con,$query);
or
mysqli_query($conn, $query) or die(mysqli_error($conn));