О фокусируемости с ListView и LinearLayout в строке списка - PullRequest
1 голос
/ 25 марта 2012

Вопрос в том, как мне удается поместить слушателя в элементы внутри LinearLayout, сам по себе ListView из LinearLayout.

Конкретно, у меня есть ListView, ссписок LinearLayout в нем, и каждый содержит Button и TextView.Я просто хочу знать, нажимает ли пользователь на Button или TextView и в какой строке.

Я не особо ищу код, но пока у меня есть OnItemListenerна моем ListView, и когда я нажимаю, он возвращает LinearLayout, а не компоненты в.

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вы должны объявить собственный Адаптер, чтобы сделать это.

Этот урок очень мне помог: http://www.vogella.de/articles/AndroidListView/article.html#listview_adaptermodel

Вот фрагмент из одного из моих проектов.При нажатии он чередует два изображения внутри ImageView.

 private class EventsAdapter extends ArrayAdapter<Eveniment> {

        private ArrayList<Eveniment> items;

        ...

        public OnClickListener goingClickListener2= new OnClickListener() {
            public void onClick(View v) {
                ((ImageView)v).setImageResource(R.drawable.going1);
                v.setOnClickListener(goingClickListener);
            }
        };
        public OnClickListener goingClickListener = new OnClickListener() {

            public void onClick(View v) {
                ((ImageView)v).setImageResource(R.drawable.going2);
                v.setOnClickListener(goingClickListener2);
            }
        };

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.listitemlayout, null);

                }
                if (items==null) return v;

                Eveniment ev = items.get(position);
                if (ev != null) { //init for each listItem
                        TextView tv_Titlu = (TextView) v.findViewById(R.id.tv_Titlu);
                        TextView tv_eventBody = (TextView)v.findViewById(R.id.tv_eventBody);
                        ImageView iv_EventPic = (ImageView)v.findViewById(R.id.iv_eventPic);
                        ImageView iv_going = (ImageView)v.findViewById(R.id.iv_going);

                        iv_going.setOnClickListener(goingClickListener);//setting the onClickListener

                        tv_Titlu.setText(ev.getEvent());

                        ... //other initialization for each view in my layout
                }
                return v;
        }

В приведенном выше примере getView () вызывается для каждого listItem.Я получаю доступ к своему ImageVeiw, вызывая findViewById () для представления v (RelativeLayout внутри каждого listItem)

2 голосов
/ 25 марта 2012

Вам потребуется реализовать собственный адаптер и вручную настроить слушателей для этих представлений (Button и TextView) в методе getView().Чтобы найти строку, в которой щелкнули Button или TextView, вы можете сначала установить в качестве тега позицию (параметр, который вы получаете в методе getView()), а затем в слушателе выяснить, с какой строкой вы имеете дело.с на основе тега представления.Метод onItemClick скажет вам только то, что строка была нажата в списке.

Вот пример кода с пользовательским адаптером:

class CustomCursorAdapter extends CursorAdapter {

    private LayoutInflater mInflater;
    private Context ctx;

    public CustomCursorAdapter(Context context, Cursor c,
            boolean autoRequery) {
        super(context, c, autoRequery);
        mInflater = LayoutInflater.from(context);
        ctx = context;
    }

    @Override
    public void bindView(View view, final Context context, Cursor cursor) {
        ViewHolder holder = (ViewHolder) view.getTag();
        String txt = cursor.getString(cursor.getColumnIndex("name"));
        holder.text.setText(txt);
        holder.button.setText(txt);
        int currentPosition = cursor.getPosition();
        holder.text.setTag(new Integer(currentPosition));
        holder.button.setTag(new Integer(currentPosition));

        OnClickListener listener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                int thePosition = (Integer) v.getTag();
                if (v.getId() == R.id.button1) {
                    Toast.makeText(ctx,
                            "You clicked the Button from the row "
                                    + thePosition + "!", Toast.LENGTH_SHORT).show();
                } else if (v.getId() == R.id.textView1) {
                    Toast.makeText(ctx,
                            "You clicked the TextView from the row "
                                    + thePosition + "!", Toast.LENGTH_SHORT).show();
                }               
            }
        };
        holder.text.setOnClickListener(listener);
        holder.button.setOnClickListener(listener);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View v = mInflater.inflate(R.layout.adapters_cursor_adapter_clicks,
                null);
        ViewHolder holder = new ViewHolder();
        holder.text = (TextView) v.findViewById(R.id.textView1);
        holder.button = (Button) v.findViewById(R.id.button1);
        v.setTag(holder);
        return v;
    }

    class ViewHolder {
        TextView text;
        Button button;
    }

}

Я использовалодин OnClickListener для обоих представлений, вы можете использовать 2 слушателя, по одному для каждого представления, следуя тому же принципу.Полный файл макета класса + можно найти здесь: http://pastebin.com/uM0mb4mqgist , доступным здесь: git: //gist.github.com/2625797.git)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...