Android-在Activity类和Adapter类之间传递数据



我有三个类: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,这正是我得到的。。。我认为上下文是主要问题,但现在不知道如何解决。有什么想法吗?

最新更新