将OnClickListener动态分配给自定义布局



在Android中,我创建了一个包含两个主列的界面。这两列都有必须充当按钮的自定义对象。这些自定义对象基于一个具有2个文本视图的简单自定义类(ButtonItem(。另外,我有一个包含LinearLayout(垂直(的布局,里面有两个TextViews。在主视图中,我使用自定义类和占位符文本用和适配器以及示例内容填充这两列,结果是这些列都有带有2行独立文本的"按钮"。问题是向这些对象添加OnClickListeners。我的想法是为每个ButtonItem添加一些属性,以便在单击时分配一个操作,但到目前为止我还没有成功。

这就是列填充(更新(的方式

public class TicketSaleActivity extends Activity {
private ListView lv;
private LinearLayout ll;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ticket_sale_layout);
lv = (ListView) findViewById(R.id.buttonList);
ll = (LinearLayout)findViewById(R.id.linearLayout);
ArrayList<ButtonItem> buttonItemList = new ArrayList<>();
ButtonItem buttonItem1 = new ButtonItem();
buttonItem1.setUpperText("1€");
buttonItem1.setBottomText("Billete a Narnia");
ButtonItem buttonItem2 = new ButtonItem();
buttonItem2.setUpperText("1.5€");
buttonItem2.setBottomText("BILLETE A CANGAS DE ONIS");
ButtonItem buttonItem3 = new ButtonItem();
buttonItem3.setUpperText("1.25€");
buttonItem3.setBottomText("Billete a Narnia");
ButtonItem buttonItem4 = new ButtonItem();
buttonItem4.setUpperText("2€");
buttonItem4.setBottomText("BILLETE A CALASPARRA");
buttonItemList.add(buttonItem1);
buttonItemList.add(buttonItem2);
buttonItemList.add(buttonItem3);
buttonItemList.add(buttonItem4);
buttonItemList.add(buttonItem1);
ButtonItemAdapter buttonItemAdapter = new ButtonItemAdapter(this, buttonItemList);
lv.setAdapter(buttonItemAdapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(TicketSaleActivity.class.getSimpleName(),"Clicked");
}
});

for (int i=0;i<buttonItemList.size();i++)
{
View item = buttonItemAdapter.getView(i, null, null);
ll.addView(item);
}
}
}

自定义类别:

public class ButtonItem{
private String upperText;
private String bottomText;

public String getUpperText() {
return upperText;
}
public void setUpperText(String upperText) {
this.upperText = upperText;
}
public String getBottomText() {
return bottomText;
}
public void setBottomText(String bottomText) {
this.bottomText = bottomText;
}
}

适配器

public class ButtonItemAdapter extends BaseAdapter {
ArrayList<ButtonItem> buttonItemList;
Context context;
public ButtonItemAdapter(Context context, ArrayList<ButtonItem> buttonList)
{
this.context=context;
this.buttonItemList=buttonList;
}
@Override
public int getCount() {
return buttonItemList.size();
}
@Override
public Object getItem(int position) {
return buttonItemList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView==null)
{
convertView = LayoutInflater.from(context).inflate(R.layout.button_list_item,parent, false);
viewHolder = new ViewHolder();
viewHolder.upperText = convertView.findViewById(R.id.buttonList_upperText);
viewHolder.bottomText = convertView.findViewById(R.id.buttonList_bottomText);
convertView.setTag(viewHolder);//almacenamos los elementos en la vista para reutilizarlos
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.upperText.setText(buttonItemList.get(position).getUpperText());
viewHolder.bottomText.setText(buttonItemList.get(position).getBottomText());
return convertView;
}
static class ViewHolder{
TextView upperText;
TextView bottomText;
}
}

button\ulist_item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
style="@style/list_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginEnd="1dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/buttonList_upperText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:text="12€"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/buttonList_bottomText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="8dp"
android:layout_weight="2.5"
android:maxLines="2"
android:minLines="2"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttonList_upperText" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>

styles/list_button

<style name="list_button" parent="@android:style/Widget.Button">
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textColor">#000000</item>
<item name="android:shadowColor">#000000</item>
<item name="android:shadowDx">0</item>
<item name="android:shadowDy">0</item>
<item name="android:layout_margin">0.5dp</item>
<item name="android:shadowRadius">0.1</item>
<item name="android:textSize">20dip</item>
<item name="android:textStyle">normal</item>
<item name="android:background">@drawable/default_button</item>        
<item name="android:padding">2dp</item>
</style>

更新:已添加ticket_sale_layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="@android:color/darker_gray">
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:baselineAligned="false"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_weight="1"
android:background="@android:color/darker_gray"
android:orientation="vertical"
android:padding="0dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
</LinearLayout>
<ListView
android:id="@id/buttonList"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:layout_weight="1"
android:background="#FFF"
android:divider="@null"
android:dividerHeight="0dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@+id/sellButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout3"
tools:background="@android:color/darker_gray">
<TextView
android:id="@+id/textView3"
android:layout_width="150dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFF"
android:focusableInTouchMode="false"
android:maxLines="2"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="150dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#FFF"
android:focusableInTouchMode="false"
android:text="TextView" />
</LinearLayout>
<Button
android:id="@+id/sellButton"
style="@style/sell_button"
android:layout_width="0dp"
android:layout_height="75dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:text="@string/btn_sell"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</android.support.constraint.ConstraintLayout>

您可以在适配器的getView方法中绑定click监听器,也可以在AdapterView:上使用OnItemClickListener

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// ...
}
});

为了在onItemClick中接收回调,项目视图中不应该有任何可点击或可聚焦的视图。因此,请尝试从项XML布局中删除@style/list_button,或者用其他样式替换它。

最新更新