W
washpuda
Neues Mitglied
- 0
Hallo,
ich zeige ein Bild aus einer Liste mehrerer Bilder in einem Bildausschnitt an. Auf jedem Bild habe ich ein kleines TextView zur Anzeige Bild (1/3) usw. gesetzt. Es wird immer nur ein Bild angezeigt. Durch wischen nach links oder rechts wird jeweils das nächste oder vorherige Bild angezeigt. Das funktioniert einwandfrei.
Da ich neben dem Bild weitere Informationen einer separaten ListView anzeigen möchte, benötige ich ein Event was beim Bildwechsel aufgerufen wird und eine Möglichkeit den Index des aktuellen Bildes heraus zu bekommen. Jedem Bild sind Informationen hinterlegt, die beim Bildwechsel in einem separatem Bereich angezeigt werden sollen.
Ich habe mir ein eigenes View erstellt, dass von RecyclerView abgeleitet ist. Das Bild und die zugehörigen Daten sind MPicData Objekt enthalten.
Ich habe schon eine Weile im Internet gesucht, jedoch nichts gefunden.
ich zeige ein Bild aus einer Liste mehrerer Bilder in einem Bildausschnitt an. Auf jedem Bild habe ich ein kleines TextView zur Anzeige Bild (1/3) usw. gesetzt. Es wird immer nur ein Bild angezeigt. Durch wischen nach links oder rechts wird jeweils das nächste oder vorherige Bild angezeigt. Das funktioniert einwandfrei.
Da ich neben dem Bild weitere Informationen einer separaten ListView anzeigen möchte, benötige ich ein Event was beim Bildwechsel aufgerufen wird und eine Möglichkeit den Index des aktuellen Bildes heraus zu bekommen. Jedem Bild sind Informationen hinterlegt, die beim Bildwechsel in einem separatem Bereich angezeigt werden sollen.
Ich habe mir ein eigenes View erstellt, dass von RecyclerView abgeleitet ist. Das Bild und die zugehörigen Daten sind MPicData Objekt enthalten.
Ich habe schon eine Weile im Internet gesucht, jedoch nichts gefunden.
Code:
public class PicThumbViewer extends RecyclerView {
private transient List<ChangeListener> changeListener; // eigener Listener
private MPicData picData; // mehrere Bilder mit Textdaten
private RecyclerViewAdapter adapter;
private int index = 0; // soll den Index vom Bild erhalten??
public PicThumbViewer(Context context) {
super(context);
initialize();
}
public PicThumbViewer(Context context,AttributeSet attrs) {
super(context, attrs);
initialize();
}
public PicThumbViewer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize();
}
public void initialize(){
adapter = new RecyclerViewAdapter();
this.setAdapter(adapter);
setHasFixedSize(true);
setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
new PagerSnapHelper().attachToRecyclerView(this);
}
public MPicData getPicData() {
return picData;
}
public void setPicData(MPicData picData) {
this.picData = picData;
adapter.notifyDataSetChanged();
}
public MPicData getActPic() {
return picData == null ? null : index == 0 ? picData : picData.additionalPics.get(index-1);
}
@Override
public void onChildAttachedToWindow(View child) {
super.onChildAttachedToWindow(child);
TextView textView = (TextView) ((FrameLayout)child).getChildAt(1); // TextView zeigt Bild (1/3)
Utils.log(textView.getText().toString());
// child beinhaltet entweder das erste oder das letzte item, nicht jedoch die dazwischen
// diese Methode wird leider auch nicht bei jedem Bildwechsel aufgerufen
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_simple_image, parent, false);
return new RecyclerViewAdapter.MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
if(picData.hasAdditionalPics()){
holder.imgCntTextView.setText("(" + (position+1) + "/"+ getItemCount() + ")");
holder.imgCntTextView.setVisibility(VISIBLE);
}else{
holder.imgCntTextView.setVisibility(INVISIBLE);
}
holder.imageView.setImageBitmap(position == 0 ? PicUtils.getThumbNail(picData) :
PicUtils.getThumbNail(picData.additionalPics.get(position-1)));
}
@Override
public int getItemCount() {
return picData == null ? 0 : 1 + (picData.hasAdditionalPics() ? picData.additionalPics.size() :0);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView imgCntTextView;
public MyViewHolder(View view) {
super(view);
imageView = view.findViewById(R.id.item_simple_Image);
imgCntTextView = view.findViewById(R.id.item_LblSimpleImgCnt);
}
}
}
// die nächsten 3 Methoden sind für mein Changelistener, wobei fireChange() das event auslöst.
// Die frage ist wo rufe ich diese Methode auf, dass diese einmalig bei jedem Bildwechsel aufgerufen wird.
public void addChangeListener(ChangeListener l) {
if(changeListener == null) {
changeListener = new ArrayList<>();
}
changeListener.add(l);
}
public void removeChangeListener(ChangeListener l) {
changeListener.remove(l);
}
public void fireChange() {
if(changeListener != null) {
for(ChangeListener cL: changeListener) {
cL.stateChanged(new ChangeEvent(this));
}
}
}
}
Code:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/item_FrameLayoutSI"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/item_simple_Image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp"
app:srcCompat="@drawable/info_16x16" />
<TextView
android:id="@+id/item_LblSimpleImgCnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:background="#74FFFFFF"
android:gravity="clip_horizontal|end"
android:text="TextView"
android:textSize="12dp"/>
</FrameLayout>