【发布时间】:2014-07-28 05:42:52
【问题描述】:
我编写了一个自定义适配器来为我的 ListView 加载列表。有用。目前,我有兴趣让它响应点击,以便发送电子邮件。我添加了将电子邮件(如this)发送到我的点击监听器的代码。
这是来自我的自定义适配器;传递给构造函数MessagesAdapter() 的上下文是getApplicationContext()。 (我确实按照here 的建议尝试了this;但是,它没有用。)
public MessagesAdapter(Context context, int textViewResourceId, ArrayList<String> fileRecords) {
super(context, textViewResourceId, fileRecords);
this.ctx = context;
this.l = fileRecords;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.activity_messages_item, parent, false);
TextView hView = (TextView) rowView.findViewById(R.id.messageHeader);
TextView dView = (TextView) rowView.findViewById(R.id.messageDetail);
TextView fView = (TextView) rowView.findViewById(R.id.messageFooter);
String s = l.get(position);
String[] parts = s.split(";");
hView.setText(parts[0]);
rm.setmHeader(parts[0]);
hView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.header_text));
dView.setText(parts[1]);
rm.setmDetail(parts[1]);
hView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.detail_text));
fView.setText(parts[2]);
rm.setmFooter(parts[2]);
hView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.footer_text));
dView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_EMAIL, rm.getmDetail().split(" ")[1]);
intent.putExtra(Intent.EXTRA_SUBJECT, ctx.getResources().getString(R.string.email_subject) + " " + rm.getmHeader());
ctx.startActivity(Intent.createChooser(intent, ""));
}
});
return rowView;
}
我的问题似乎是由于startActivity()。如果不使用ctx.startActivity(),我会得到一个空指针异常。如果我这样做了,我会得到一个 Android 运行时异常。 Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 也是如此。
07-27 02:50:15.747: E/AndroidRuntime(2092): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
所以,就是这样。
- Activity 将
MessageAdapter设置为ListView。 - 适配器使用列表数据正确设置文本视图。
- 适配器还设置了
View.OnClickListener()。
点击显示的消息时,应用程序崩溃。
你能帮我如何实现点击吗?
单个项目的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
tools:context="com.foo.bar.MessageActivity" >
<TextView
android:id="@+id/messageHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:textStyle="bold"/>
<TextView
android:id="@+id/messageDetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/messageHeader"
android:autoLink="email"/>
<TextView
android:id="@+id/messageFooter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/messageDetail" />
</RelativeLayout>
列表视图的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.foo.bar.MessagesActivity" >
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true" >
</ListView>
</RelativeLayout>
消息适配器代码
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class MessagesAdapter extends ArrayAdapter<String> {
private Context ctx;
private ArrayList<String> l;
ReceivedMessages rm = new ReceivedMessages();
public MessagesAdapter(Context context, int textViewResourceId, ArrayList<String> fileRecords) {
super(context, textViewResourceId, fileRecords);
this.ctx = context;
this.l = fileRecords;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.activity_messages_item, parent, false);
TextView hView = (TextView) rowView.findViewById(R.id.messageHeader);
TextView dView = (TextView) rowView.findViewById(R.id.messageDetail);
TextView fView = (TextView) rowView.findViewById(R.id.messageFooter);
String s = l.get(position);
String[] parts = s.split(";");
hView.setText(parts[0]);
hView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.header_text));
hView.setClickable(false);
hView.setLongClickable(false);
hView.setOnClickListener(null);
dView.setText(parts[1]);
dView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.detail_text));
dView.setClickable(false);
dView.setLongClickable(false);
fView.setText(parts[2]);
fView.setTextSize(TypedValue.COMPLEX_UNIT_SP, ctx.getResources().getDimension(R.dimen.footer_text));
fView.setClickable(false);
dView.setOnClickListener(null);
return rowView;
}
}
使用MessageAdapter
// Handler for received Intents
private BroadcastReceiver fileReadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
populateList();
}
};
private void populateList() {
String[] values = fc.getMessageArray();
final ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < values.length; i++) {
list.add(values[values.length-1-i]); // Reversing the list to show recent messages first
++i;
}
MessagesAdapter ma = new MessagesAdapter(getApplicationContext(),
R.layout.activity_messages_item, list);
final ListView listView = (ListView) findViewById(android.R.id.list);
listView.setClickable(true);
listView.setAdapter(ma);
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String s = list.get(Long.valueOf(id).intValue());
Log.d("MessagesActivity", s);
Intent emailintent = new Intent(android.content.Intent.ACTION_SEND);
emailintent.setType("plain/text");
emailintent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[] {"random@gmail.com" });
emailintent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
emailintent.putExtra(android.content.Intent.EXTRA_TEXT,"");
}
}) ;
}
【问题讨论】:
-
那么意图选择器出现了吗?
-
@user3249477 不,什么都没有。
-
我只是在想——谁应该是可点击的。
ListView或TextViews。我为两者都做了setClickable(true);但没有结果。要登录,我还尝试了list.get(Long.valueOf(id).intValue()),因为我可以访问底层列表,而id来自回调方法。日志中没有任何内容。 -
那么您希望选择器何时触发?单击特定列表的项目或单击特定文本视图时?
标签: android listview android-listview