onItemClick не работает для просмотра карты

Он использует модификацию 2.0 для извлечения данных из веб-службы и привязки их к представлению карты. Когда я нажимаю на представление карты с изображениями и текстовыми представлениями, щелчок не срабатывает, а вызывает странное поведение на самых угловых краях представления карты.

Item_row.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    card_view:cardCornerRadius="1dp">

    <RelativeLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp"
        android:layout_margin="5dp"
        android:clickable="true">

        <ImageView
            android:id="@+id/flowerImage"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:focusable="true"
            android:clickable="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:visibility="visible"/>
        <ImageButton
            android:id="@+id/favIcon"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:scaleType="fitXY"
            android:layout_margin="5dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:descendantFocusability="blocksDescendants"
            android:background="@drawable/ic_favorite_border"
            android:focusable="true"
            android:clickable="true"
            />



        <LinearLayout

            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/flowerImage"

            android:orientation="vertical"
            >

            <TextView
                android:id="@+id/flowerName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Medium Text"
                android:textColor="@color/colorPrimary"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:focusable="true"
                android:clickable="true"
                android:visibility="visible"/>

            <TextView
                android:id="@+id/flowerCategory"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Small Text"
                android:layout_alignBottom="@id/flowerName"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:focusable="true"
                android:clickable="true"
                android:visibility="visible"/>

            <TextView
                android:id="@+id/flowerPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@id/flowerCategory"
                android:text="New Text"
                android:focusable="true"
                android:clickable="true"
                android:visibility="visible"/>

            <TextView
                android:id="@+id/flowerInstruction"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                android:text="New Text"
                android:focusable="true"
                android:clickable="true"/>

        </LinearLayout>


    </RelativeLayout>


</android.support.v7.widget.CardView>

Content_main.xml файл макета

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="8dp"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scrollbars="vertical"/>


        </android.support.v4.widget.SwipeRefreshLayout>


</RelativeLayout>



</LinearLayout>

Файл макета основного занятия activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            android:elevation="8dp"/>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

Кодовая база соответствует шаблону проектирования MVC. Контроллер выполняет работу по получению данных веб-службы

MainActivity.java

package com.innovation.myapp.jwelleryonrent.View;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

import com.innovation.myapp.jwelleryonrent.R;
import com.innovation.myapp.jwelleryonrent.controller.jwelleryController;
import com.innovation.myapp.jwelleryonrent.model.adapter.CustomItemClickListner;
import com.innovation.myapp.jwelleryonrent.model.adapter.JwelleryAdapter;
import com.innovation.myapp.jwelleryonrent.model.pojo.JwelleryCollection;

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

public class MainActivity extends AppCompatActivity implements jwelleryController.JwelleryCallbackListener {
    private Toolbar mToolbar;
    private RecyclerView mRecyclerView;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private List<JwelleryCollection> mJwelleryList = new ArrayList<>();
    private JwelleryAdapter mJwelleryAdapter;
    private jwelleryController mController;
    private boolean isInFavourites = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        configToolbar();
        mController = new jwelleryController(MainActivity.this);
        configViews();



        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });




    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.item_row, container, false);
        ImageButton imgBtn = (ImageButton) findViewById(R.id.favIcon);
        imgBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addItemToBag(v);
            }
        });
        return rootView;
    }


    private void addItemToBag(View v)
    {
        isInFavourites = true;
        ImageButton btnFaviourite = (ImageButton) findViewById(R.id.favIcon);
        if(isInFavourites==true) {

            btnFaviourite.setImageResource(R.drawable.ic_favorite_white_24dp);
        }
        else
            btnFaviourite.setImageResource(R.drawable.ic_favorite_border);
        Snackbar.make(v, "Item added to Favourites", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show();
    }


    private void configToolbar() {
        mToolbar = (Toolbar) this.findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
    }

    private void initializeAdapter()
    {
        mJwelleryAdapter = new JwelleryAdapter(mJwelleryList, new CustomItemClickListner() {
            @Override
            public void onItemClick(View v, int position) {
                Toast.makeText(MainActivity.this, "Clicked Item: "+position,Toast.LENGTH_LONG).show();
            }
        });
        mRecyclerView.setAdapter(mJwelleryAdapter);

        mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.colorAccent),
                getResources().getColor(R.color.colorPrimary),
                getResources().getColor(R.color.colorPrimaryDark));

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mController.startFetching();
            }
        });


    }


    private void configViews() {
        mRecyclerView = (RecyclerView) this.findViewById(R.id.list);
        mSwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
        mController.startFetching();
        initializeAdapter();
//        mJwelleryAdapter= new JwelleryAdapter(mJwelleryList);

    }

        @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

        @Override
        public void onFetchStart() {

        }

        @Override
        public void onFetchProgress(JwelleryCollection jwellery) {
            mJwelleryAdapter.addJwellery(jwellery);
        }

        @Override
        public void onFetchProgress(List<JwelleryCollection> jwelleryList) {

        }

        @Override
        public void onFetchComplete() {
            mSwipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onFetchFailure() {

        }
}

