我有三个类:LoginActivity、MapsActivity和MatchAdapter
前两个扩展了AppCompactActivity,最后一个扩展了ArrayAdapter。当我登录时(如果正确的话,在mySQLiteDB上匹配),我曾经获得当前用户的ID_contact,并将其传递给MapsActivity,目的是:
关于我的登录活动:
String contact=databaseHelper.searchID_Contact(username,password);
Intent intent=new Intent(LoginActivity.this,MapsActivity.class);
intent.putExtra("ID_CONTACT",contact);
startActivity(intent);
在MapsActivity上,我可以通过以下方式轻松检索这些数据:
public String getId_contact(String conct){
return conct;
}
@Override
public void onMapReady(GoogleMap googleMap) {
String id_contact1=getIntent().getStringExtra("ID_CONTACT");
String contact=getId_contact(id_contact1);
Toast.makeText(MapsActivity.this, contact, Toast.LENGTH_LONG).show();
}
到目前为止,一切都很好,它显示了当前用户的id。我的问题是将这些数据传递给另一个扩展ArrayAdapter的名为MatchAdapter的类(我不知道如何传递)。
我在MapsActivity:上尝试过这种方式
public class MapsActivity extends AppCompatActivity implements ...{
public String getId_contact(){
String contact=getIntent().getStringExtra("ID_CONTACT");
return contact;
}
因此,在MatchAdaper上尝试以这样的方式检索:
MapsActivity mapsActivity=new MapsActivity();
String text=mapsActivity.getId_contact().toString();
但是什么都没有。。我得到了NULLPOINTEREXCEPTION。。。有人能帮我吗?
好的。。。找到了解决方案。。。On-MatchAdapter扩展阵列适配器
DatabaseHelper databaseHelper=new DatabaseHelper(getContext());
。。。而不是OnClick功能。。。。
databaseHelper.myfunction();
您可以通过以下方式从适配器访问活动的方法,从适配器的构造函数或任何您想要的地方调用此方法。
((ActivityName)context).methodName();
当您创建MapsActivity的新实例时,它与您调用startActivity()时获得的Activity实例不同。这就是为什么会出现空指针异常的基本原因。
更重要的是,您不应该使用"new"手动创建"活动"实例。通常,系统会通过startActivity()等机制为您创建"活动"对象,这就是您应该获得它们的方式。
Himanshu的建议是可行的,如果你的活动恰好是"托管"你的适配器,但这并不总是可以保证的。更好的方法是在构造函数中或作为直接的setter函数将ID直接传递给MatchAdapter。至少,您应该执行"instanceof"检查,以确保您的适配器上下文确实属于MapsActivity类型。
这是我的MatchAdapter`package vincenzo.futsal4you;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.MatchResult;
public class MatchAdapter extends ArrayAdapter{
List list=new ArrayList();
String text1=null;
MatchAdapter matchAdapter;
static String id_contatto3="";
String fatto3="";
Player player=new Player();
public MatchAdapter(Context context, int resource) {
super(context, resource);
}
public void add(Match object) {
list.add(object);
super.add(object);
}
@Override
public int getCount() {
return super.getCount();
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row=convertView;
final Context context = null;
final MatchHolder matchHolder;
final String cc=null;
if (row==null){
LayoutInflater layoutInflater=(LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row=layoutInflater.inflate(R.layout.display_match_row,parent,false);
matchHolder=new MatchHolder();
matchHolder.id_match=(TextView)row.findViewById(R.id.id_partita);
matchHolder.id_contact=(TextView)row.findViewById(R.id.id_contatto);
matchHolder.nome_partita=(TextView)row.findViewById(R.id.nome_partita);
matchHolder.citta=(TextView)row.findViewById(R.id.citta);
matchHolder.indirizzo=(TextView)row.findViewById(R.id.indirizzo);
matchHolder.data=(TextView)row.findViewById(R.id.data);
matchHolder.ora=(TextView)row.findViewById(R.id.ora);
// matchHolder.id_contact=row.findViewById()
matchHolder.join_us = (Button) row.findViewById(R.id.join_us);
row.setTag(matchHolder);
}
else {
matchHolder=(MatchHolder)row.getTag();
}
final Match match=(Match)getItem(position);
// matchHolder.id_contact.setText(mapsActivity.getId_partita().toString());
matchHolder.id_match.setText(match.getId().toString());
matchHolder.nome_partita.setText(match.getName().toString());
matchHolder.citta.setText(match.getCitta().toString());
matchHolder.indirizzo.setText(match.getIndirizzo().toString());
matchHolder.data.setText(match.getData().toString());
matchHolder.ora.setText(match.getOra().toString());
// assert ((MapsActivity) context) != null;
// ((MapsActivity) context).getId_partita();
// final String contact=matchHolder.getId_contatto();
Log.e("BOOOOOO", matchHolder.getId_contatto2());
final String fatto=matchHolder.getId_contatto2();
fatto3=matchHolder.getId_contatto2();
matchHolder.join_us.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
String fatto2=matchHolder.getId_contatto2();
// final String text3=mapsActivity.getId_partita(cc).toString();
RelativeLayout rl = (RelativeLayout) v.getParent();
RelativeLayout r2 = (RelativeLayout) v.getParent();
// TextView tv = (TextView)rl.findViewById(R.id.nome_partita);
TextView tv = (TextView) rl.findViewById(R.id.id_partita);
TextView tv2 = (TextView) r2.findViewById(R.id.id_contatto);
String id_partita = tv.getText().toString();
String text2 = tv2.getText().toString();
Toast.makeText(getContext(), id_partita, Toast.LENGTH_SHORT).show();
// Toast.makeText(getContext(), matchHolder.setId_contatto(contact), Toast.LENGTH_SHORT).show();
Toast.makeText(getContext(),matchHolder.getId_contatto2(),Toast.LENGTH_SHORT).show();
player.setId_contatto(fatto3);
player.setId_partita(id_partita);
// databaseHelper=new DatabaseHelper(context);
// databaseHelper.insertPlayer2(player);
((MapsActivity)context).getJoinPlayer(player);
Toast pass1=Toast.makeText(getContext(), "One Row JOIN US created !", Toast.LENGTH_SHORT);
pass1.show();
}
});
return row;
}
static class MatchHolder{
TextView id_match,nome_partita,citta,indirizzo,data,ora,id_contact;
Button join_us;
public MatchHolder(){}
public String getId_contatto(String id_contatto) {
return id_contatto;
}
public String getId_contatto2() {
return id_contatto3;
}
public void setId_contatto(String id_contatto) {
id_contatto3 = id_contatto;
}
public MatchHolder(String id_contatto){
id_contatto3=id_contatto;
}
}
}
`所以问题是我在一个静态(内部)类(MatchHolder)中声明了一个String(id_contatto3)。向MatchAdapter声明它不知怎么解决了这个问题,但现在我想在onClick内部调用另一个类中的方法(扩展SQLiteOpenhelper的DatabaseHelper)。。
我不能做((DatabaseHelper)context).mymethod()所以我做了以下"技巧"。。。在类MapsActivity中,我以这样的方式创建了一个方法(JoinPlayer):
public void JoinPlayer(Player player){
databaseHelper.insertPlayer(player);
}
其中DatabaseHelper中的insertPlayer(Player)为:
public void insertPlayer(Player player){
try{
db=this.getWritableDatabase();
}
catch(Exception e){
Log.e("ERROR","ERROR");
}
ContentValues contentValues=new ContentValues();
String query="select * from player";
Cursor cursor=db.rawQuery(query,null);
int count=cursor.getCount();
contentValues.put(COLUMN_ID_PLAYER,count);
contentValues.put(COLUMN_ID_MATCH_PLAYER,player.getId_partita());
contentValues.put(COLUMN_ID_CONTACT_PLAYER,player.getId_contatto());
db.insert(TABLE_PLAYER, null, contentValues);
db.close();
}
但Android建议我添加一个null条件(if((MapsActivity)上下文)=null)而不是((MapsActivity)上下文)。JoinPlayer(播放器),但它建议我它将始终为null,这正是我得到的。。。我认为上下文是主要问题,但现在不知道如何解决。有什么想法吗?