Реализация навигации “Развертки” в приложении для Android UI

C-код для расчета всех сумм и хранения сумм с индексами внутри массива структур. Затем мы сортируем структуры и печатаем смежные элементы структуры с одинаковой суммой.

#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <assert.h>

// for debugging
#define debug(...)  ((void)0) // printf(__VA_ARGS__)

// two indexes and a sum
struct is_s {
    // one index inside the array
    size_t i;
    // the other index also inside the array
    size_t j;
    // no idea, must be random
    int sum;
};

// used for qsoring the struct is_s
static int is_qsort_compare_sum(const void *a0, const void *b0) {
    const struct is_s * const a = a0;
    const struct is_s * const b = b0;
    return a->sum - b->sum;
}

int unique_pairs(const size_t len, const int arr[len]) {
    if (len <= 1) return 0;
    // The number of unsorted combinations must be n!/(2!*(n-2)!)
    const size_t islen = len * (len - 1) / 2; // @MOehm
    debug("%zu\n", islen);

    struct is_s * const is = malloc(islen * sizeof(*is));
    if (is == NULL) {
        return -ENOMEM;
    }

    size_t isidx = 0;
    for (size_t i = 0; i < len; ++i) {
        for (size_t j = i + 1; j < len; ++j) {
            assert(isidx < islen); // just for safety
            struct is_s * const p = &is[isidx++];
            p->i = i;
            p->j = j;
            p->sum = arr[i] + arr[j];
            debug("[%zu]=[%zu]=%d [%zu]=%d %d\n", isidx, p->i, arr[p->i], p->j, arr[p->j], p->sum);
        }
    }

    qsort(is, islen, sizeof(*is), is_qsort_compare_sum);

    for (size_t i = 0; i < islen - 1; ++i) {
        debug("([%zu]=%d,[%zu]=%d)%d = ([%zu]=%d,[%zu]=%d)%d\n", 
            is[i].i, arr[is[i].i], is[i].j, arr[is[i].j], is[i].sum,
            is[i+1].i, arr[is[i+1].i], is[i+1].j, arr[is[i+1].j], is[i+1].sum
        );
        if (is[i].sum == is[i + 1].sum) {
            printf("(%d,%d),(%d,%d) = %d\n",
                arr[is[i].i], arr[is[i].j],
                arr[is[i+1].i], arr[is[i+1].j], is[i].sum);
        }
    }

    free(is);

    return 0;
}

int main(void) {
    const int arr[] = {6,4,12,10,22,54,32,42,21,11};
    return unique_pairs(sizeof(arr)/sizeof(*arr), arr);
}

Результат, который я получаю:

(6,10),(4,12) = 16
(10,22),(21,11) = 32
(12,21),(22,11) = 33
(22,21),(32,11) = 43
(32,21),(42,11) = 53
(12,42),(22,32) = 54
(10,54),(22,42) = 64

Поскольку я задаюсь вопросом, правильно ли это, как заметил @Bathsheba, я думаю, что худший случай - O (n * n).

17
задан JasonMArcher 5 November 2014 в 00:47
поделиться

3 ответа

Так, на iphone, когда вы говорите «развернуть», я думаю, вы имеете в виду, когда пользователь подправляет строку списка, и он перемещает новый вид справа, в большинстве случаев он имеет навигационную панель сверху дать пользователю возможность вернуться назад?

То, как android справляется с этим, просто запускает новое действие. Таким образом, при щелчке по listItem у вас будет ListActivity для «Книг», вы будете определять новое намерение, которое будет запускать ListActivity «Глав» и так далее. Навигационная панель в верхней части iphone не является стандартным пользовательским интерфейсом в Android, так как большинство людей видит выделенную клавишу «назад» как способ вернуться на экран предварительного просмотра.

Вот как вы начинаете намерение, если вы его еще не видели:

Intent chaptersIntent = new Intent(this, Chapters.class);
this.startActivity(chaptersIntent);

Эта статья заслуживает быстрого прочтения, так как в ней прекрасно объясняются действия

http://d.android.com/guide/topics/fundamentals.html

Также взгляните на версию TableView для Android - ListView:

http://d.android.com/reference/android/widget/ListView.html

и ListActivity:

http://d.android. com / reference / android / app / ListActivity.html


РЕДАКТИРОВАТЬ :: Пример кода Я хотел бы сделать что-то вроде этого

public class Books extends ListActivity {

private String[] mBooks = new String[]{ "Book1", "Book2", "Book3", "Book4" };

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

    ArrayAdapter<String> booksAdapter = new ArrayAdapter<String>(this, 
            android.R.layout.simple_list_item_1, 
            android.R.id.text1, 
            mBooks);

    this.setListAdapter(booksAdapter);

}

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

    Intent mViewChaptersIntent = new Intent(this, Chapters.class);
    mViewChaptersIntent.putExtra("BookName", mBooks[position]);
    startActivity(mViewChaptersIntent);
}

}

Таким образом, вы проходите через идентификатор книги в качестве дополнения к Намерению, то в разделе «Действия в главах» вы получаете это дополнение в методе onCreate:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Bundle extras = getIntent().getExtras();
    if(extras != null) {
        String bookId = extras.getString("BookName");
    }
}

Наконец, убедитесь, что все новые действия добавлены в ваш файл AndroidManifest.xml:

<activity android:name=".YourClassName"
  android:label="@string/activity_name"
  >
</activity>

Надеюсь, что помогает

26
ответ дан 30 November 2019 в 12:43
поделиться

Как уже указывалось XML-способ создания макетов является наиболее предпочтительным.

В основном, кто-то касается ячейки в таблице, которая сверлит до другой таблицы. когда они касаются ячейки на этой таблице, она превращается в веб-просмотр, который отображает информацию.

Из того, что я понял из термина «детализация», это может быть следствием того, что вам нужно

http://developer.android.com/guide/topics/ui/ui-events .html

Из официальных документов

Прослушиватель событий - это интерфейс в классе View, содержащий единственный метод обратного вызова. Эти методы будут вызываться платформой Android, когда представление, для которого зарегистрирован прослушиватель, запускается при взаимодействии пользователя с элементом в пользовательском интерфейсе.

1
ответ дан 30 November 2019 в 12:43
поделиться

Основной способ создания пользовательского интерфейса Android - использование xml. Я не совсем уверен, что вы имеете в виду, когда говорите «развернуть», но если вы хотите, чтобы он изменил представления, это так же просто, как сделать один набор элементов xml видимым, а другой - нет. Посетите страницы для разработчиков для получения дополнительной помощи.

http://developer.android.com/guide/topics/ui/index.html

Забыл упомянуть, что это тоже очень хороший ресурс для начинающих. http://mobiforge.com/designing/story/understanding-user-interface-android-part-1-layouts

2
ответ дан 30 November 2019 в 12:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: