繁体   English   中英

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

[英]Android - pass data between from an Activity class to an Adapter class

我有3个类别:LoginActivity,MapsActivity和MatchAdapter

前两个扩展了AppCompactActivity,后一个扩展了ArrayAdapter。 当我进行登录时(如果正确,则在mySQLiteDB上匹配),我曾经使用以下方式获取当前用户的ID_contact并将其传递给MapsActivity:

在我的LoginActivity上:

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。 我的问题是甚至将此数据(故意不知道如何)传递给另一个名为MatchAdapter的类,该类扩展了ArrayAdapter。

我在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 ...有人可以帮助我吗?

那么,您可以通过以下方式从适配器访问活动方法,即从适配器的构造函数或所需的任何位置调用此方法。

((ActivityName)context).methodName();

创建MapsActivity的新实例时,这与调用startActivity()时获得的Activity实例不同。 这基本上就是为什么您有一个空指针异常的原因。

更重要的是,您绝不应该使用“新”手动创建活动实例。 通常,系统通过诸如startActivity()之类的机制为您创建Activity对象,这就是您应该如何获取它们的方式。

如果您的活动确实是在“托管”适配器,那么Himanshu的建议可以奏效,但这并不总是可以保证的。 更好的方法是将ID直接传递给您的MatchAdapter,无论是在构造函数中还是作为直接设置函数。 至少,您应该执行“ instanceof”检查,以确保您的适配器上下文确实是MapsActivity类型。

那就是我的MatchAdapter`包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内部调用另一个类(DatabaseHelper)中的方法扩展了SQLiteOpenhelper)。

我无法执行((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建议我添加一个空条件(如果(((MapsActivity)context)!= null)比((MapsActivity)context).JoinPlayer(player),但它告诉我它将始终为null,这正是我所得到的。我认为上下文是主要问题,但是现在不知道如何解决。 任何想法?

好...找到解决方案...在MatchAdapter上扩展ArrayAdapter

DatabaseHelper databaseHelper=new DatabaseHelper(getContext()); ...比OnClick功能...

databaseHelper.myfunction();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM