2016-11-16 1 views
0

Ich habe eine Listenansicht, wo jedes Element Textansicht und benutzerdefinierte Ansicht ist. Hier ist das Layout Listenansicht Artikel:Wie kann ich dasselbe Bewegungsereignis an alle Elemente in Listview übergeben?

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<net.manualuser.calibr.TimeScale 
    android:id="@+id/my_scale" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:paddingTop="40dp"> 

    <TextView 
     android:id="@+id/counter" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Timescale hier ist eine benutzerdefinierte Ansicht, die ein Lineal zieht und horizontales Scrollen abwickelt.

Ich möchte dasselbe Bewegungsereignis an das Lineal jedes Elements übergeben, so dass, wenn ich eins von der Liste scrolle, andere gleichzeitig scrollen.

In Adapter ich Listener auf benutzerdefinierte Ansicht eingestellt. Hier ist getView Teil:

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View v = view; 
    if(view == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.time_scale_item, viewGroup, false); 
    } 

    scale = (TimeScale)v.findViewById(R.id.my_scale); 

    scale.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      scale.onTouchEvent(event); 
      return false; 
     } 
    }); 

    TextView text = (TextView)v.findViewById(R.id.counter); 
    text.setText(Cities.get(i)); 
    return v; 
} 

In Main Activity finde ich meine Liste und set Adapter zu. Angenommen, ich habe 4 Einträge in der Listenansicht. Aber nur 2 bewegen sich gleichzeitig. Was ist eine geeignete Methode, um das gleiche Bewegungsereignis an alle Lineale in der Liste zu übergeben?

+0

Es funktioniert zum Teil. In der Liste von zwei Elementen, wenn ich die erste scrolle, bewegt sich die zweite auch, aber nicht umgekehrt, als ob in der zweiten Ansicht kein ontouchlistener gesetzt wäre. Wenn jedoch drei Einträge in einer Liste vorhanden sind, werden sie paarweise angezeigt: eins-drei, zwei-drei und der letzte scrollt nur sich selbst. –

Antwort

0

Wenn ich verstehe, Sie möchten scrollen alle TimeScale, wenn Sie einen von ihnen scrollen. In diesem Fall würde ich eine Singletone-Manager-Klasse mit einer Regsiter-Methode (TimeScale ts) und einer scrollAll() - und unregisterAll() -Methode erstellen. In Adapter getView() registrieren Sie die Ansicht an den Manager, und wenn Sie auf einen TimeScale-Aufruf scrollAll() -Methode auch scrollen und wenn die Liste zerstört ist, rufen Sie die Registrierung alle zu Timescales Referenzen zu löschen. Aber vielleicht ist es besser, bei Views onAttachToWindow() zu registrieren und bei onDetachFromWindow() die Registrierung aufzuheben. Ich weiß es nicht. In diesem Fall würde ich diese Lösung mit LeakCanary überprüfen, führt es nicht zu Speicherlecks. Andere Lösung kann LocalBroadcastManager sein, aber ich weiß nicht, wird es nicht zu Leistungsproblemen führen.

+0

thx aber ein bisschen kompliziert. Ich möchte jetzt eine Lösung finden, die ich im Adapter implementieren kann. –

+0

Ich sehe. Vielleicht können Sie die Liste der Adapterelemente durchlaufen, wenn Sie den Wert für eines der Elemente ändern und für alle Elemente denselben Wert festlegen. – user3057944

+0

das ist, was ich tun will, aber ich weiß nicht, wie bekomme ich Zugang zu bestimmten Widget aus der Liste. Ich habe meine Aufgabe vereinfacht: Nehmen wir an, ich habe eine Liste mit zwei Elementen mit Textansicht. Wenn ich auf eine Textansicht klicke, ändert sich der Text. Natürlich kann ich den Text der angeklickten Textansicht in der Methode onclick in getview: text.settext ändern. Aber wie bekomme ich Zugang zu Textview von einem anderen Gegenstand? –

0

Ihr Adapter sollte eine Schnittstelle mit einer Rückrufmethode implementieren, in der Sie den neuen Wert übergeben können (oder einfach eine öffentliche Methode zu Ihrem Adapter hinzufügen). Übergeben Sie dann die Schnittstelle (oder den Adapter) an jede Ansicht, und wenn Sie den Wert ändern, können Sie die Callback-Methode aufrufen und den neuen Wert übergeben. In Ihrem Adapter, wo Sie diese Methode implementiert haben, können Sie Ihre Sammlung durchlaufen und den neuen Wert durch eine Setter-Methode festlegen.

public class MyAdapter extends BaseAdapter implements OnValueChanged { 
ArrayList<ListItem> listItems = new ArrayList<>(); 

public MyAdapter() { 
    super(); 
} 

@Override 
public int getCount() { 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    return null; 
} 

@Override 
public void onValueChanged(int newValue) { 
    for (ListItem listItem : listItems) listItem.setValue(newValue); 
} 

class ListItem extends View implements View.OnClickListener { 
    private int value; 
    private OnValueChanged onValueChanged; 

    public ListItem(Context context, OnValueChanged onValueChanged) { 
     super(context); 
     this.onValueChanged = onValueChanged; 
     setOnClickListener(this); 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 

    @Override 
    public void onClick(View v) { 
     int newValue = 1; 
     onValueChanged.onValueChanged(newValue); 
    } 
} 

}

interface OnValueChanged { 
void onValueChanged(int newValue); 

}

Verwandte Themen