Вопрос по onclick, android, custom-adapter, android-listview – Как позволить OnClick в ListView Адаптер вызывать функцию Activity

12

У меня есть приложение Android с ListView в нем, ListView будет настроен нормально, но теперь я хочу, чтобы изображение в ListView было кликабельным. Я делаю это, используя 2 класса: класс Activity (родительский) и ArrayAdapter для заполнения списка. В ArrayAdapter я реализую OnClickListener для изображения в списке, который я хочу, чтобы на него нажимали.

Пока все это работает.

Но теперь я хочу запустить функцию из класса активности, когда onClick для изображения в списке, но я не знаю как. Ниже приведены 2 класса, которые я использую.

Сначала класс Activity:

<code>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
    }
}
</code>

И ArrayAdapter, откуда я хочу вызвать функцию из класса Activity:

<code>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;
    }
}
</code>

Если кто-нибудь знает, как запустить функцию в классе активности из массива-адаптера или как установить изображение наClickListener в классе деятельности, я бы очень сильно помогла справке.

Ваш Ответ

2   ответа
8

В BaseAdapter вы можете получить родительский класс, вызвавthis.getActivity();Если вы затем приведете это к фактическому классу активности, то сможете вызвать функцию согласно ответу @AdilSoomro, приведенному ниже, так что в итоге вы получите нечто подобное

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

Затем просто объявите некоторую функцию в MyActivity, чтобы сделать то, что вы хотите

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

внутриonClick() Сделайте что-то вроде этого:

((ParentClass) context).functionToRun();
Отлично. Просто и эффективно.

Похожие вопросы