2012-04-09 8 views
11

Ich habe eine Android-Anwendung mit einem ListView darin, der ListView wird gut eingerichtet, aber jetzt möchte ich ein Bild in der ListView anklickbar sein. Dazu verwende ich 2 Klassen, die Aktivitätsklasse (Eltern) und einen ArrayAdapter, um die Liste zu füllen. Im ArrayAdapter implementiere ich einen OnClickListener für das Bild in der Liste, auf die ich klicken möchte.Wie man OnClick in den ListView-Adapter-Anruf eingibt Aktivitätsfunktion

Bis jetzt funktioniert alles.

Aber jetzt möchte ich eine Funktion aus der Aktivitätsklasse ausführen, wenn der onClick, für das Bild in der Liste, ausgeführt wird, aber ich weiß nicht wie. Im Folgenden sind die 2 Klassen, die ich verwende.

Zuerst wird die Aktivitätsklasse:

public class parent_class extends Activity implements OnClickListener, OnItemClickListener 
{ 
    child_class_list myList; 
    ListView myListView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // setup the Homelist data 
     myList  = new child_class_list (this, Group_Names, Group_Dates); 
     myListView = (ListView) findViewById(R.id.list); 

     // set the HomeList 
     myListView.setAdapter(myList); 
     myListView.setOnItemClickListener(this); 
    } 

    void function_to_run() 
    { 
     // I want to run this function from the LiscView Onclick 
    } 

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
    { 
     // do something 
    } 
} 

Und die ArrayAdapter aus, wo ich will eine Funktion aus der Aktivitätsklasse nennen:

public class child_class_list extends ArrayAdapter<String> 
{ 
    // private 
    private final Context context; 
    private String[]  mName; 
    private String[]  mDate; 

    public child_class_list (Context context, String[] Name, String[] Date) 
    { 
     super(context, R.layout.l_home, GroupName); 
     this.context  = context; 
     this.mName  = Name; 
     this.mDate = Date; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.l_home, parent, false); 

     ImageView selectable_image = (ImageView) rowView.findViewById(R.id.l_selectable_image); 
     selectable_image.setOnClickListener(new OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       // I want to run the function_to_run() function from the parant class here 
      } 
     } 
     ); 

     // get the textID's 
     TextView tvName = (TextView) rowView.findViewById(R.id.l_name); 
     TextView tvDate = (TextView) rowView.findViewById(R.id.l_date); 

     // set the text 
     tvName.setText  (mName[position]); 
     tvDate.setText (mDate[position]); 

     return rowView; 
    } 
} 

Wenn jemand weiß, wie die Funktion in der Aktivität laufen Klasse aus dem Arrayadapter oder wie man das Bild onClickListener in der Activity Class einstellt, würde ich die Hilfe erheblich verbessern.

Antwort

44

Innen onClick() etwas tun:

((ParentClass) context).functionToRun(); 
+0

Großartig. Einfach und effektiv. –

8

Nur für Klarheit über die Antworten In einem BaseAdapter erweitern Sie die übergeordnete Klasse durch den Aufruf this.getActivity(); bekommen Wenn Sie dann diese an die tatsächliche Aktivitätsklasse typisieren Sie kann dann eine Funktion aufrufen wie pro @AdilSoomro unten zu beantworten, so dass Sie tatsächlich mit so etwas wie dieses

public class MyAdapter extends BaseAdapter<Long> { 
    public MyAdapter(Activity activity, 
      TreeStateManager<Long> treeStateManager, int numberOfLevels) { 
     super(activity, treeStateManager, numberOfLevels); 
    } 

    @Override 
    public void handleItemClick(final View view, final Object id) { 
     ((MyActivity) this.activity).someFunction(); 
    } 
} 

dann einfach erklären in somefunction MyActivity am Ende zu tun, was Sie w ant

protected void someFunction(){ 
// Do something here 
    }