Android 适配器中的上下文操作栏?
Android Contextual Action bar in adapter?
我正在尝试在我的应用程序中实现上下文操作栏。但是,当我尝试在我的适配器中使用 Startactionmode 方法时,我找不到这样做的方法。
我试过了:
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
它给了我一个错误
java.lang.NullPointerException: 尝试调用虚拟方法 '
在 CustomerListAdapter$ViewHolder$1.onClick(CustomerListAdapter.java:62)
java:62 是
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
顺便说一句,我正在导入 import android.view.ActionMode;及其在 mainactivity 中的一个选项卡片段实现 actionbaractivity
我的适配器class
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.ViewHolder>{
public ViewHolder(final View itemView,int ViewType, final Context c) {
我设置了
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
}
});
我的适配器代码在下面
package com.thecueapps.cue_business;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.parse.ParseUser;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.ViewHolder>{
protected List<ParseUser> mCustomers;
Context context;
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView Name_fiedl;
TextView Number_ppl_field;
TextView Time_field;
Context contxt;
Context contxt1;
private CardView cardView;
private ImageView circleview;
public ActionMode mActionMode;
public ViewHolder(final View itemView,int ViewType, final Context c) { // Creating ViewHolder Constructor with View and viewType As a parameter
super(itemView);
contxt = c;
//itemView.setClickable(true);
//itemView.setOnClickListener(this);
// Here we set the appropriate view in accordance with the the view type as passed when the holder object is created
Name_fiedl = (TextView) itemView.findViewById(R.id.text_name); // Creating TextView object with the id of textView from item_row.xml
Number_ppl_field = (TextView) itemView.findViewById(R.id.number_ppl);// Creating ImageView object with the id of ImageView from item_row.xml
circleview=(ImageView) itemView.findViewById(R.id.circle_ppl);
Time_field=(TextView) itemView.findViewById(R.id.text_time);
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
/* Toast.makeText(itemView.getContext(), "hi "
, Toast.LENGTH_SHORT).show();*/
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
}
});
//Add Expand Area to a Card
cardView = (CardView) itemView.findViewById(R.id.card_view);
cardView.setRadius(0);
}
}
CustomerListAdapter(List<ParseUser> customer){ // MyAdapter Constructor with titles and icons parameter
// titles, icons, name, email, profile pic are passed from the main activity as we
mCustomers=customer;
//in adapter
}
@Override
public CustomerListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row,parent,false); //Inflating the layout
ViewHolder vhItem = new ViewHolder(v,viewType,context); //Creating ViewHolder and passing the object of type view
return vhItem; // Returning the created object
//inflate your layout and pass it to view holder
}
@Override
public void onBindViewHolder(CustomerListAdapter.ViewHolder holder, int position) {
ParseUser customer=mCustomers.get(position);
holder.Name_fiedl.setText(customer.getString(ParseConstants.KEY_USER_REAL_NAME)); // Setting the Text with the array of our Titles
holder.Number_ppl_field.setText(String.valueOf(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)));// Settimg the image with array of our icons
String time=customer.getString(ParseConstants.KEY_CUSTOMER_TIME);
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
SimpleDateFormat dateFormat2 = new SimpleDateFormat("hh:mm aa");
try {
Date date = dateFormat.parse(time);
String out= dateFormat2.format(date);
holder.Time_field.setText(out);
//Log.e("Time", out);
} catch (ParseException e) {
}
if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==3){
holder.circleview.setImageResource(R.color.lightblue500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==4){
holder.circleview.setImageResource(R.color.lightblue500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==5){
holder.circleview.setImageResource(R.color.lightgreen500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)>5){
holder.circleview.setImageResource(R.color.lightgreen500);
}
}
@Override
public int getItemCount() {
return mCustomers.size(); // the number of items in the list will be +1 the titles including the header view.
}
public void remove(String item) {
int position = mCustomers.indexOf(item);
mCustomers.remove(position);
notifyItemRemoved(position);
}
}
class MyActionModeCallback implements ActionMode.Callback{
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
actionMode.getMenuInflater().inflate(R.menu.menu_login, menu);
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
actionMode.setTitle("hihi");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
}
因为我的适配器在片段中。这是我尝试过但仍然面临问题的方法。
在我的片段中:
mAdapter = new CustomerListAdapter(mCustomers, getActivity());
在我的适配器中:
CustomerListAdapter(List < ParseUser > customer, Activity Activity)
{ // MyAdapter Constructor with titles and icons parameter
// titles, icons, name, email, profile pic are passed from the main activity as we
mCustomers = customer;
mActivity= Activity;
//in adapter
}
对于我的 onclicklistener:
itemView.setOnClickListener(新View.OnClickListener() {
public void onClick(View v) {
mActionMode = mActivity.startActionMode(new MyActionModeCallback());
}
});
但我仍然面临错误,显示非静态字段无法应用于静态字段?
这里:
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
可能 c
上下文对象为空。
要在 CustomerListAdapter
class 中获取 Activity 上下文,请使用 class 构造函数:
private Acivity mActivity;
public CustomerListAdapter(Activity mActivity){
this.mActivity=mActivity;
....
}
使用 mActivity
从 Activity 调用 startActionMode
方法:
mActionMode = mActivity.startActionMode(new MyActionModeCallback());
并且在创建CustomerListAdapter
class对象时使用this
从MainActivity
传递Activity上下文:
CustomerListAdapter adapter=new CustomerListAdapter(this);
在activity
public class Main extends AppCompatActivity {
public Toolbar toolbar;
AdapterEXT mAdapter;
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
......
List<DataXXX> data = new ArrayList<>();
mAdapter = new AdapterEXT(Main.this , toolbar, data);
在适配器中
class AdapterEXT extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public Context context;
public Toolbar toolbar;
AdapterEXT (Context context, Toolbar toolbar, List<DataXXX> dataXXX) {
this.context = context;
this.toolbar=toolbar;
this.dataXXX = dataXXX;
}
你想要在适配器中的位置
toolbar.setTitle(context.getString(R.string.YourTXTfromXML));
我正在尝试在我的应用程序中实现上下文操作栏。但是,当我尝试在我的适配器中使用 Startactionmode 方法时,我找不到这样做的方法。
我试过了:
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
它给了我一个错误
java.lang.NullPointerException: 尝试调用虚拟方法 ' 在 CustomerListAdapter$ViewHolder$1.onClick(CustomerListAdapter.java:62)
java:62 是
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
顺便说一句,我正在导入 import android.view.ActionMode;及其在 mainactivity 中的一个选项卡片段实现 actionbaractivity
我的适配器class
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.ViewHolder>{
public ViewHolder(final View itemView,int ViewType, final Context c) {
我设置了
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
}
});
我的适配器代码在下面
package com.thecueapps.cue_business;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.parse.ParseUser;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.ViewHolder>{
protected List<ParseUser> mCustomers;
Context context;
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView Name_fiedl;
TextView Number_ppl_field;
TextView Time_field;
Context contxt;
Context contxt1;
private CardView cardView;
private ImageView circleview;
public ActionMode mActionMode;
public ViewHolder(final View itemView,int ViewType, final Context c) { // Creating ViewHolder Constructor with View and viewType As a parameter
super(itemView);
contxt = c;
//itemView.setClickable(true);
//itemView.setOnClickListener(this);
// Here we set the appropriate view in accordance with the the view type as passed when the holder object is created
Name_fiedl = (TextView) itemView.findViewById(R.id.text_name); // Creating TextView object with the id of textView from item_row.xml
Number_ppl_field = (TextView) itemView.findViewById(R.id.number_ppl);// Creating ImageView object with the id of ImageView from item_row.xml
circleview=(ImageView) itemView.findViewById(R.id.circle_ppl);
Time_field=(TextView) itemView.findViewById(R.id.text_time);
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
/* Toast.makeText(itemView.getContext(), "hi "
, Toast.LENGTH_SHORT).show();*/
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
}
});
//Add Expand Area to a Card
cardView = (CardView) itemView.findViewById(R.id.card_view);
cardView.setRadius(0);
}
}
CustomerListAdapter(List<ParseUser> customer){ // MyAdapter Constructor with titles and icons parameter
// titles, icons, name, email, profile pic are passed from the main activity as we
mCustomers=customer;
//in adapter
}
@Override
public CustomerListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row,parent,false); //Inflating the layout
ViewHolder vhItem = new ViewHolder(v,viewType,context); //Creating ViewHolder and passing the object of type view
return vhItem; // Returning the created object
//inflate your layout and pass it to view holder
}
@Override
public void onBindViewHolder(CustomerListAdapter.ViewHolder holder, int position) {
ParseUser customer=mCustomers.get(position);
holder.Name_fiedl.setText(customer.getString(ParseConstants.KEY_USER_REAL_NAME)); // Setting the Text with the array of our Titles
holder.Number_ppl_field.setText(String.valueOf(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)));// Settimg the image with array of our icons
String time=customer.getString(ParseConstants.KEY_CUSTOMER_TIME);
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
SimpleDateFormat dateFormat2 = new SimpleDateFormat("hh:mm aa");
try {
Date date = dateFormat.parse(time);
String out= dateFormat2.format(date);
holder.Time_field.setText(out);
//Log.e("Time", out);
} catch (ParseException e) {
}
if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==3){
holder.circleview.setImageResource(R.color.lightblue500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==4){
holder.circleview.setImageResource(R.color.lightblue500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)==5){
holder.circleview.setImageResource(R.color.lightgreen500);
}
else if(customer.getInt(ParseConstants.KEY_CUSTOMER_NUMBER_PPL)>5){
holder.circleview.setImageResource(R.color.lightgreen500);
}
}
@Override
public int getItemCount() {
return mCustomers.size(); // the number of items in the list will be +1 the titles including the header view.
}
public void remove(String item) {
int position = mCustomers.indexOf(item);
mCustomers.remove(position);
notifyItemRemoved(position);
}
}
class MyActionModeCallback implements ActionMode.Callback{
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
actionMode.getMenuInflater().inflate(R.menu.menu_login, menu);
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
actionMode.setTitle("hihi");
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
}
因为我的适配器在片段中。这是我尝试过但仍然面临问题的方法。
在我的片段中:
mAdapter = new CustomerListAdapter(mCustomers, getActivity());
在我的适配器中:
CustomerListAdapter(List < ParseUser > customer, Activity Activity) { // MyAdapter Constructor with titles and icons parameter // titles, icons, name, email, profile pic are passed from the main activity as we mCustomers = customer; mActivity= Activity; //in adapter }
对于我的 onclicklistener:
itemView.setOnClickListener(新View.OnClickListener() { public void onClick(View v) {
mActionMode = mActivity.startActionMode(new MyActionModeCallback()); } });
但我仍然面临错误,显示非静态字段无法应用于静态字段?
这里:
mActionMode = ((MainActivity)c).startActionMode(new MyActionModeCallback());
可能 c
上下文对象为空。
要在 CustomerListAdapter
class 中获取 Activity 上下文,请使用 class 构造函数:
private Acivity mActivity;
public CustomerListAdapter(Activity mActivity){
this.mActivity=mActivity;
....
}
使用 mActivity
从 Activity 调用 startActionMode
方法:
mActionMode = mActivity.startActionMode(new MyActionModeCallback());
并且在创建CustomerListAdapter
class对象时使用this
从MainActivity
传递Activity上下文:
CustomerListAdapter adapter=new CustomerListAdapter(this);
在activity
public class Main extends AppCompatActivity {
public Toolbar toolbar;
AdapterEXT mAdapter;
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
......
List<DataXXX> data = new ArrayList<>();
mAdapter = new AdapterEXT(Main.this , toolbar, data);
在适配器中
class AdapterEXT extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public Context context;
public Toolbar toolbar;
AdapterEXT (Context context, Toolbar toolbar, List<DataXXX> dataXXX) {
this.context = context;
this.toolbar=toolbar;
this.dataXXX = dataXXX;
}
你想要在适配器中的位置
toolbar.setTitle(context.getString(R.string.YourTXTfromXML));