Was ich versuche zu erstellen ist eine horizontale Scrolling-Bildergalerie. Ich habe einen RecyclerView (Unterstützung 22.0.0). Das Problem, das ich habe, ist, dass, wenn ich bis zum Ende blättern und dann zurück scrollen, in der Regel ein Bild fehlt, manchmal zwei. Merkwürdigerweise könnte ein anderes Bild fehlen, wenn ich ständig hin und her wische. Hier ist das Layout für das Element:RecyclerView verschwinden Bilder
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="160dp">
<ImageView
android:id="@+id/product_variation_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:layout_gravity="center"/>
Hier ist der Adaper:
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
private String[] mDataset;
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mImageView;
public ViewHolder(View v) {
super(v);
mImageView = (ImageView) v.findViewById(R.id.product_variation_image);
}
}
public TestAdapter(String[] myDataset) {
mDataset = myDataset;
}
@Override
public TestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.variaton_list_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mImageView.setImageDrawable(null);
String url = mDataset[position];
Log.i("TEST", "position = " + position);
((MainActivity)MainActivity.getInstance()).imageDownloader.download(url, holder.mImageView);
}
@Override
public int getItemCount() {
return mDataset.length;
}
Die Download-Methode holt das Bild, von einer URL oder wird es aus dem Speicher, wenn es hat wurde zwischengespeichert. Dies funktioniert in allen anderen Layouts, z. ListView oder GridView. Hier ist der Code, den ich es einrichten aufbrauchen im Fragmente:
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
Dies ist in der onCreateView Methode. Wenn ich die Urls bekommen füllen ich sie und setzen Sie den Adapter verwenden:
myDataset[i] = imageURL; // for each image
mAdapter = new TestAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
Das Interessante an der Linie in der onBindViewHolder Verfahren in dem Adapter ist, wo ich die Position loggt sein. Was ich gefunden habe ist, dass Zellen, in denen das Bild nicht gezeigt wird, dass diese Methode nicht aufgerufen wird. Es ist so, als würde es die Zelle aus irgendeinem Grund überspringen. Noch seltsamer, wenn ich eine Zelle halte und von links nach rechts wische, wenn eine Zelle aus dem Bildschirm verschwindet und dann wieder reinkommt, ist das Bild verschwunden, da die Methode onBindViewHolder nicht mehr aufgerufen wird.
bitte teilen die ImageDownloader Code von Ihrem MainActivity zu ersetzen –
Hallo, Ich kann es nicht wirklich teilen, da es groß ist. Im Grunde holt es das Bild und setzt dann das Zeichen des Zeichens, sobald es aus dem Speicher oder aus der Ferne gekommen ist. Es basiert auf dem BitmapFun-Beispiel. Es funktioniert überall wo ich Bilder in der Anwendung verwende. Ich denke, das Problem ist der Adapter selbst, und nicht das Bild holen. –
Keine große Sache, ich denke, Ihr Problem ist, wie unten vorgeschlagen, Ihr Aufruf, ein neues Bild herunterzuladen, aber Ihr Bitmap auf Null für Ihre Bildansicht. Sie sollten dies jedes Mal herunterladen, wenn Sie onBindViewHolder aufrufen, wenn es bereits heruntergeladen wurde –