单击 ListViewItem 时移动到新的 activity
Moving to a new activity when ListViewItem is clicked
我正在为我的应用程序创建一种登录系统,我让它工作到用户可以添加他们的详细信息并从列表中选择他们的程度。
用户将他们的信息输入到 UserInput class,然后该信息存储在 Firebase 数据库中。数据然后显示在 ListView 项中,但首先通过 CustomAdapter class。这个 class 是我遇到问题的地方。
就目前而言,用户能够通过 setOnClickListener() 与此列表视图进行交互。当从列表中选择项目时,我让程序显示 Toast 并且它显示没有问题。我现在想弄清楚的是如何获得它,以便当用户单击列表视图项目(包括他们的姓名和详细信息)时,它会立即将他们带到名为 activity 的主菜单 Menu_Activity.java
消息Gradle构建
Error:(71, 44) error: no suitable constructor found for Intent(<anonymous OnClickListener>,Class<Menu_Activity>)
constructor Intent.Intent(String,Uri) is not applicable
(argument mismatch; <anonymous OnClickListener> cannot be converted to String)
constructor Intent.Intent(Context,Class<?>) is not applicable
(argument mismatch; <anonymous OnClickListener> cannot be converted to Context)
error:cannot find symbol method startActivity(Intent)
CustomAdapter.java
package uk.ac.napier.newsreader.Details_UI;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import uk.ac.napier.newsreader.Home_Screen_Activity;
import uk.ac.napier.newsreader.Menu_Activity;
import uk.ac.napier.newsreader.R;
import uk.ac.napier.newsreader.Details_UserInput.User;
import uk.ac.napier.newsreader.Routes_Activity;
/**
* Created by MarkB on 14/03/2017.
*/
public class CustomAdapter extends BaseAdapter {
Context c;
ArrayList<User> users;
public CustomAdapter (Context c, ArrayList<User> users) {
this.c = c;
this.users = users;
}
@Override
public int getCount() {
return users.size();
}
@Override
public Object getItem(int position) {
return users.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null)
{
convertView = LayoutInflater.from(c).inflate(R.layout.model,parent,false);
}
TextView nameTxt = (TextView) convertView.findViewById(R.id.nameTxt);
TextView ageTxt = (TextView) convertView.findViewById(R.id.ageTxt);
TextView weightTxt = (TextView) convertView.findViewById(R.id.weightTxt);
final User u = (User) this.getItem(position);
nameTxt.setText(u.getName());
ageTxt.setText(u.getAge());
weightTxt.setText(u.getWeight());
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(c,u.getName(), Toast.LENGTH_SHORT).show();
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
return convertView;
}
}
使用“(this, Menu_Activity.class);”创建 Intent 时出现问题标记错误说
Cannot resolve constructor 'Intent(anonymous android.view.View.OnClickListener, java.lang.Class<uk.ac.napier.newsreader.Menu_Activity>)'
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
此处 c
是您的上下文变量。
解释:
你应该传递 activity context 作为第一个参数。
这是我在我的一个应用程序中使用的。
LocationAdapter adapter = new LocationAdapter(getApplicationContext(), R.layout.row, result);
//set the locationList (listview) to use adapter initialised above
locationList.setAdapter(adapter);
//Set up onClickListner
locationList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//get the position of the row. So which row was clicked
LocationModel locationModel = result.get(position);
//initialise intent, this click event takes the user to locationDetails Activity
Intent intent = new Intent(ListActivity.this, LocationDetails.class);
//passing extra value. in this case passing of locationModel
intent.putExtra("locationModel", new Gson().toJson(locationModel));
//start activity
startActivity(intent);
}
});
在适配器中 class "this" 不返回 class 对象。
使用列表对象设置 OnItemClickListener
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent startMenuActivity = new Intent(MyActivity.this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
改变这个:
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
为此:
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
差异:
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
记得:
当你把this“说”成匿名class时,你指的是她(匿名对象class),而不是你的“主要class".
我正在为我的应用程序创建一种登录系统,我让它工作到用户可以添加他们的详细信息并从列表中选择他们的程度。
用户将他们的信息输入到 UserInput class,然后该信息存储在 Firebase 数据库中。数据然后显示在 ListView 项中,但首先通过 CustomAdapter class。这个 class 是我遇到问题的地方。
就目前而言,用户能够通过 setOnClickListener() 与此列表视图进行交互。当从列表中选择项目时,我让程序显示 Toast 并且它显示没有问题。我现在想弄清楚的是如何获得它,以便当用户单击列表视图项目(包括他们的姓名和详细信息)时,它会立即将他们带到名为 activity 的主菜单 Menu_Activity.java
消息Gradle构建
Error:(71, 44) error: no suitable constructor found for Intent(<anonymous OnClickListener>,Class<Menu_Activity>)
constructor Intent.Intent(String,Uri) is not applicable
(argument mismatch; <anonymous OnClickListener> cannot be converted to String)
constructor Intent.Intent(Context,Class<?>) is not applicable
(argument mismatch; <anonymous OnClickListener> cannot be converted to Context)
error:cannot find symbol method startActivity(Intent)
CustomAdapter.java
package uk.ac.napier.newsreader.Details_UI;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import uk.ac.napier.newsreader.Home_Screen_Activity;
import uk.ac.napier.newsreader.Menu_Activity;
import uk.ac.napier.newsreader.R;
import uk.ac.napier.newsreader.Details_UserInput.User;
import uk.ac.napier.newsreader.Routes_Activity;
/**
* Created by MarkB on 14/03/2017.
*/
public class CustomAdapter extends BaseAdapter {
Context c;
ArrayList<User> users;
public CustomAdapter (Context c, ArrayList<User> users) {
this.c = c;
this.users = users;
}
@Override
public int getCount() {
return users.size();
}
@Override
public Object getItem(int position) {
return users.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null)
{
convertView = LayoutInflater.from(c).inflate(R.layout.model,parent,false);
}
TextView nameTxt = (TextView) convertView.findViewById(R.id.nameTxt);
TextView ageTxt = (TextView) convertView.findViewById(R.id.ageTxt);
TextView weightTxt = (TextView) convertView.findViewById(R.id.weightTxt);
final User u = (User) this.getItem(position);
nameTxt.setText(u.getName());
ageTxt.setText(u.getAge());
weightTxt.setText(u.getWeight());
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(c,u.getName(), Toast.LENGTH_SHORT).show();
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
return convertView;
}
}
使用“(this, Menu_Activity.class);”创建 Intent 时出现问题标记错误说
Cannot resolve constructor 'Intent(anonymous android.view.View.OnClickListener, java.lang.Class<uk.ac.napier.newsreader.Menu_Activity>)'
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
此处 c
是您的上下文变量。
解释:
你应该传递 activity context 作为第一个参数。
这是我在我的一个应用程序中使用的。
LocationAdapter adapter = new LocationAdapter(getApplicationContext(), R.layout.row, result);
//set the locationList (listview) to use adapter initialised above
locationList.setAdapter(adapter);
//Set up onClickListner
locationList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//get the position of the row. So which row was clicked
LocationModel locationModel = result.get(position);
//initialise intent, this click event takes the user to locationDetails Activity
Intent intent = new Intent(ListActivity.this, LocationDetails.class);
//passing extra value. in this case passing of locationModel
intent.putExtra("locationModel", new Gson().toJson(locationModel));
//start activity
startActivity(intent);
}
});
在适配器中 class "this" 不返回 class 对象。 使用列表对象设置 OnItemClickListener
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent startMenuActivity = new Intent(MyActivity.this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
改变这个:
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
为此:
//ONITEMCLICK
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
startActivity(startMenuActivity);
}
});
差异:
Intent startMenuActivity = new Intent(this, Menu_Activity.class);
Intent startMenuActivity = new Intent(c, Menu_Activity.class);
记得:
当你把this“说”成匿名class时,你指的是她(匿名对象class),而不是你的“主要class".