【问题标题】:Button setOnClickListener in a ListViewListView 中的按钮 setOnClickListener
【发布时间】:2015-08-17 12:49:46
【问题描述】:

我正在尝试获取列表视图中按钮的 onclick 事件,但它不起作用

fragment_contact.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="404dp"
    android:layout_weight="0.64"
    android:orientation="horizontal"
    android:paddingBottom="40dip" >

    <ListView
        android:id="@+id/contactlistview"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_gravity="fill"
        android:layout_weight="10"
        android:textSize="5pt"
        android:visibility="visible" />

</LinearLayout>

fragment_contact_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1">

    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="New Button"
       android:id="@+id/btn_edit_contact"
       android:layout_gravity="right" />

</LinearLayout>

FragmentContact.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_contact, container, false);

    ListAdapter adapter_contact = new SimpleAdapter(
                    getActivity(), allcontact,
                    R.layout.fragment_contact_content, new String[]{"name", "level", "function", "phone", "email"},
                    new int[]{R.id.contact, R.id.level, R.id.function, R.id.phone, R.id.email});

    listview_contact = (ListView) view.findViewById(R.id.contactlistview);
    listview_contact.setItemsCanFocus(true);
    listview_contact.setAdapter(adapter_contact);

    Button btn_edit_contact = (Button) view.findViewById(R.id.btn_edit_contact);
    btn_edit_contact.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("Do something");
        }
    });

    return view;
}

我也尝试过充气 fragment_contact_content.xml,但按钮仍然没有任何作用。

【问题讨论】:

  • 你应该在 List 适配器类的 getView() 中做
  • 使用适配器设置列表,然后在您的适配器中单击设置按钮
  • 我已经用适配器设置了列表。我只是没有将它包含在上面的代码中,因为我认为它已经很明显了。无论如何,将尝试 getView()。当我在这里努力学习时,我只是不明白反对。
  • 首先你决定你的按钮在哪里。在fragmentlistview item布局中
  • @MD 按钮在列表视图中..列表视图在片段中

标签: java android android-fragments android-listview


【解决方案1】:

使用自定义 Adapter 并在 getView 中编写你的代码

public class MealAdapter extends BaseAdapter{
    private int  mHour, mMinute;
     int minutes,hour;
       String strtime;
    customButtonListener customListner; 
    private Context context;
    private List<Meal> rowItems;

    public MealAdapter(Context context, List<Meal> rowItems) {

        this.context = context;
        this.rowItems = rowItems;
    }

     @Override
     public int getCount() {
      return rowItems.size();
     }

     @Override
     public Object getItem(int position) {
      return rowItems.get(position);
     }

     @Override
     public long getItemId(int position) {
      return rowItems.indexOf(getItem(position));
     }
    private class OptionHolder
    {

        ImageButton btn_time;
        ImageButton btn_delete;
    }


    @Override
    public View getView(final int position,  View convertView, final ViewGroup parent) {
        // TODO Auto-generated method stub
         final OptionHolder holder;


         if (convertView == null) 
          {
             LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

           convertView = mInflater.inflate(R.layout.meal_list_item, null);
           holder = new OptionHolder();

           holder.btn_time= (ImageButton) convertView.findViewById(R.id.btn_time);
           holder.btn_delete =(ImageButton) convertView.findViewById(R.id.btn_delete_meal);

           convertView.setTag(holder);


           }
          else
          {
              holder = (OptionHolder) convertView.getTag();
          }
         final Meal row_pos=rowItems.get(position);
           row_pos.setMeal("");
           row_pos.setDetail("");
           holder.ed_meal.setText(row_pos.getMeal());
           holder.ed_detail.setText(row_pos.getDetail());
           holder.ed_time.setText(row_pos.getTime());

       holder.btn_time.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            final Calendar c = Calendar.getInstance();
            mHour = c.get(Calendar.HOUR_OF_DAY);
            mMinute = c.get(Calendar.MINUTE);

            // Launch Time Picker Dialog
            TimePickerDialog tpd = new TimePickerDialog(MealPlannerFragment.con,
                    new TimePickerDialog.OnTimeSetListener() {

                @Override
                public void onTimeSet(TimePicker view, int hourOfDay,
                        int minute) {
                    // Display Selected time in textbox
                    strtime=(hourOfDay + ":" + minute);

                    row_pos.setTime(strtime);

                    row_pos.setMunite(minute);
                    row_pos.setHour(hourOfDay);
                    holder.ed_time.setText(row_pos.getTime());
                    }
            }, mHour, mMinute, false);
    tpd.show();

    }
    });
       holder.btn_delete.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            if (customListner != null) {  
                customListner.onButtonClickListner(position,row_pos);  
            }  
        }
    });

          return convertView;
}
     public interface customButtonListener {  
            public void onButtonClickListner(int position,Meal row_pos);  
        }  
     public void setCustomButtonListner(customButtonListener listener) {  
            this.customListner = listener;  
        }  

}
`

【讨论】:

    【解决方案2】:

    你不能直接在onCreateView 中获取Listview 单元格的Button 事件。您必须为此创建 CustomAdapter 类。

    您将需要创建一个自定义 ArrayAdapter 类,您将使用它来扩展您的 xml 布局,以及处理您的按钮和点击事件。

    public class MyCustomAdapter extends BaseAdapter implements ListAdapter { 
    private ArrayList<String> list = new ArrayList<String>(); 
    private Context context; 
    
    public MyCustomAdapter(ArrayList<String> list, Context context) { 
        this.list = list; 
        this.context = context; 
    } 
    
    @Override
    public int getCount() { 
        return list.size(); 
    } 
    
    @Override
    public Object getItem(int pos) { 
        return list.get(pos); 
    } 
    
    @Override
    public long getItemId(int pos) { 
        return list.get(pos).getId();
        //just return 0 if your list items do not have an Id variable.
    } 
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            view = inflater.inflate(R.layout.fragment_contact_content, null);
        } 
    
        //Handle button and add onClickListener
        Button editBtn = (Button)view.findViewById(R.id.btn_edit_contact);
    
        editBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) { 
                //do something
                //some other task
                notifyDataSetChanged();
            }
        });
    
        return view; 
    } 
    }
    

    最后,在您的活动中,您可以实例化您的自定义 ArrayAdapter 类并将其设置为您的列表视图

    public class MyActivity extends Activity { 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_my_activity); 
    
        //generate list
        ArrayList<String> list = new ArrayList<String>();
        list.add("item1");
        list.add("item2");
    
        //instantiate custom adapter
        MyCustomAdapter adapter = new MyCustomAdapter(list, this);
    
        //handle listview and assign adapter
        ListView lView = (ListView)findViewById(R.id.my_listview);
        lView.setAdapter(adapter);
    }
    

    您可以参考这个链接:http://www.c-sharpcorner.com/UploadFile/9e8439/create-custom-listener-on-button-in-listitem-listview-in-a/

    只需处理 getview 内的点击侦听器,您可以在其中使用 findviewbyid 找到按钮

    希望对你有帮助!

    【讨论】:

    • 谢谢。如果我设法让它工作,会回复你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多