【问题标题】:android Xml-List view with filter带有过滤器的 android Xml-List 视图
【发布时间】:2009-12-14 13:46:25
【问题描述】:

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

我有一些以下格式的信息

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

我想在屏幕上显示它们,我不知道推荐的方法是什么。谷歌后,我发现了 2 方法。但我未能成功实施任何一项。

方法一

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


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>

如果使用过滤器,它不会从位置选择正确的项目:-(,请指导 你能分享一下这个的源代码吗

方法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);
        }

请建议什么是正确的方法来完成这个,所以应用程序可以显示项目的描述,也有过滤器。请分享如果您对此有任何代码

【问题讨论】:

    标签: android


    【解决方案1】:

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

    • 列表项应该有自定义布局
    • 有一个自定义数据,在您的情况下是两个字符串:“item”和“description”
    • 应该可以过滤列表
    • 项目列表可能很长​​li>

    值得一提的事情:
    - 如果您有需要显示的自定义数据,而不仅仅是字符串向量,那么提供您自己的数据类型是个好主意。将所有行数据保存在一个位置非常方便,即使某些数据未显示在列表中。反映您的示例:您有“项目”和“描述” - 您可能只想显示“项目”,但您希望有可能获得描述。将其保留在一个类的实例中。在下面的示例中,它是 RowData 类。请参阅 RowData 类。

    - 如果您想要自定义布局,而不仅仅是 TextView,那么您应该实现自己的适配器 - 可能是 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;
      }     
        }
    }
    

    自定义项目布局:

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2013-12-08
      • 2020-12-03
      • 1970-01-01
      • 2013-10-18
      • 2013-01-17
      相关资源
      最近更新 更多