如何在带有自定义行的 ArrayAdapter 的 onClick 方法中启动 Activity
How to start an Activity in onClick method from ArrayAdapter with custom rows
所以我写了一个自定义 ArrayAdapter
来让 ListView
填充自定义行数据,并为每一行设置 OnClickListener
。我在这里面临两个主要问题:
- 指定的 Activity (
InvoiceActivity
) 在点击时没有启动。
- 当我只输出日志消息(并注释意图和开始Activity部分)时,点击的反应时间真的很慢。
目前 ListView 中只有 3 行虚拟数据。
如果有任何帮助,我将不胜感激,谢谢!
public class InvoiceListAdapter extends ArrayAdapter<InvoiceShort> {
public InvoiceListAdapter(Context context, ArrayList<InvoiceShort> invoices) {
super(context, R.layout.list_elem, invoices);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final InvoiceShort invoice = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_elem, parent, false);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
});
}
// Lookup view for data population
TextView date = (TextView) convertView.findViewById(R.id.textDate);
TextView total = (TextView) convertView.findViewById(R.id.textTotal);
CheckBox paid = (CheckBox) convertView.findViewById(R.id.checkBoxPaid);
// populate data
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
date.setText(formatter.format(invoice.getDate()));
total.setText("€ " + new Long(invoice.getTotal()).toString());
paid.setChecked(invoice.isPaid());
return convertView;
}
}
编辑:这是一行的 xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_centerHorizontal="false"
android:orientation="horizontal">
<CheckBox
android:id="@+id/checkBoxPaid"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:checked="true"
android:elevation="0dp"
android:inputType="none" />
<EditText
android:id="@+id/textDate"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@null"
android:ems="10"
android:focusable="false"
android:inputType="none"
android:text="2017-12-30" />
<EditText
android:id="@+id/textTotal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@null"
android:ems="10"
android:focusable="false"
android:inputType="none"
android:text="10€"
android:textAlignment="viewStart" />
</LinearLayout>
尝试像这样修改您的构造函数:-
Context mContext;
public InvoiceListAdapter(Context context, ArrayList<InvoiceShort>
invoices) {
super(context, R.layout.list_elem, invoices);
mContext = context;
}
并使用 mContext 而不是 getContext();
这部分:-
@Override
public void onClick(View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
尝试在
之外编写 onclick 监听器
if else
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
});`
使用视图上下文
开始activity
Intent intent = new Intent(convertView.getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
convertView.getContext().startActivity(intent);
在您要设置适配器并显示 ListView 的 Activity class 中实施 OnClickListener。
所以我终于找到了 solution,简而言之就是将此侦听器设置为 ListView 的一行内的所有视图:
/** A definition of a listener that does nothing but to let the click be handled by the parent **/
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
((ListView) parent).performItemClick(v, position, 0);
}
};
date.setOnClickListener(listener);
total.setOnClickListener(listener);
paid.setOnClickListener(listener);
并且还要在 MainActivity
中为 ListView 实现 OnItemClickedListener
我找到了解决方案,这里的问题是您的 xml 中有 edittext 但您将其作为 Textview 获取,您可以在 list_elem 布局中将 textview 更改为 edittext 您的点击侦听器将起作用。否则,您可以在自定义适配器中将 textview 更改为 edittext,并如下所示为 edittext 设置两个点击监听器以使其工作
date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
total.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
所以我写了一个自定义 ArrayAdapter
来让 ListView
填充自定义行数据,并为每一行设置 OnClickListener
。我在这里面临两个主要问题:
- 指定的 Activity (
InvoiceActivity
) 在点击时没有启动。 - 当我只输出日志消息(并注释意图和开始Activity部分)时,点击的反应时间真的很慢。
目前 ListView 中只有 3 行虚拟数据。 如果有任何帮助,我将不胜感激,谢谢!
public class InvoiceListAdapter extends ArrayAdapter<InvoiceShort> {
public InvoiceListAdapter(Context context, ArrayList<InvoiceShort> invoices) {
super(context, R.layout.list_elem, invoices);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final InvoiceShort invoice = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_elem, parent, false);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
});
}
// Lookup view for data population
TextView date = (TextView) convertView.findViewById(R.id.textDate);
TextView total = (TextView) convertView.findViewById(R.id.textTotal);
CheckBox paid = (CheckBox) convertView.findViewById(R.id.checkBoxPaid);
// populate data
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
date.setText(formatter.format(invoice.getDate()));
total.setText("€ " + new Long(invoice.getTotal()).toString());
paid.setChecked(invoice.isPaid());
return convertView;
}
}
编辑:这是一行的 xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_centerHorizontal="false"
android:orientation="horizontal">
<CheckBox
android:id="@+id/checkBoxPaid"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:checked="true"
android:elevation="0dp"
android:inputType="none" />
<EditText
android:id="@+id/textDate"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@null"
android:ems="10"
android:focusable="false"
android:inputType="none"
android:text="2017-12-30" />
<EditText
android:id="@+id/textTotal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@null"
android:ems="10"
android:focusable="false"
android:inputType="none"
android:text="10€"
android:textAlignment="viewStart" />
</LinearLayout>
尝试像这样修改您的构造函数:-
Context mContext;
public InvoiceListAdapter(Context context, ArrayList<InvoiceShort>
invoices) {
super(context, R.layout.list_elem, invoices);
mContext = context;
}
并使用 mContext 而不是 getContext(); 这部分:-
@Override
public void onClick(View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
尝试在
之外编写 onclick 监听器if else
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View parent) {
Log.d("item click", "invoice id: " + invoice.getId());
Intent intent = new Intent(getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
getContext().startActivity(intent);
}
});`
使用视图上下文
开始activityIntent intent = new Intent(convertView.getContext(), InvoiceActivity.class);
intent.putExtra("id", invoice.getId());
convertView.getContext().startActivity(intent);
在您要设置适配器并显示 ListView 的 Activity class 中实施 OnClickListener。
所以我终于找到了 solution,简而言之就是将此侦听器设置为 ListView 的一行内的所有视图:
/** A definition of a listener that does nothing but to let the click be handled by the parent **/
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
((ListView) parent).performItemClick(v, position, 0);
}
};
date.setOnClickListener(listener);
total.setOnClickListener(listener);
paid.setOnClickListener(listener);
并且还要在 MainActivity
中为 ListView 实现OnItemClickedListener
我找到了解决方案,这里的问题是您的 xml 中有 edittext 但您将其作为 Textview 获取,您可以在 list_elem 布局中将 textview 更改为 edittext 您的点击侦听器将起作用。否则,您可以在自定义适配器中将 textview 更改为 edittext,并如下所示为 edittext 设置两个点击监听器以使其工作
date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
total.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});