Представление Recycler использует шаблон держателя представления адаптера для инициализации класса адаптера JwelleryAdapter.

package com.innovation.myapp.jwelleryonrent.model.adapter;

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

import com.innovation.myapp.jwelleryonrent.R;
import com.innovation.myapp.jwelleryonrent.View.MainActivity;
import com.innovation.myapp.jwelleryonrent.model.pojo.JwelleryCollection;
import com.innovation.myapp.jwelleryonrent.model.utilities.Constants;
import com.squareup.picasso.Picasso;

import java.util.List;

/**
 * 
 */
public class JwelleryAdapter extends RecyclerView.Adapter<JwelleryAdapter.Holder> {
    private List<JwelleryCollection> mJwelleryCollection;
    CustomItemClickListner  itemListner;
    Context mContext;

    public JwelleryAdapter(List<JwelleryCollection> jwellery) {
        mJwelleryCollection = jwellery;

    }
    public JwelleryAdapter(  List<JwelleryCollection> jwellery,CustomItemClickListner listner) {
        mJwelleryCollection = jwellery;
        this.itemListner = listner;

    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row,parent,false);
        final Holder mViewHolder = new Holder(row);
        row.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                itemListner.onItemClick(v,mViewHolder.getPosition());
            }
        });
        return mViewHolder;
    }



    @Override
    public void onBindViewHolder(JwelleryAdapter.Holder holder, int position) {
        JwelleryCollection currentJwellery = mJwelleryCollection.get(position);
        holder.mName.setText(currentJwellery.mName);
        holder.mCategory.setText(currentJwellery.mCategory);
        holder.mPrice.setText(Double.toString(currentJwellery.mPrice));
        holder.mInstructions.setText(currentJwellery.mInstructions);

        Picasso.with(holder.itemView.getContext()).load(Constants.PHOTO_URL + currentJwellery.mPhoto).into(holder.mImage);


    }
    public void addJwellery(JwelleryCollection jwellery) {
        mJwelleryCollection.add(jwellery);
        notifyDataSetChanged();
    }
    @Override
    public int getItemCount() {
        return mJwelleryCollection.size();
    }
    public class Holder extends RecyclerView.ViewHolder implements View.OnClickListener {
        Context contxt;
        public TextView mName, mCategory, mPrice, mInstructions;
        public ImageView mImage;

        public Holder(View itemView) {
            super(itemView);
            mImage = (ImageView) itemView.findViewById(R.id.flowerImage);
            mName = (TextView) itemView.findViewById(R.id.flowerName);
            mCategory = (TextView) itemView.findViewById(R.id.flowerCategory);
            mPrice = (TextView) itemView.findViewById(R.id.flowerPrice);
            mInstructions = (TextView) itemView.findViewById(R.id.flowerInstruction);




        }


        public Holder(View itemView,int ViewType,Context c) {
        // Creating ViewHolder Constructor with View and viewType As a parameter
            super(itemView);
            contxt = c;
            itemView.setClickable(true);
            itemView.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {

        Toast.makeText(contxt, "The Item Clicked is: " + getPosition(), Toast.LENGTH_SHORT).show();
            }
        }


}

Интерфейс CustomerItemClickListner для обработки элемента строки при нажатии

package com.innovation.myapp.jwelleryonrent.model.adapter;

import android.view.View;

/**
 * 
 */
public interface CustomItemClickListner {
    public void onItemClick(View v,int position);
}



Ответы (1)


Сначала создайте одну переменную вашего интерфейса в вашем адаптере:

CustomItemClickListener mListener;

тогда, как вы установили в своем методе OnClick():

if (mListener != null) {
    mListener.onItemClick(v, getAdapterPosition());
}

и последнее, что вам нужно изменить в вашем адаптере, — это создать новый метод, который вы вызовете позже в своем классе активности для обработки слушателя:

public void setOnItemClickListener(CustomItemClickListener listener) {
     mListener = listener;
}

теперь вы можете вызвать этот метод в своей деятельности следующим образом:

adapter.setOnItemClickListener(this); // implement interface

           // or

adapter.setOnItemClickListener(new CustomItemClickListener());
person Dusan Dimitrijevic    schedule 03.03.2016
comment
переменная для интерфейса уже создана в адаптере, и прослушиватель уже инициализирован в конструкторе адаптера, если вы видите код. Вы предлагаете инициализировать его в setOnItemClickListener? - person Vimal; 03.03.2016
comment
Из MainActivity мне нужно вызвать adapter.setOnItemClickListener(this); где, как если бы вы видели MainActivity.java, он уже имеет mJwelleryAdapter = new JwelleryAdapter(mJwelleryList, new CustomItemClickListner() { @Override public void onItemClick(View v, int position) { Toast.makeText(MainActivity.this, Clicked Item: +position, Toast.LENGTH_LONG).show(); } }); mRecyclerView.setAdapter (mJwelleryAdapter); в методе InitializeAdapter - person Vimal; 03.03.2016
comment
Да, и я уверен, что это сработает, если вы работаете над реализацией прослушивателя для одного пользовательского представления строки. Также, когда вы вызываете метод onItemClick из интерфейса, сначала проверьте, не является ли mListener нулевым. Дайте мне знать, если это работает. - person Dusan Dimitrijevic; 03.03.2016
comment
Удалите свою реализацию интерфейса и сделайте то же самое, что и я. - person Dusan Dimitrijevic; 03.03.2016
comment
Модификация, которую я сделал в InitializeAdapter в MainActivity.Java mJwelleryAdapter.setOnItemClickListner(new CustomItemClickListner() { @Override public void onItemClick(View v, int position) { Toast.makeText(MainActivity.this, Clicked Item: +position,Toast.LENGTH_LONG). показывать(); } }); Созданный метод в классе адаптера public void setOnItemClickListner (CustomItemClickListner listner) { itemListner = listner; } - person Vimal; 03.03.2016
comment
В CreateViewHolder сделано это изменение if(itemListner!=null) itemListner.onItemClick(v,mViewHolder.getPosition()); По-прежнему существует та же проблема, если я нажимаю на карту в любом месте, тост не отображается, но если я нажимаю на угол / край карты где-нибудь, он показывает тост. - person Vimal; 03.03.2016
comment
Какие еще предложения вы можете дать после просмотра моего кода? пожалуйста - person Vimal; 03.03.2016
comment
Могу ли я поделиться с вами всем своим проектом? - person Vimal; 03.03.2016
comment
Можем продолжить обсуждение в чате - person Dusan Dimitrijevic; 03.03.2016
comment
Что касается совместного использования вашего проекта, лучше всего отправить мне текстовый файл с кодом MainActivity и еще один текстовый файл с кодом адаптера. - person Dusan Dimitrijevic; 03.03.2016
comment
Я вижу, вы поместили android:clickable="true" только в представление RelativeLayout. Попробуй положить в корень лейур и чтоб он был в CardView или просто удали. - person Dusan Dimitrijevic; 03.03.2016
comment
Я попытался установить android:clickable=true в карточку и попытался удалить его, но, похоже, он тоже не работает, как я могу прикрепить файлы? - person Vimal; 03.03.2016
comment
проверьте этот ответ stackoverflow.com/questions/27081787/ - person Dusan Dimitrijevic; 03.03.2016
comment
Наконец-то у меня все заработало, спасибо Душану Димитриевичу за быструю помощь, благодаря вам проблема решена. У меня есть еще 1 проблема, которую я разместил по ссылке ниже, не могли бы вы помочь с этим stackoverflow.com/questions/35783827/ - person Vimal; 04.03.2016
comment
Нет проблем, Вимал. Я изучу этот вопрос. - person Dusan Dimitrijevic; 04.03.2016