简体   繁体   English

我的回收站视图适配器返回null

[英]my adapter of recycler view returning null

I am trying to use a RecyclerView with an adapter to call a specific person. 我正在尝试使用带有适配器的RecyclerView来呼叫特定人员。 In the adapter I am using a call button and taking a reference from PlaceCallActivity . 在适配器中,我使用呼叫按钮并从PlaceCallActivity获取引用。 The problem is that PlaceCallActivity is using the above values which I can't access from the adapter. 问题是PlaceCallActivity使用的是我无法从适配器访问的上述值。 Thanks in advance for your help. 在此先感谢您的帮助。

My PlaceCallActivity: 我的PlaceCallActivity:

package techheromanish.example.com.videochatapp;

import com.sinch.android.rtc.calling.Call;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class PlaceCallActivity extends BaseActivity {

    private Button mCallButton;
    private EditText mCallName;

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private List<ListItem> listItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainn);

        //initializing UI elements
        //mCallName = (EditText) findViewById(R.id.callName);
        mCallButton = (Button) findViewById(R.id.callButton);
        //mCallButton.setEnabled(false);
        //mCallButton.setOnClickListener(buttonClickListener);

        Button stopButton = (Button) findViewById(R.id.stopButton);
        stopButton.setOnClickListener(buttonClickListener);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        listItems = new ArrayList<>();

//        loadRecyclerViewData();

        ListItem listItem = new ListItem(
                R.drawable.user,
                "Jawad",
                "Android Developer");
        listItems.add(listItem);

        ListItem listItem1 = new ListItem(
                R.drawable.user,
                "Malik",
                "Developer");


        listItems.add(listItem1);

        adapter = new MyAdapter(listItems, this);
        recyclerView.setAdapter(adapter);

    }

    // invoked when the connection with SinchServer is established
    @Override
    protected void onServiceConnected() {
        TextView userName = (TextView) findViewById(R.id.loggedInName);
        userName.setText(getSinchServiceInterface().getUserName());
        //mCallButton.setEnabled(true);
    }

    @Override
    public void onDestroy() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        super.onDestroy();
    }

    //to kill the current session of SinchService
    private void stopButtonClicked() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        finish();
    }

    //to place the call to the entered name
    public void callButtonClicked(String user) {
        //String userName = mCallName.getText().toString();
        if (user.isEmpty()) {
            Toast.makeText(this, "Please enter a user to call", Toast.LENGTH_LONG).show();
            return;
        }

        Call call = getSinchServiceInterface().callUserVideo(user);
        String callId = call.getCallId();
        Intent callScreen = new Intent(this, CallScreenActivity.class);
        callScreen.putExtra(SinchService.CALL_ID, callId);
        startActivity(callScreen);
    }


    private OnClickListener buttonClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.callButton:
                    String str = MyAdapter.getStr();
                    Toast.makeText(PlaceCallActivity.this, "" + str, Toast.LENGTH_SHORT).show();
                    //callButtonClicked(str);
                    break;

                case R.id.stopButton:
                    stopButtonClicked();
                    break;
            }
        }
    };
}


and MyAdapter Class: 和MyAdapter类:

package techheromanish.example.com.videochatapp;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<ListItem> listItems;
    private Context context;
    private static String str;

    public MyAdapter(List<ListItem> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_view, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final ListItem listItem = listItems.get(position);

        holder.imageViewProfile.setImageResource(listItem.getImage());
        holder.textViewName.setText(listItem.getName());
        holder.textViewBio.setText(listItem.getBio());

        /*Picasso.with(context)
                .load(listItem.getImageUrl())
                .into(holder.imageView);
*/
//        str = listItem.getName();

        holder.callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "You Clicked " + listItem.getName(), Toast.LENGTH_SHORT).show();
                PlaceCallActivity placeCallActivity = new PlaceCallActivity();
                placeCallActivity.callButtonClicked(listItem.getName());
            }
        });

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBio;
        public ImageView imageViewProfile;
        public Button callButton;

        ViewHolder(View itemView) {
            super(itemView);

            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            textViewBio = (TextView) itemView.findViewById(R.id.textViewBio);
            imageViewProfile = (ImageView) itemView.findViewById(R.id.imageViewProfile);
            callButton = (Button) itemView.findViewById(R.id.callButton);


        }
    }

    public static String getStr() {
        return str;
    }
}

In this adapter I am using button to call from PlaceCallActivity . 在此适配器中,我使用按钮从PlaceCallActivity进行调用。

Please change this: 请更改此:

private RecyclerView.Adapter adapter;

to this: 对此:

private MyAdapter adapter;

you can create an interface: 您可以创建一个界面:

public interface CallButtonClickListener{
    void onButtonClicked(String name);
}

Edit 编辑

public class PlaceCallActivity extends BaseActivity {
    private Button mCallButton;
    private EditText mCallName;

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private List<ListItem> listItems;

    //new code
    private CallButtonClickListener buttonListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainn);

        //initializing UI elements
        //mCallName = (EditText) findViewById(R.id.callName);
        mCallButton = (Button) findViewById(R.id.callButton);
        //mCallButton.setEnabled(false);
        //mCallButton.setOnClickListener(buttonClickListener);

        Button stopButton = (Button) findViewById(R.id.stopButton);
        stopButton.setOnClickListener(buttonClickListener);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        listItems = new ArrayList<>();

