Установите OnClickListener для элементов в ListView с 2 представлениями - PullRequest
8 голосов
/ 01 июня 2011

У меня есть ListView, с элементами этого макета:

<LinearLayout ...>            
    <LinearLayout ...>
       <!--Elements -->
    </LinearLayout>

    <LinearLayout ...>
       <!--Elements -->
    </LinearLayout>            
</LinearLayout>

Итак, мои вещи имеют два разных раздела. Я хочу иметь возможность настроить разные onclickListener внутри каждого элемента (по одному для каждого LinearLayout). До сих пор я пытался переопределить onListItemClick, но, похоже, он не работает должным образом:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id);

    ViewGroup vg = (ViewGroup)v;
    vg.getChildAt(0).setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
            Toast.makeText(mCtx, "element1", Toast.LENGTH_SHORT).show();                
        }
    });
    vg.getChildAt(1).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(mCtx, "element2", Toast.LENGTH_SHORT).show();                
        }
    });

}

Есть идеи, как решить проблему?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 01 июня 2011

Вы должны использовать set onclicklistener для всех элементов внутри ListView. Я создал список. установить адаптер на просмотр списка. Мой адаптер отвечает за отображение каждого элемента списка. поэтому внутри getView() я назначу onclicklistener всем элементам, которым я хочу получить событие click.

Пример

public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        ViewHolder holder;
        if(convertView==null){
            vi = inflater.inflate(R.layout.item, null);
            holder=new ViewHolder();
            holder.text=(TextView)vi.findViewById(R.id.text);;
            holder.image=(ImageView)vi.findViewById(R.id.image);
            vi.setTag(holder);
        }
        else
            holder=(ViewHolder)vi.getTag();

        holder.text.setText("item "+position);
        holder.image.setTag(data.get(position));
        holder.image.setOnClickListener(this);
        holder.text.setOnClickListener(this);
        imageLoader.DisplayImage(data.get(position), activity, holder.image);
        return vi;
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        System.out.println("...clicked view is...."+arg0);
    }

Спасибо Дипак

1 голос
/ 01 июня 2011

Вам не нужен OnClickListener для каждого элемента списка, но вам нужно найти каждый просмотр списка, например, в вашей деятельности OnCreate

listView1 = (ListView) this.findViewById(R.id.ListView1);
listView2 = (ListView) this.findViewById(R.id.ListView2);

тогда ваш onListItemClick становится -

@Override
protected void onListItemClick(ListView l, View v, int position, long id) { 
super.onListItemClick(l, v, position, id);

if (l.equals(listView1))
{
    switch (position)
    {
       case 0:
         Toast.makeText(mCtx, "list1-element1", Toast.LENGTH_SHORT).show();
         break;
       case 1:
         Toast.makeText(mCtx, "list1-element2", Toast.LENGTH_SHORT).show();
         break;
    }
}
else
{
    switch (position)
    {
       case 0:
         Toast.makeText(mCtx, "list2-element1", Toast.LENGTH_SHORT).show();
         break;
       case 1:
         Toast.makeText(mCtx, "list2-element2", Toast.LENGTH_SHORT).show();
         break;
    }
}


}

Если я не понял, что вы пытаетесь сделать.

0 голосов
/ 08 ноября 2013

Я мог бы что-то упустить здесь, но не идеальная версия, чтобы идти с настройкой:

aListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

А затем реализовать:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.d(LOG_TAG, "List view click: " + getListView().getCheckedItemCount());
    Toast.makeText(this,
            String.valueOf(getListView().getCheckedItemCount()),
            Toast.LENGTH_LONG).show();
    return true;
} 

Вышеуказанные решения были доступныначиная с уровня API 1

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