Щракване върху бутона за елементи в Listview

Използване на Lisview на Android. Всеки елемент от Listview има button и искам да отворя activity, когато щракна върху всяко button.

Моят код е такъв, работи, но мисля, че има по-добър начин да направите това.

  public class Resul extends Fragment{



    ImageView vi;
    @Override


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View v= inflater.inflate(R.layout.resul, container, false);
            listview = (ListView) v.findViewById(R.id.lista_resultados_liga);

 new DownloadJSON().execute();
             listview.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

                        estado = ((TextView) view.findViewById(R.id.estado))
                                .getText().toString();
                        jor = ((TextView) view.findViewById(R.id.jor))
                                .getText().toString();
                        vi = ((ImageView) view.findViewById(R.id.imageView1));



                            vi.setOnClickListener(new View.OnClickListener() {
                                 @Override
                                    public void onClick(View v) {

                                     Intent in = new Intent(getActivity(),
                                          Videos.class);
                                    in.putExtra("id_video", resumen_id);
                                    startActivity(in);

                                    }
                                });

                    }


             }
             });


            return v;
        }


    // DownloadJSON AsyncTask
                private class DownloadJSON extends AsyncTask<Void, Void, Void> {

                    @Override
                    protected void onPreExecute() {
                        //code
                    }

                    @Override
                    protected Void doInBackground(Void... params) {
                        //code
                    }

                    @Override
                    protected void onPostExecute(Void args) {
                        // Locate the listview in listview_main.xml
                        listview = (ListView) getActivity().findViewById(R.id.mylist);
                        // Pass the results into ListViewAdapter.java
                        adapter = new LazyAdapterResul(getActivity(), arraylist);
                        // Set the adapter to the ListView
                        listview.setAdapter(adapter);
                        // Close the progressdialog
                        mProgressDialog.dismiss();
                    }
                }





    }

Кодът на моя адаптер, искам това, когато щракна, за да се отвори изображението:

public class LazyAdapterResul extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    ImageLoader imageLoader;
    HashMap<String, String> resultp = new HashMap<String, String>();

    public LazyAdapterResultadosLiga(Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        imageLoader = new ImageLoader(context);
    }

    @Override
    public int getCount() {
        return data.size();
    }

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

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

     public interface MyItemClickListener {
            void onItemClick(View view, int position);
        }

        private MyItemClickListener mItemClickListener;

        public void setMyItemClickListener(MyItemClickListener listener) {
            this.mItemClickListener = listener;
        }

    public View getView(final int position, View convertView, ViewGroup parent) {
        // Declare Variables

        TextView equipo_local, equipo_visitante, estado_video;


        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.list_row, parent, false);
        // Get the position
        resultp = data.get(position);

        // Locate the TextViews in listview_item.xml

        jor= (TextView) itemView.findViewById(R.id.jornada);
        estado= (TextView) itemView.findViewById(R.id.estado);
        vi = (ImageView) itemView.findViewById(R.id.imageView1);


        estado.setText(resultp.get(Resul.TAG_ESTADO));
        jor.setText(resultp.get(Resul.TAG_JOR));



        vi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mItemClickListener != null) {
                    mItemClickListener.onItemClick(view, position);
                }
            }

        });



        return itemView;
    }


}

person Elena    schedule 15.01.2015    source източник
comment
Напишете своя onclick код в адаптера за изглед на списък ..   -  person duggu    schedule 15.01.2015
comment
Но мога ли да отворя активност от адаптер за изглед на списък? как? Намерение в = ново намерение(getActivity(), MyOtherActivity.class); startActivity(in);   -  person Elena    schedule 15.01.2015
comment
@Elena use Intent in = new Intent(getContext(), MyOtherActivity.class); startActivity(in);   -  person null pointer    schedule 15.01.2015
comment
По-добре е да направите персонализиран ListView и да направите отделен персонализиран клас адаптер за него   -  person Bhavik Mehta    schedule 15.01.2015
comment
да, използвайте персонализиран адаптер за друг тип внедряване stackoverflow.com/ въпроси/8166497/   -  person Kamran Majeed    schedule 15.01.2015
comment
казва, че getContext() за типа new View.OnClickListener() е недефиниран на моя адаптер   -  person Elena    schedule 15.01.2015
comment
getContext() е метод на адаптера. Вътре в анонимен OnClickListener клас ще трябва да използвате MyAdapter.this.getContext(), където MyAdapter е името на вашия адаптерен клас.   -  person David Wasser    schedule 15.01.2015
comment
и как е този метод? казва, че методът getContext() е недефиниран за типа на моя адаптер   -  person Elena    schedule 15.01.2015


Отговори (1)


Опитайте с интерфейс във вашия адаптер като този:

public class ListViewAdapter{    
    public interface MyItemClickListener {
        void onItemClick(View view, int position);
    }

    private MyItemClickListener mItemClickListener;

    public void setMyItemClickListener(MyItemClickListener listener) {
        this.mItemClickListener = listener;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Find your image view and add clicklistener

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view, int position) {
                if (mItemClickListener != null) {
                    mItemClickListener.onItemClick(view, position);
                }
            }
        });
        return convertView;
    }
}

И сега можете да зададете своя clicklistener във вашата дейност по следния начин:

// Pass the results into ListViewAdapter.java
adapter = new LazyAdapterResultadosLiga(getActivity(), arraylist);
// add click listener
adapter.setMyItemClickListener(new MyItemClickListener(){
            @Override
            public void onItemClick(View view, int position) {
                Intent in = new Intent(getActivity(), MyOtherActivity.class);
                startActivity(in);
            }
});
// Set the adapter to the ListView
listview.setAdapter(adapter);
person Mann    schedule 15.01.2015
comment
Работи, но ако искам да предам на тази нова дейност estado като този in.putExtra(estado, estado); как да го получа от елемент от списъка? Много благодаря - person Elena; 16.01.2015
comment
Това е готиното нещо. Имате позицията в моя onItemClick-метод. Можете да работите с него или да намерите някои изгледи с изгледа (елемент), който се предава от метода. Отговаря ли на въпроса ви? Тогава, моля, маркирайте го и ми покажете някаква репутация, защото това е много по-чиста версия от вашата;) - person Mann; 16.01.2015
comment
Трябва ми без позицията, трябва да спася стойността на estado на този артикул. Как мога да намеря някои изгледи с изгледа (артикул), това не разбирам, съжалявам и много благодаря - person Elena; 16.01.2015
comment
Направих така, но не работи estado = ((TextView) view.findViewById(R.id.estado)) .getText().toString(); in.putExtra(estado, estado); - person Elena; 16.01.2015
comment
Направете в метода onItemClick нещо подобно, за да получите вашата справка: estado = view.findViewById(R.id.estado) - person Mann; 16.01.2015
comment
Какво се случи? Имате ли изход? - person Mann; 16.01.2015
comment
NullPointerException at estado = ((TextView) view.findViewById(R.id.estado)) .getText().toString(); Правя го в Activity не в адаптер, така ли е, не? - person Elena; 16.01.2015
comment
Добре, открих нашия проблем. Предаваме imageview vi на метода onItemClick. Опитайте се да зададете clicklistener на itemView вместо това, ако imageview vi - person Mann; 16.01.2015
comment
Или променете mItemClickListener.onItemClick(view, position); към mItemClickListener.onItemClick(itemView, позиция); във вашия адаптер - person Mann; 16.01.2015
comment
Благодаря ви много за търпението, вие сте машина, толкова сте благодарни - person Elena; 16.01.2015