//        loadRecyclerViewData();

        ListItem listItem = new ListItem(
                R.drawable.user,
                "Jawad",
                "Android Developer");
        listItems.add(listItem);

        ListItem listItem1 = new ListItem(
                R.drawable.user,
                "Malik",
                "Developer");


        listItems.add(listItem1);

         //implement the logic there
        adapter = new MyAdapter(listItems, this, new CallButtonClickListener(){
         @Override
         public void onButtonClicked(String name){
            //your code here.
         }
       });
        recyclerView.setAdapter(adapter);

    }

    // invoked when the connection with SinchServer is established
    @Override
    protected void onServiceConnected() {
        TextView userName = (TextView) findViewById(R.id.loggedInName);
        userName.setText(getSinchServiceInterface().getUserName());
        //mCallButton.setEnabled(true);
    }

    @Override
    public void onDestroy() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        super.onDestroy();
    }

    //to kill the current session of SinchService
    private void stopButtonClicked() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        finish();
    }

    //to place the call to the entered name
    public void callButtonClicked(String user) {
        //String userName = mCallName.getText().toString();
        if (user.isEmpty()) {
            Toast.makeText(this, "Please enter a user to call", Toast.LENGTH_LONG).show();
            return;
        }

        Call call = getSinchServiceInterface().callUserVideo(user);
        String callId = call.getCallId();
        Intent callScreen = new Intent(this, CallScreenActivity.class);
        callScreen.putExtra(SinchService.CALL_ID, callId);
        startActivity(callScreen);
    }


    private OnClickListener buttonClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.callButton:
                    String str = MyAdapter.getStr();
                    Toast.makeText(PlaceCallActivity.this, "" + str, Toast.LENGTH_SHORT).show();
                    //callButtonClicked(str);
                    break;

                case R.id.stopButton:
                    stopButtonClicked();
                    break;
            }
        }
    };
}

Adapter 适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<ListItem> listItems;
    private Context context;
    private static String str;
    private CallButtonClickListener buttonListener;

    public MyAdapter(List<ListItem> listItems, Context context, CallButtonClickListener buttonListener) {
        this.listItems = listItems;
        this.context = context;
        this.buttonListener = buttonListner;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_view, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final ListItem listItem = listItems.get(position);

        holder.imageViewProfile.setImageResource(listItem.getImage());
        holder.textViewName.setText(listItem.getName());
        holder.textViewBio.setText(listItem.getBio());

        /*Picasso.with(context)
                .load(listItem.getImageUrl())
                .into(holder.imageView);
*/
//        str = listItem.getName();

        holder.callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "You Clicked " + listItem.getName(), Toast.LENGTH_SHORT).show();


            buttonListener.onButtonClicked(listItem.getName());

            }
        });

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBio;
        public ImageView imageViewProfile;
        public Button callButton;

        ViewHolder(View itemView) {
            super(itemView);

            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            textViewBio = (TextView) itemView.findViewById(R.id.textViewBio);
            imageViewProfile = (ImageView) itemView.findViewById(R.id.imageViewProfile);
            callButton = (Button) itemView.findViewById(R.id.callButton);


        }
    }

    public static String getStr() {
        return str;
    }
}

creating an instance of an activity wouldn't make it go through its lifecycle; 创建活动的实例不会使其经历整个生命周期; if the declaration of the properties which are necessary to make the code run is dependent on your activity's lifecycle then calling the method on the properly initialized activity instance should solve this. 如果使代码运行所必需的属性声明取决于您活动的生命周期,则在正确初始化的活动实例上调用方法应该可以解决此问题。

MyAdapter class: MyAdapter类:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<ListItem> listItems;
    private Context context;
    private PlaceCallActivity placeCallActivity;
    private static String str;

    public MyAdapter(List<ListItem> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
        // this.placeCallActivity now references the parent activity instance
        this.placeCallActivity=(PlaceCallActivity)context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_view, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final ListItem listItem = listItems.get(position);

        holder.imageViewProfile.setImageResource(listItem.getImage());
        holder.textViewName.setText(listItem.getName());
        holder.textViewBio.setText(listItem.getBio());

        /*Picasso.with(context)
                .load(listItem.getImageUrl())
                .into(holder.imageView);
*/
//        str = listItem.getName();

        holder.callButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "You Clicked " + listItem.getName(), Toast.LENGTH_SHORT).show();
                placeCallActivity.callButtonClicked(listItem.getName());
            }
        });

    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBio;
        public ImageView imageViewProfile;
        public Button callButton;

        ViewHolder(View itemView) {
            super(itemView);

            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            textViewBio = (TextView) itemView.findViewById(R.id.textViewBio);
            imageViewProfile = (ImageView) itemView.findViewById(R.id.imageViewProfile);
            callButton = (Button) itemView.findViewById(R.id.callButton);


        }
    }

    public static String getStr() {
        return str;
    }
}

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

相关问题 Recycler View线性布局管理器返回null - Recycler View linear layout manager returning null 在回收站视图中未连接适配器 - No adapter attached in Recycler View 将适配器设置为回收站视图时,出现空指针异常 - Null pointer exception while setting adapter to the recycler view 我在“回收者”视图中获得了空引用 - I get a Null Reference on my Recycler View 为什么在搜索项目时清除回收者视图适配器? - Why my recycler view adapter clearing during search for items? 圆形水平回收器视图适配器 - Circular horizontal Recycler View Adapter 设置它们后,Recycler View模型/适配器未返回预期值。 使用ArrayLists - Recycler View model/adapter isn't returning the expected values after setting them. Using ArrayLists 回收站视图:未连接适配器; 跳过布局(API 的回收站视图中的错误) - Recycler view: no adapter attached; skipping layout(Error in recycler view for API ) 在我的 Recycler View 的 Adapter 类中的 OnTouch 和 onClick 事件中出现问题 - Getting problem in OnTouch and onClick Events in my Adapter class of my Recycler View 列表视图中的Json数据在基本适配器类中返回null - Json data in a list view returning null in base adapter class
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM