带过滤器的android Xml列表视图

带过滤器的android Xml列表视图,android,Android,android对我来说是新的。 我正在尝试在1.5平台上开发一个程序,但仍在进行中,请指导我 我有以下格式的一些信息 "item1","description1" "item2","description2" "item3","description3" "item4","description4" . . . . 我想在屏幕上显示它们,我不知道这是推荐的方法。在谷歌搜索之后,我找到了2种方法。但我没有成功地实现其中任何一个 方法1 我将两列数据分成两个不同的数组,然后填充 listactiv

android对我来说是新的。 我正在尝试在1.5平台上开发一个程序,但仍在进行中,请指导我

我有以下格式的一些信息

"item1","description1"
"item2","description2"
"item3","description3"
"item4","description4"
.
.
.
.
我想在屏幕上显示它们,我不知道这是推荐的方法。在谷歌搜索之后,我找到了2种方法。但我没有成功地实现其中任何一个

方法1

我将两列数据分成两个不同的数组,然后填充 listactivity和第1列的数组,启用筛选器和单击事件我想发出警报,该警报应根据位置将第2个数组中的倾斜和描述中单击的文本显示为消息正文。 但若使用过滤器索引变成重新初始化,则会出现问题:-(,并且并没有找到另一种方法来获取该行的文本





请建议什么是正确的方式来处理此问题,这样应用程序可以显示项目描述,也有过滤器。如果您有此解决方案的任何shouce代码,请分享。您选择的解决方案严格取决于您的需要。我将试着收集需求,并为您提供我认为最合适的实现。
好的,让我们列举一些需求:

  • 列表项应有自定义布局
  • 有一个自定义数据,在您的例子中是两个字符串:“item”和“description”
  • 应该有可能过滤列表
  • 项目列表可能很长
值得一提的事情:
-如果您有需要显示的自定义数据,并且这些数据不仅仅是字符串向量,那么最好提供您自己的数据类型。将所有行数据保存在一个位置非常方便,即使其中一些数据未显示在列表中。根据您的示例:您有“item”和“description”-您可能只想显示“item”“但您希望能够获得描述。请将其保存在一个类的实例中。在下面的示例中,它是RowData类。请参阅RowData类。 -如果您想要自定义布局,而不仅仅是文本视图,那么您应该实现自己的适配器-可能是ArrayAdapter的子类。请查看CustomAdapter类。 -如果需要筛选列表并且使用自定义数据类型,请提供toString()方法。由于此方法,您将能够使用内置筛选器类。它的职责是从列表中筛选出与您输入的文本不匹配的项。它只需从适配器中获取项的文本表示形式,并将其与筛选器一起使用。请参阅RowData类中的toString()方法。 -如果项目列表可能很长,最好重用行视图并使用包装器模式。请参阅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;
  }     
    }
}
自定义项目布局:



您选择的解决方案严格取决于您的需求。我将尝试收集需求,并为您提供我认为最合适的实施方案。
好的,让我们列举一些需求:

  • 列表项应有自定义布局
  • 有一个自定义数据,在您的例子中是两个字符串:“item”和“description”
  • 应该有可能过滤列表
  • 项目列表可能很长
值得一提的事情:
-如果您有需要显示的自定义数据,并且这些数据不仅仅是字符串向量,那么最好提供您自己的数据类型。将所有行数据保存在一个位置非常方便,即使其中一些数据未显示在列表中。根据您的示例:您有“item”和“description”-您可能只想显示“item”“但您希望能够获得描述。请将其保存在一个类的实例中。在下面的示例中,它是RowData类。请参阅RowData类。 -如果您想要自定义布局,而不仅仅是文本视图,那么您应该实现自己的适配器-可能是ArrayAdapter的子类。请查看CustomAdapter类。 -如果需要筛选列表并且使用自定义数据类型,请提供toString()方法。由于此方法,您将能够使用内置筛选器类。它的职责是从列表中筛选出与您输入的文本不匹配的项。它只需从适配器中获取项的文本表示形式,并将其与筛选器一起使用。请参阅RowData类中的toString()方法。 -如果项目列表可能很长,最好重用行视图并使用包装器模式。请参阅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;
  }     
    }
}
自定义项目布局:


<?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>
    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);
        }


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>