Clickable ListView - PullRequest
       13

Clickable ListView

0 голосов
/ 02 января 2011

Сейчас я несколько дней ищу решение для интерактивных элементов в listView.

Сначала я наткнулся на это: developer.android.com / resources / Articles / touch-mode.html и обнаружил, что он не имеет "нормального" поведения onListItemClick ().

Затем я наткнулся на этот код : http://www.androidsnippets.org/snippets/125/

// LINE 296-321

    @Override  
    protected ViewHolder createHolder(View v) {  
        // createHolder will be called only as long, as the ListView is not filled  
        // entirely. That is, where we gain our performance:  
        // We use the relatively costly findViewById() methods and  
        // bind the view's reference to the holder objects.  
        TextView text = (TextView) v.findViewById(R.id.listitem_text);  
        ImageView icon = (ImageView) v.findViewById(R.id.listitem_icon);  
        ViewHolder mvh = new MyViewHolder(text, icon);  

        // Additionally, we make some icons clickable  
        // Mind, that item becomes clickable, when adding a click listener (see API)  
        // so, it is not necessary to use the android:clickable attribute in XML  
        icon.setOnClickListener(new ClickableListAdapter.OnClickListener(mvh) {  

            public void onClick(View v, ViewHolder viewHolder) {  
                // we toggle the enabled state and also switch the icon  
                MyViewHolder mvh = (MyViewHolder) viewHolder;  
                MyData mo = (MyData) mvh.data;  
                mo.enable = !mo.enable; // toggle  
                ImageView icon = (ImageView) v;  
                icon.setImageBitmap(  
                        mo.enable ? ClickableListItemActivity.this.mIconEnabled  
                                : ClickableListItemActivity.this.mIconDisabled);  
            }  
        });  

Во время отладки я заметил, что параметр View v является TextView , а не "нормальным" представлением, а затем, конечно:

TextView text = (TextView) v.findViewById(R.id.listitem_text);

возвращает null и я получаю исключение NullPointerException ...

Есть идеи почему?И как мне это решить?

Заранее спасибо!:)

Ответы [ 2 ]

1 голос
/ 02 января 2011

Как вы создаете свой экземпляр ClickableListAdapter?

Когда вы создаете свой адаптер списка, вы должны передать идентификатор ресурса viewId, это должно быть layout, которое будет завышено позже.

public ClickableListAdapter(Context context, int viewid, List objects) {  

        // Cache the LayoutInflate to avoid asking for a new one each time.  
        mInflater = LayoutInflater.from(context);  
        mDataObjects = objects;  
        mViewId = viewid;

Ниже код надувает макет xml, переданный конструктору, и вызывает createHolder.

view = mInflater.inflate(mViewId, null);  
// call the user's implementation  
holder = createHolder(view); 

Поэтому убедитесь, что при создании экземпляра ClickableListAdapter вы передаете layout вместо id

Редактировать Вы должны создать макет xml со следующим, взятым из предоставленной вами ссылки:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:layout_width="fill_parent"  
  android:layout_height="wrap_content"  
  android:orientation="horizontal"  
  android:gravity="center_vertical"  
  >  

<TextView android:text="Text" android:id="@+id/listitem_text"  
            android:layout_weight="1"   
            android:layout_width="fill_parent"   
            android:layout_height="wrap_content"  
            ></TextView>  
<ImageView android:id="@+id/listitem_icon"  
            android:src="@drawable/globe2_32x32"  
            android:layout_width="wrap_content"   
            android:layout_height="wrap_content"  
            android:maxWidth="32px"  
            android:maxHeight="32px"  
            >  
</ImageView>  
</LinearLayout>

Если вы назовете его mylistrow.xml в каталоге раскладки, вы создадите свой адаптер следующим образом:

adapter = new MyClickableChannelListAdapter(this, R.layout.mylistrow, channelList); 
setListAdapter(adapter);
0 голосов
/ 02 января 2011

Элементы списка должны быть кликабельными прямо из коробки. Вы можете проверить, как списки кодируются, посмотрев код проекта ApiDemos. Он должен присутствовать на вашем локальном компьютере, поскольку он является частью SDK. У меня это в <root_sdk_folder>\platforms\android-2.0.1\samples\ApiDemos.

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