Android Xml-List с фильтром - PullRequest
       9

Android Xml-List с фильтром

1 голос
/ 14 декабря 2009

андроид для меня новый. Я пытаюсь разработать программу на платформе 1.5, но все еще в процессе, пожалуйста, направьте меня.

У меня есть информация в следующем формате

"item1","description1"
"item2","description2"
"item3","description3"
"item4","description4"
.
.
.
.

Я хочу показать их на экране, я не знаю, какой рекомендуемый способ сделать это. После гугла я нашел 2 метода. но мне не удалось успешно реализовать ни один из них.

Метод 1

Я разбиваю данные обоих столбцов на 2 разных массива, затем заполняю Возможность отображения с массивом столбца 1, включение фильтра и события clicked. Я хочу поднять предупреждение, которое должно отображать текст, нажатый в tilte & desc из 2-го массива, в виде тела сообщения в зависимости от позиции. Но есть проблема, если при использовании индекса фильтра происходит повторная инициализация :-(, и не было найдено другого способа получить текст этой строки.


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

   setListAdapter(new ArrayAdapter<String>(this, 
                               android.R.layout.simple_list_item_1, Names));    
   getListView().setTextFilterEnabled(true);

} 

public void onListItemClick(ListView parent, View v, int position, long id) {

    Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(Names[position]); 
    builder.setMessage(description[position] + " -> " + position );
    builder.setPositiveButton("ok", null);
    builder.show();
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
</LinearLayout>

Не выбирается нужный элемент из положения, если используется фильтр :-(, руководство по PLZ Можете ли вы поделиться исходным кодом этого

Метод B

Здесь я попытался сгенерировать строку списка из XML, но выдал ошибку, что файл 1.5 jar не позволил изменить: - (


    public View getView(int position, View convertView, ViewGroup parent) {

            /*       
            ViewInflate inflater=context.getViewInflate();
            View row=inflater.inflate(R.layout.row, null, null);
            */

            View row = (View) convertView;

            if (row==null) {
                LayoutInflater  inflater=context.getLayoutInflater();
            //    LayoutInflater inflater = (LayoutInflater)  context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                  row = inflater.inflate(R.layout.row,null);
            }

            TextView label=(TextView)row.findViewById(R.id.label);
            label.setText(items[position]);

            TextView description=(TextView)row.findViewById(R.id.description);
            description.setText(items[position]);

            //    ImageView icon=(ImageView)row.findViewById(R.id.icon);
            //    icon.setImageResource(R.drawable.delete);


            return(row);
        }

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

1 Ответ

7 голосов
/ 15 декабря 2009

Решение, которое вы выбираете, строго зависит от ваших потребностей. Я постараюсь собрать требования и предоставить вам реализацию, которую я считаю наиболее подходящей.
Итак, давайте перечислим некоторые требования:

  • для элемента списка должен быть пользовательский макет
  • есть пользовательские данные, в вашем случае это две строки: "item" и "description
  • должна быть возможность фильтровать список
  • список предметов может быть очень длинным

Что стоит упомянуть:
- Если у вас есть пользовательские данные, которые нужно отображать, и это не просто вектор строк, тогда хорошей идеей будет предоставить свой собственный тип данных. Весьма удобно хранить все данные строк в одном месте, даже если некоторые данные не отображаются в списке. Отражая ваш пример: у вас есть «элемент» и «описание» - вы можете отображать только «элемент», но вы хотите иметь возможность получить описание. Держите это в случае одного класса. В приведенном ниже примере это класс RowData. Пожалуйста, смотрите класс RowData.

- Если вам нужен собственный макет, а не просто TextView, вам следует реализовать собственный адаптер - возможно, подкласс ArrayAdapter. Пожалуйста, взгляните на класс CustomAdapter.

- Если вам нужно отфильтровать список и вы используете пользовательский тип данных - предоставьте метод toString () для вашего типа. Благодаря этому методу вы сможете использовать встроенный класс Filter. Его обязанность - отфильтровать элементы из списка, которые не соответствуют введенному вами тексту. Он просто берет текстовое представление элементов из вашего адаптера и использует его вместе с фильтром. Пожалуйста, смотрите метод toString () из класса RowData.

- Если список элементов может быть длинным, хорошей идеей будет повторное использование представлений строк и использование шаблона оболочки. См. Метод getView () и класс ViewHolder.



public class CustomList extends ListActivity {
    private LayoutInflater mInflater;
    private Vector data;

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        data = new Vector();
        RowData rd = new RowData("aaa", "description1");
        data.add(rd);
        rd = new RowData("bbb", "description2");
        data.add(rd);
        rd = new RowData("ccc", "description3");
        data.add(rd);

        CustomAdapter adapter = new CustomAdapter(this, R.layout.custom_row,R.id.item, data);
        setListAdapter(adapter);
        getListView().setTextFilterEnabled(true);
    }


    public void onListItemClick(ListView parent, View v, int position, long id) {
     CustomAdapter adapter = (CustomAdapter) parent.getAdapter();
  RowData row = adapter.getItem(position);  
     Builder builder = new AlertDialog.Builder(this);
     builder.setTitle(row.mItem); 
     builder.setMessage(row.mDescription + " -> " + position );
     builder.setPositiveButton("ok", null);
     builder.show();
 }

    /**
     * Data type used for custom adapter. Single item of the adapter.      
     */
    private class RowData {
     protected String mItem;
  protected String mDescription;

  RowData(String item, String description){
      mItem = item;
      mDescription = description;      
     }

  @Override
  public String toString() {
   return mItem + " " +  mDescription;
  }
    }

    private class CustomAdapter extends ArrayAdapter {

  public CustomAdapter(Context context, int resource,
    int textViewResourceId, List objects) {
   super(context, resource, textViewResourceId, objects);

  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   ViewHolder holder = null;

   //widgets displayed by each item in your list
   TextView item = null;
   TextView description = null;

   //data from your adapter
   RowData rowData= getItem(position);


   //we want to reuse already constructed row views...
   if(null == convertView){
    convertView = mInflater.inflate(R.layout.custom_row, null);
    holder = new ViewHolder(convertView);
    convertView.setTag(holder);
   }
   // 
   holder = (ViewHolder) convertView.getTag();
   item = holder.getItem();
   item.setText(rowData.mItem);

   description = holder.getDescription();  
   description.setText(rowData.mDescription);

   return convertView;
  }
    }

    /**
     * Wrapper for row data.
     *
     */
    private class ViewHolder {     
     private View mRow;
     private TextView description = null;
     private TextView item = null;

  public ViewHolder(View row) {
      mRow = row;
  }

  public TextView getDescription() {
   if(null == description){
    description = (TextView) mRow.findViewById(R.id.description);
   }
   return description;
  }

  public TextView getItem() {
   if(null == item){
    item = (TextView) mRow.findViewById(R.id.item);
   }
   return item;
  }     
    }
}

Пользовательский макет элемента:

<TextView android:text="text" android:id="@+id/item"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/button" android:paddingRight="10dip"
    android:paddingLeft="10dip"></TextView>

<TextView android:text="text" android:id="@+id/description"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/item" android:paddingLeft="10dip"
    android:paddingRight="10dip"></TextView>

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