Java “无法解决”;startActivity();当试图从RecyclerView';s onClickListener()
我是android编程新手,正在尝试实现RecyclerView。如果这个问题是多余的,请原谅,但我在其他地方找不到我的答案。所以,我终于发布了我的问题Java “无法解决”;startActivity();当试图从RecyclerView';s onClickListener(),java,android,Java,Android,我是android编程新手,正在尝试实现RecyclerView。如果这个问题是多余的,请原谅,但我在其他地方找不到我的答案。所以,我终于发布了我的问题 import android.content.Context; import android.content.Intent; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; i
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
public class QueriesAdapter extends RecyclerView.Adapter<QueriesAdapter.QueryViewHolder> {
private List<Query> list;
private Context mContext;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public class QueryViewHolder extends RecyclerView.ViewHolder{
// each data item is just a string in this case
protected TextView questionTextView;
public QueryViewHolder (View view)
{
super(view);
this.questionTextView = (TextView) view.findViewById(R.id.list_item_question);
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public QueriesAdapter(Context context, List<Query> myDataset) {
mContext = context;
list = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public QueriesAdapter.QueryViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
// set the view's size, margins, paddings and layout parameters
QueryViewHolder vh = new QueryViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(QueryViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.questionTextView.setText(list.get(position).mQuery);
holder.questionTextView.setTag(holder);
}
View.OnClickListener clickListener = new View.OnClickListener(){
@Override
public void onClick(View v) {
QueryViewHolder viewHolder = (QueryViewHolder)v.getTag();
int position = viewHolder.getPosition();
Query q = list.get(position);
Intent i = new Intent(mContext, Answer.class);
i.putExtra("QueryId", q.id);
i.putExtra("question", q.mQuery);
i.putExtra("answer", q.mAnswer);
startActivity(i);
//This line is showing error that it cannot resolve startActivity() function, I think that I did not pass the context properly.
//Anyway, help me on this.
}
};
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return list.size();
}
}
使用
mContext.startActivity(i)
您必须使用mContext启动一个方法,该方法在活动中是默认的,请尝试使用mContext.startActivity(i)
您需要以以下方式实现。在RecyclerView
适配器类中定义一个单击侦听器,以便事件可以在相应的活动中使用
或片段
。这有助于使事件更容易处理public class ListViewNotifyAdapter extends RecyclerView.Adapter <...>{
//defining a click listner
private static MyClickListener myClickListener;
//usual methods and variables goes here
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
//interface for click
public interface MyClickListener {
public void onItemClick(int position, View v);
}
//view holder
public static class NotificationObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView txtEventAlias;
TextView txtTime;
TextView txtLogMessage;
public NotificationObjectHolder(View viewItem){
super(viewItem);
txtEventAlias=(TextView)viewItem.findViewById(R.id.txtEventAlias);
txtTime=(TextView)viewItem.findViewById(R.id.txtTime);
txtLogMessage=(TextView)viewItem.findViewById(R.id.txtLogMessage);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(getPosition(), v);
}
}
}
试着用mContext调用startActivity,就像调用
mContext一样。startActivity(i)
谢谢你,它成功了。但是你能告诉我为什么它不起作用吗before@HarshitKumarstartActivity是上下文的一种方法。活动扩展了上下文。
public class ListViewNotifyAdapter extends RecyclerView.Adapter <...>{
//defining a click listner
private static MyClickListener myClickListener;
//usual methods and variables goes here
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
//interface for click
public interface MyClickListener {
public void onItemClick(int position, View v);
}
//view holder
public static class NotificationObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView txtEventAlias;
TextView txtTime;
TextView txtLogMessage;
public NotificationObjectHolder(View viewItem){
super(viewItem);
txtEventAlias=(TextView)viewItem.findViewById(R.id.txtEventAlias);
txtTime=(TextView)viewItem.findViewById(R.id.txtTime);
txtLogMessage=(TextView)viewItem.findViewById(R.id.txtLogMessage);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(getPosition(), v);
}
}
}
@Override
public void onResume() {
super.onResume();
((ListViewNotifyAdapter) mAdapter).setOnItemClickListener(
new ListViewNotifyAdapter.MyClickListener() {
@Override
public void onItemClick(int position, View v) {
showAlert(position);
}
});
}
void showAlert(int position){
//action for the item click
}