Android ListView и Event Bubbling - PullRequest
       0

Android ListView и Event Bubbling

1 голос
/ 02 августа 2011

У меня есть приложение для Android с ListView.Я создал свой собственный макет элемента, который имеет CheckBox, за которым следуют два TextView и кнопка:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dip"></CheckBox>
    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:layout_alignParentRight="true" android:text="Button"></Button>
        <TextView android:id="@+id/textView1" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="TextView" android:layout_toLeftOf="@+id/button1" android:layout_alignTop="@+id/button1" android:layout_width="match_parent"></TextView>
        <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="TextView" android:layout_below="@+id/textView1" android:layout_alignLeft="@+id/textView1" android:layout_alignRight="@+id/textView1"></TextView>
    </RelativeLayout>
</LinearLayout>

Когда пользователь нажимает на строку, я хочу различного поведения в зависимости от того, нажали ли они на CheckBoxКнопка или сама строка (т. е. что-либо, кроме CheckBox или Button).Вот что я пытался реализовать до сих пор (используя setOnItemClickListener):

package com.camelconsultants.shoplist;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class HelloAndroid extends ListActivity implements OnItemClickListener
    {
        ArrayList<HashMap<String, String>> Items = new ArrayList<HashMap<String, String>>();

        /** Called when the activity is first created. */
        @Override public void onCreate(Bundle savedInstanceState) 
            {
                super.onCreate( savedInstanceState );

                GetData();

                setListAdapter
                    ( 
                        new SimpleAdapter
                            (
                                this.getBaseContext(),
                                Items,
                                R.layout.multiitem,
                                new String[]{ "Code", "Description" },
                                new int[]{ R.id.textView1, R.id.textView2 }
                            ) 
                    );

                ListView lv = getListView();
                lv.setTextFilterEnabled( true );

                lv.setOnItemClickListener( this );
            }

        public void onItemClick( AdapterView<?> parent, View view, int position, long id )
            {
                Toast.makeText
                    (
                        getApplicationContext(), 
                        parent.getItemAtPosition(position).toString(),
                        Toast.LENGTH_SHORT 
                    ).show();
            }

        void GetData()
            {
                HashMap<String, String> Item;

                try
                    {
                        JSONObject JsonObject = new JSONObject( this.getResources().getString(R.string.Json) );
                        JSONArray JsonArray = JsonObject.getJSONArray( "Items" );

                        for ( int i = 0; i < JsonArray.length(); i++ ) 
                            {
                                Item = new HashMap<String, String>();
                                Item.put( "Code", JsonArray.getJSONObject(i).getString("Code") );
                                Item.put( "Description", JsonArray.getJSONObject(i).getString("Description") );

                                Items.add( Item );
                            }
                    }
                catch( JSONException Bummer )
                    {
                        Bummer.printStackTrace();
                    }
            }
    }

Когда я запускаю приложение и нажимаю на один из TextViews, ничего не происходит!подойти к этому?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Я обнаружил, что могу установить обратный вызов для представления в определении xml. Вот обновленный XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/linearLayout1" android:clickable="true" android:onClick="onClick" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dip" android:onClick="onCheckBoxClick"></CheckBox>
    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:layout_alignParentRight="true" android:text="Button" android:onClick="onButtonClick"></Button>
        <TextView android:id="@+id/textView1" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="TextView" android:layout_toLeftOf="@+id/button1" android:layout_alignTop="@+id/button1" android:layout_width="match_parent"></TextView>
        <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="TextView" android:layout_below="@+id/textView1" android:layout_alignLeft="@+id/textView1" android:layout_alignRight="@+id/textView1"></TextView>
    </RelativeLayout>
</LinearLayout>

Я обновил код с помощью соответствующих перехватчиков обратного вызова:

package com.camelconsultants.shoplist;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class HelloAndroid extends ListActivity
    {
        ArrayList<HashMap<String, String>> Items = new ArrayList<HashMap<String, String>>();

        /** Called when the activity is first created. */
        @Override public void onCreate(Bundle savedInstanceState) 
            {
                super.onCreate( savedInstanceState );

                GetData();

                setListAdapter
                    ( 
                        new SimpleAdapter
                            (
                                this.getBaseContext(),
                                Items,
                                R.layout.multiitem,
                                new String[]{ "Code", "Description" },
                                new int[]{ R.id.textView1, R.id.textView2 }
                            ) 
                    );

                ListView lv = getListView();
                lv.setTextFilterEnabled( true );
            }

        @SuppressWarnings("unchecked") 
        private HashMap<String, String> getItem( View view )
            {
                HashMap<String, String> Item = null;

                ListView listView = getListView();

                int Position = listView.getPositionForView( view );

                if ( listView.getItemAtPosition(Position) instanceof HashMap )
                    Item = (HashMap<String, String>)listView.getItemAtPosition( Position );

                return Item;
            }

        public void onClick( View view )
            {
                HashMap<String, String> Item = getItem( view );
                if ( Item == null )
                    return;

                Toast.makeText
                    (
                        getApplicationContext(), 
                        Item.get("Code") + ", " + Item.get( "Description" ),
                        Toast.LENGTH_SHORT 
                    ).show();
            }

        public void onCheckBoxClick( View view )
            {
                HashMap<String, String> Item = getItem( view );
                if ( Item == null )
                    return;

                Toast.makeText
                    (
                        getApplicationContext(), 
                        "CheckBox! - " + Item.get("Code") + ", " + Item.get( "Description" ),
                        Toast.LENGTH_SHORT 
                    ).show();
            }

        public void onButtonClick( View view )
            {
                HashMap<String, String> Item = getItem( view );
                if ( Item == null )
                    return;

                Toast.makeText
                    (
                        getApplicationContext(), 
                        "Button! - " + Item.get("Code") + ", " + Item.get( "Description" ),
                        Toast.LENGTH_SHORT 
                    ).show();
            }

        void GetData()
            {
                HashMap<String, String> Item;

                try
                    {
                        JSONObject JsonObject = new JSONObject( this.getResources().getString(R.string.Json) );
                        JSONArray JsonArray = JsonObject.getJSONArray( "Items" );

                        for ( int i = 0; i < JsonArray.length(); i++ ) 
                            {
                                Item = new HashMap<String, String>();
                                Item.put( "Code", JsonArray.getJSONObject(i).getString("Code") );
                                Item.put( "Description", JsonArray.getJSONObject(i).getString("Description") );

                                Items.add( Item );
                            }
                    }
                catch( JSONException Bummer )
                    {
                        Bummer.printStackTrace();
                    }
            }
    }

Функция getItem возвращает HashMap для текущего элемента, передавая View до getItemAtPosition. Круто в этом то, что не имеет значения, является ли представление вложенным или нет.

Однако я предполагаю, что создание собственного адаптера и использование метода setTag более эффективно. Но пока приведенный выше код подходит для моих целей!

1 голос
/ 02 августа 2011

Эта ссылка , кажется, имеет некоторую информацию, связанную с этим.

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