Копирование поиска Apple в Android - PullRequest
0 голосов
/ 15 сентября 2011

Я хочу создать пользовательский интерфейс, подобный показанному здесь http://appsreviews.com/wp-content/uploads/2010/08/Cures-A-Z-App-for-iPhone.jpg

Я начал с попытки поместить два пользовательских списка рядом, как в этом коде

import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;



public class Emp extends Activity {

    /** Called when the activity is first created. */

    private String tableName = DBHelper.tableName;

    private SQLiteDatabase newDB;


public static WeakHashMap<String, Empbook> temp = new WeakHashMap<String, Empbook>();

final List<Empbook> listOfEmpbook = new ArrayList<Empbook>();
final List<String> listOfAlphabets = new ArrayList<String>();
TextView txt;
EmpbookAdapter adapter = new EmpbookAdapter(this, listOfEmpbook);

Integer pos;
Integer count=0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    txt=(TextView)findViewById(R.id.textView1);
    ListView list = (ListView) findViewById(R.id.ListView01);
    ListView alist = (ListView) findViewById(R.id.ListView02);

    list.setClickable(true);
    alist.setClickable(true);
    AlphabetListAdapter alphabetadapter = new AlphabetListAdapter(this,
            listOfAlphabets);
    list.setAdapter(adapter);
            alist.setAdapter(alphabetadapter);

alphabetadapter для списка, отображающего алфавиты справа на экране.Мой XML выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    <ListView android:id="@+id/ListView01" android:layout_width="280dp"
        android:orientation="vertical" android:layout_height="wrap_content"></ListView>
    <ListView android:id="@+id/ListView02" android:layout_width="wrap_content"
        android:orientation="vertical" android:paddingLeft="282dp"
        android:layout_height="wrap_content"></ListView>
</LinearLayout>

Проблема, которая возникает, заключается в том, что одновременно отображается только одно представление (то, которое помещено ранее в приведенный выше XML, отображается, а другое просто не отображается).

Может кто-нибудь, пожалуйста, подтолкнуть меня в правильном направлении?

РЕДАКТИРОВАТЬ: я пытался установить веса списков, устанавливая один на ноль и устанавливая другой на 1, это работает частично теперь я могусм. оба списка, однако один из списков не заполняется .... будет обновляться, если я с ним разберусь.

Опубликовал ответ ниже (хотя один просмотр списка упал.) Проверьте его.

Ответы [ 6 ]

1 голос
/ 16 сентября 2011

Нашли обходной путь, теперь используйте текстовое представление и просмотр списка, вложенные в структуру кадра следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical"
        android:layout_width="fill_parent" android:layout_height="fill_parent">

        <ListView android:id="@+id/ListView01" android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:cacheColorHint="#00000000" />
        <TextView android:id="@android:id/empty"
            android:layout_width="fill_parent" android:layout_height="fill_parent"
            android:text="textview" />

    </LinearLayout>

    <LinearLayout android:orientation="vertical"
        android:background="@android:color/transparent" android:id="@+id/sideIndex"
        android:paddingLeft="280dip"
        android:layout_width="300dip" android:layout_height="fill_parent"
        android:gravity="center_horizontal">
        <TextView android:text="T" android:id="@+id/textView1"
            android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>    
    </LinearLayout>
    </FrameLayout>

Подробнее можно узнать здесь http://dotslasha.in/wp/143/creating-floating-views-in-android. Тай и ура !! :)

1 голос
/ 16 сентября 2011

Если вы хотите добавить элементы рядом друг с другом, которые вместе заполняют их родительский элемент:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
      android:id="@+id/ListView01"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="90"
      android:background="#FFFF0000"/>    
    <ListView
      android:id="@+id/ListView02"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="10"
      android:background="#FF00FF00"/>
</LinearLayout>

У вас был "wrap_parent" в качестве высоты второго элемента. Если бы он не был заполнен должным образом, у него была бы высота 0 - я изменил его, чтобы соответствовать родительскому. Я также добавил систему для использования заполнения в процентах.

Кроме того, все другие теги «fill_parent», которые я изменил на «match_parent», - не потому, что это меняет функциональность кода, а потому, что «fill_parent» не рекомендуется, поскольку как метка вводит в заблуждение.

Кроме того, я добавил фон для элементов, которые будут более полезны для отладки там, где ваша проблема.

Я также хотел бы предположить, что вы должны стремиться к действительному одному представлению (НЕ к представлению ListView, хотя я сохранил его для этого примера), которое будет располагаться над другим (так же, как у поиска Apple есть алфавит):

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"                 
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <ListView android:id="@+id/ListView01"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#FFFF0000"/>    
    <!-- Since the contents of the view don't change it seems wasteful to create this as a listview -->
    <ListView android:id="@+id/ListView02"
              android:layout_width="20dp"
              android:layout_height="match_parent"
              android:background="#FF00FF00"
              android:layout_alignParentRight="true"
              android:layout_marginRight="5dp"/>
</RelativeLayout>
1 голос
/ 15 сентября 2011

Если указатель на стороне является тем, что вы ищете, попробуйте следующее: http://hello -android.blogspot.com / 2010/11 / sideindex-for-android.html

0 голосов
/ 15 сентября 2011

Удалите текстовое представление, являющееся первым элементом (вы можете заменить его с помощью addHeaderView () или перенести этот линейный вывод на вертикальный).

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

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ListView
          android:id="@+id/ListView01"
          android:orientation="vertical"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:layout_weight="1"
        ></ListView>
        <ListView
          android:id="@+id/ListView02"
          android:orientation="vertical"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:layout_weight="0"
        ></ListView>
    </LinearLayout>

По моему опыту, вес будет работать правильно, только если ширина установлена ​​на wrap_content.

0 голосов
/ 15 сентября 2011

Во втором ListView у вас есть один большой отступ: android:paddingLeft="282dp". Я предполагаю, что вы не пишете для планшетов только в альбомной ориентации, поэтому просто удалите атрибут padding.

0 голосов
/ 15 сентября 2011

Вам не нужно реализовывать это самостоятельно, Google предоставил вам API для использования их функции поиска.

Документации по этому вопросу должно быть достаточно, чтобы получить от начала до конца. Это доступно здесь: http://developer.android.com/guide/topics/search/search-dialog.html

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