无法使RecyclerView.Adapter正确显示

时间:2014-10-27 02:48:55

标签: android android-recyclerview

我在这里遵循了这个例子: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中发生这种情况的任何输入?

5 个答案:

答案 0 :(得分:12)

RecyclerViewListViewGridView一样,尽可能重复使用视图。这意味着当您滚动时,从顶部掉落的视图将用于底部的视图等。这极大地提高了内存效率和滚动性能。这意味着如果您未在新项目上重置所有状态,您将看到上次使用此视图时遗留下来的状态。

相反,您应该始终重置所有状态:

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