Как реализовать другое поведение, когда пользователь нажимает на разные представления в ListView? - PullRequest
1 голос
/ 18 июня 2011

Я новичок в разработке для Android, так что это своего рода основной вопрос.

Я бы хотел реализовать то же поведение, что и в приложении Контакты.У вас есть ListView с серией контактов |значки телефона.Там у вас есть одно поведение, когда вы нажимаете на имя контакта, и другое поведение, когда вы нажимаете на значок телефона.

Вот мой код.Любая помощь очень ценится.

Итак, что не так с подходом

switch (v.getId ()) {case R.id.imageButtonAction:

Класс активности

public class CompaniesActivity extends Activity  {

MyApp app;

ListView listCompanies;

Cursor cursor;

// Adapter and its corresponding FROM and TO statements. The number and sequence of the arguments must match in FROM / TO arguments.
SimpleCursorAdapter adapter;
static final String[] FROM = { MenuNavigationData.C_COMPANY, MenuNavigationData.C_DESCRIPTION};
static final int[] TO = { R.id.textCompany, R.id.textDescription }; //

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.companies);

    //Gets a reference to the application
    app = (MyApp) getApplication();

    // Find your views
    listCompanies = (ListView) findViewById(R.id.listCompanies);

    addButton = (Button) findViewById(R.id.buttonAdd);

    // Add actions to user interaction
    listCompanies.setOnItemClickListener(new OnItemClickListener() {
        @Override
        **public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {


            switch (v.getId()) {
                case R.id.imageButtonAction:
                    startActivity(new Intent(app, InstructionsActivity.class));
                    break;
                default:
                    int i = adapter.getItemViewType(position);
                    startActivity(new Intent(app, EditMenuNavigationActivity.class));
                    break;
            }**

        }
    });

}

Активность xml

<!-- Companies ListView-->
<ListView android:id="@+id/listView1" android:layout_height="wrap_content" android:layout_width="match_parent"></ListView>
<ListView 
    android:id="@+id/listCompanies"
    android:layout_height="match_parent"
    android:layout_width="match_parent" 
    android:layout_weight="1"
    android:background="#5555"/>

</LinearLayout>

Строка xml

  android:background="#ffff"
  android:padding="6dip">

<!-- Company TextView  -->
<TextView 
    android:id="@+id/textCompany"

    android:text="TIM"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"

    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"

    android:singleLine="true"
    android:ellipsize="marquee"

    android:textColor="#c000"
    android:textStyle="bold"
    android:textSize="25sp"/>

<!-- Description TextView  -->
<TextView 
    android:id="@+id/textDescription" 

    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 

    android:layout_below="@id/textCompany"
    android:layout_alignWithParentIfMissing="true"
    android:layout_alignParentLeft="true"

    android:singleLine="true"
    android:ellipsize="marquee"

    android:textColor="#c000"></TextView>

<!-- Action ImageView -->
<ImageView
    android:id="@+id/imageButtonAction"

    android:layout_height="wrap_content"
    android:layout_width="wrap_content"

    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"

    android:layout_gravity="right"
    android:background="@drawable/icon"/>

</RelativeLayout>

Ответы [ 3 ]

0 голосов
/ 29 июня 2011

Я наконец нашел решение. Это решает проблему. Но добавляет еще один. Как и ожидалось, ListView теперь ведет себя по-разному, когда пользователь нажимает на разные представления (либо TextView, либо ImageView). Но это кажется безразличным. Мне нужно «дважды щелкнуть», чтобы активировать company.setOnClick или dial.setOnClick. Есть предложения?

// Добавить действия к взаимодействию с пользователем

listCompanies.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {

            TextView company = (TextView) v.findViewById(R.id.textCompany);
            ImageView dial = (ImageView) v.findViewById(R.id.imageButtonDTMFDial);

            company.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(app, EditMenuNavigationActivity.class));
                }
            });

            dial.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(app, InstructionsActivity.class));
                }
            });
        }
0 голосов
/ 30 июня 2011

Новый, намного лучший подход для элегантного решения этой проблемы и с меньшим количеством кода !!!

Со следующими изменениями пользовательский интерфейс стал намного более отзывчивым, не более двойного щелчкапроблемы.:)

Гораздо меньше кода, который просто работает!

Изменения в строке xml

Вставить линейный макет, чтобы обернуть оба. В этом линейном макете вставить тег с именемandroid: onClick = "editCompanyClick" Это обработчик щелчка, который будет вызываться в Activity.

Вставка линейного макета для переноса. В этом линейном макете вставьте тег с именем android: onClick = "dialClick" Thisэто обработчик кликов, который будет вызываться в Activity.

Изменения в классе Activity

Удалить предыдущий код

   listCompanies.setOnItemClickListener(new OnItemClickListener() { @Override public void    onItemClick(AdapterView arg0, View v, int position, long id) {

            TextView company = (TextView) v.findViewById(R.id.textCompany);
            ImageView dial = (ImageView) v.findViewById(R.id.imageButtonDTMFDial);

            company.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(app, EditMenuNavigationActivity.class));
                }
            });

            dial.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(app, InstructionsActivity.class));
                }
            });
        }

Введите код

public void dialClick(View v) {
        startActivity(new Intent(app, InstructionsActivity.class));
    }

    public void editCompanyClick(View v) {
        startActivity(new Intent(app, EditMenuNavigationActivity.class));
record
    }

Строка xml

 <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="?android:attr/listPreferredItemHeight"

   android:padding="6dip" android:orientation="horizontal">
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:id="@+id/linearLayout1" 
        android:orientation="vertical"
        android:onClick="editCompanyClick"
        android:layout_weight="1">
        <!-- Company TextView  -->
        <TextView android:singleLine="true" android:text="TIM" android:id="@+id/textCompany" android:ellipsize="marquee" android:layout_height="wrap_content" style="@android:style/TextAppearance.Medium" android:layout_width="match_parent" android:gravity="top"></TextView>
        <!-- Description TextView  -->
        <TextView android:singleLine="true" android:text="Chamar atendente" android:id="@+id/textDescription" android:ellipsize="marquee" android:layout_height="wrap_content" style="@android:style/TextAppearance.Small" android:layout_width="match_parent" android:gravity="bottom"></TextView>
    </LinearLayout>
    <LinearLayout 
        android:layout_height="match_parent" 
        android:id="@+id/linearLayout2"
        android:onClick="dialClick" 
        android:layout_width="wrap_content" android:layout_gravity="right">
        <!-- DTMFDial ImageView -->
        <ImageView android:layout_height="wrap_content" android:background="@drawable/icon" android:id="@+id/imageButtonDTMFDial" android:layout_gravity="right" android:layout_width="wrap_content"></ImageView>
    </LinearLayout>
   </LinearLayout>
0 голосов
/ 18 июня 2011

Ваш обратный вызов onItemClick () получает как конкретное представление, так и его позицию (на основе 0), каждый из которых может помочь вам решить, какое представление было нажато.Позиция является индексом для элементов, которые вы добавили, и для более сложных сценариев вы можете просмотреть .setTag (Object o) и использовать getTag (), чтобы получить его из вашего обратного вызова.

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