如何将Editext和Button添加到具有图标和文本的Efficent适配器

问题描述:

我想创建一个布局,使顶部的edittext和按钮应该在一行中。 我在editext中输入的搜索文本并单击搜索按钮。然后,我想显示一个自定义列表视图,其中每行包含图像和文本(根据我试过的API演示示例list14)。但是当我运行应用程序时,按钮和edittext被添加到每一行(即,每行包含一个图像,文本,editext,按钮)任何一个指导如何解决这个问题。 : 如何将Editext和Button添加到具有图标和文本的Efficent适配器

<!-- 
    <FrameLayout android:layout_width="wrap_content" 
    android:layout_height="0dip" android:layout_weight="1"></FrameLayout> 
--> 
<ImageView android:id="@+id/icon" android:layout_width="48dip" 
    android:layout_height="48dip" /> 

<TextView android:id="@+id/text" android:layout_gravity="center_vertical" 
    android:layout_width="0dip" android:layout_weight="1.0" 
    android:layout_height="wrap_content" /> 


<!-- 
    <EditText android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/prdsearchtb" 
    android:text="@string/tb_prd_search_lbl"></EditText> 
--> 
<!-- 
    <TableLayout android:id="@+id/TableLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> <TableRow> 
--> 
<Button android:id="@+id/prdsrcbutton" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="@string/btn_lbl_prd_search" 
    android:layout_x="2px" android:layout_y="410px"></Button> 
<!-- </TableRow> 
</TableLayout> 

- >

和Java文件: /** * */ 包org.techdata.activity;

import android.app.AlertDialog; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView;

/** * @author jayanthg * */ 公共类产品搜索扩展ListActivity {

private static class ProductSearchAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    private Bitmap mIcon1; 
    private Bitmap mIcon2; 

    public ProductSearchAdapter(Context context) { 

     mInflater = LayoutInflater.from(context); 

     // Icons bound to the rows. 
     mIcon1 = BitmapFactory.decodeResource(context.getResources(), 
       R.drawable.icon48x48_1); 
     mIcon2 = BitmapFactory.decodeResource(context.getResources(), 
       R.drawable.icon48x48_2); 
    } 

    @Override 
    public int getCount() { 

     return DATA.length; 
    } 

    @Override 
    public Object getItem(int position) { 

     return position; 
    } 

    @Override 
    public long getItemId(int position) { 

     return position; 
    } 

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

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.productsearch, null); 

      // Creates a ViewHolder and store references to the two children 
      // views 
      // we want to bind data to. 
      holder = new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.text); 
      holder.icon = (ImageView) convertView.findViewById(R.id.icon); 
      btn=(Button)convertView.findViewById(R.id.prdsrcbutton); 
      convertView.setTag(holder); 
     } else { 
      // Get the ViewHolder back to get fast access to the TextView 
      // and the ImageView. 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     // Bind the data efficiently with the holder. 
     holder.text.setText(DATA[position]); 
     holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); 

     holder.icon.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.i("image", " u clicked on icon Position" + position); 

      } 
     }); 
     holder.text.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.i("Text", " u clicked on text Position" + position); 

      } 
     }); 

     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.i("Button","U clicked on button"); 

      } 
     }); 


     return convertView; 
    } 

    static class ViewHolder { 
     TextView text; 
     ImageView icon; 
    } 

    private static final String[] DATA = { "Abbaye de Belloc", 
      "Abbaye du Mont des Cats" }; 

} 

ListView product_search_list; 
Button srch_btn; 
EditText srch_text; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setListAdapter(new ProductSearchAdapter(this)); 
    // setContentView(R.layout.productsearch); 
    // getListView().setEmptyView(findViewById(R.id.text)); 
    // srch_text = (EditText)findViewById(R.id.prdsearchtb); 
    // srch_btn = (Button) findViewById(R.id.prdsearchtb); 
    // srch_btn.setOnClickListener(new View.OnClickListener() { 
    //  
    // @Override 
    // public void onClick(View v) { 
    // callProductSearchAdapter(); 
    // 
    // } 
    // }); 

} 

void callProductSearchAdapter() { 
    setListAdapter(new ProductSearchAdapter(this)); 
} 

private void createDialog(String title, String text, final Intent i) { 
    if (i == null) { 
     AlertDialog ad = new AlertDialog.Builder(this).setIcon(
       R.drawable.alert_dialog_icon).setPositiveButton("Ok", null) 
       .setTitle(title).setMessage(text).create(); 
     ad.show(); 
    } 
} 

}

问候: Jayanth

你在做什么是修改它用于单独行的布局,这就是按钮出现在每一行的原因。您需要做的是使用按钮和文本视图为主布局创建一个XML文件,然后在其中嵌套一个ListView。例如,创建一个main.xml中的文件是这样的:

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

    <LinearLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="Bla"/> 

     <EditText android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="Bla"/> 

    </LinearLayout> 

    <ListView android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
</LinearLayout> 

它的列表视图的ID正好与上述(@android:id/list)是很重要的。如果你不使用它,你定制的'高效适配器'将无法找到它。完成之后,您只需在super.onCreate(...)行后面添加setContentView(R.layout.main);到onCreate方法。

+0

回应OP的帖子如下:你已*使用ListView。这就是'setListAdapter(new ProductSearchAdapter(this))'正在做的事情。这只是自动执行。我上面给出的布局显示了如何在列表顶部有一个TextView和EditText,然后在列表中它可以是任何你想要的。列表行可以是图像和文本或其他任何东西。这就是您在XML文件中为使用BaseAdapter的getView膨胀的单个行定义的内容。 – 2010-04-21 10:07:56