Действие OnClick выдает ошибку в макете сетки ресайклера

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Это мой код MainActivity.При этом мы получаем ошибку в setOnItemClickListener как исключение с нулевым указателем, и это останавливает мое приложение. дайте мне несколько предложений, где я ошибаюсь. Я пытаюсь создать пользовательскую сетку с изображением сверху и заголовком рядом с ней.

 public class MainActivity extends AppCompatActivity  {

//RecyclerView recyclerView;
private static final String TAG = "MainActivity";

    private final String android_version_names[] = {
            "Donut",
            "Eclair",
            "Froyo",
            "Gingerbread",
            "Honeycomb",
            "Ice Cream Sandwich",
            "Jelly Bean",
            "KitKat",
            "Lollipop",
            "Marshmallow"
    };

    private final String android_image_urls[] = {
            "https://api.learn2crack.com/android/images/donut.png",
            "https://api.learn2crack.com/android/images/eclair.png",
            "https://api.learn2crack.com/android/images/froyo.png",
            "https://api.learn2crack.com/android/images/ginger.png",
            "https://api.learn2crack.com/android/images/honey.png",
            "https://api.learn2crack.com/android/images/icecream.png",
            "https://api.learn2crack.com/android/images/jellybean.png",
            "https://api.learn2crack.com/android/images/kitkat.png",
            "https://api.learn2crack.com/android/images/lollipop.png",
            "https://api.learn2crack.com/android/images/marshmallow.png"
    };

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


    initViews();


}

private void initViews(){
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2);
    recyclerView.setLayoutManager(layoutManager);

    ArrayList<AndroidVersion> androidVersions = prepareData();
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
    recyclerView.setAdapter(adapter);

    DataAdapter mAdapter = null ;

    mAdapter.setOnItemClickListener(new DataAdapter.ClickListener() {
        @Override
        public void onItemClick(int position, View v) {

            Log.d(TAG, "onItemClick position: "   position);
        }

    });


}
private ArrayList<AndroidVersion> prepareData(){

    ArrayList<AndroidVersion> android_version = new ArrayList<>();
    for(int i=0;i<android_version_names.length;i  ){
    AndroidVersion androidVersion = new AndroidVersion();
    androidVersion.setAndroid_version_name(android_version_names[i]);
    androidVersion.setAndroid_image_url(android_image_urls[i]);
    android_version.add(androidVersion);
    }
    return android_version;
    }

    }
 

Это мой код адаптера.

 public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<AndroidVersion> android;
private Context context;
private static ClickListener clickListener;

public DataAdapter(Context context,ArrayList<AndroidVersion> android) {
    this.android = android;
    this.context = context;
}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_android.setText(android.get(i).getAndroid_version_name());
    Picasso.with(context).load(android.get(i).getAndroid_image_url()).resize(240, 120).into(viewHolder.img_android);
}

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

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    private TextView tv_android;
    private ImageView img_android;
    public ViewHolder(View view) {
        super(view);
        view.setOnClickListener(this);




        tv_android = (TextView)view.findViewById(R.id.tv_android);
        img_android = (ImageView) view.findViewById(R.id.img_android);
    }
    @Override
    public void onClick(View v) {
        clickListener.onItemClick(getAdapterPosition(), v);
    }
}
public void setOnItemClickListener(ClickListener clickListener) {
    DataAdapter.clickListener = clickListener;
}

public interface ClickListener {
    void onItemClick(int position, View v);

}

}
 

Ответ №1:

вы устанавливаете mAdapter = null перед настройкой setOnItemClickListener , удалите его

 DataAdapter mAdapter = null ; //remove this line

adapter.setOnItemClickListener(new DataAdapter.ClickListener() {
    @Override
    public void onItemClick(int position, View v) {

        Log.d(TAG, "onItemClick position: "   position);
    }

});
 

вы вызываете неправильный адаптер, ваша фактическая переменная adapter , и вы вызываете ее с mAdapter помощью, также устанавливая ее значение в ull

Комментарии:

1. сейчас я получаю ошибку, которая не устранена. извините, я не профессионал.

2. да, потому что ваше имя адаптера — adapter, а не mAdapter

3. спасибо, приложение запущено сейчас, но после нажатия кнопки shutdown без ошибок

Ответ №2:

Попробуйте это

 DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
recyclerView.setAdapter(adapter);


adapter.setOnItemClickListener(new DataAdapter.ClickListener() {
    @Override
    public void onItemClick(int position, View v) {

        Log.d(TAG, "onItemClick position: "   position);
    }

});