java - 如何在recyclerview适配器中使用getItematposition()作为ListView

标签 java android android-listview android-recyclerview

我有一个RecyclerViewAdapter,它用StoreName、图像等填充我的列表,我有listitems.ok的模型,我正在从ListView迁移到recyclerview。我想单击任何项​​目并获取该项目数据(例如商店名称)以及对另一个 Activity 的 Intent ,现在的问题是当我单击项目时它会给出错误的商店名称。但是当我使用 onItemclickListener 提供正确的输入时。我会告诉你..

这是我的RecyclerViewAdapter

 public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.DataObjectHolder> {
    private static String LOG_TAG = "MyRecyclerViewAdapter";
    private List<StoresItem> mDataset;
    private static MyClickListener myClickListener;
    Context context;

    Bitmap xx;

    public MyRecyclerViewAdapter(Context context, List<StoresItem> myDataset)
    {
        mDataset = myDataset;
    }

    public static class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView txtStoreName,txtDeliveryTime;
        ImageView storeImg;
        RatingBar ratingBar;



        public DataObjectHolder(View itemView)
        {


            super(itemView);
            txtStoreName = (TextView) itemView.findViewById(R.id.txtStoreName);
            txtDeliveryTime = (TextView) itemView.findViewById(R.id.txtDeliveryTime);
            storeImg = (ImageView) itemView.findViewById(R.id.storeImg);
            ratingBar=(RatingBar)itemView.findViewById(R.id.ratingBar);
            Log.i(LOG_TAG, "Adding Listener");
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v)
        {

            myClickListener.onItemClick(getLayoutPosition(), v);
        }
    }



    public void setOnItemClickListener(MyClickListener myClickListener)
    {
        this.myClickListener = myClickListener;
    }



    @Override
    public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.storelist, parent, false);

        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(DataObjectHolder holder, int position)
    {

        ImageView storeImg;

        holder.txtStoreName.setText(mDataset.get(position).gettxtStoreName().toString());
        holder.txtDeliveryTime.setText(mDataset.get(position).gettxtDeliveryTime().toString());
        holder.ratingBar.setFocusable(false);


        int loader = R.drawable.image;

        String url = mDataset.get(position).getstoreImg().toString();

        ImageLoader imgLoader = new ImageLoader(context);

        imgLoader.DisplayImage(url,loader,holder.storeImg);


    }



    public void addItem(StoresItem dataObj, int index) {
        mDataset.add(dataObj);
        notifyItemInserted(index);
    }

    public void deleteItem(int index) {
        mDataset.remove(index);
        notifyItemRemoved(index);
    }

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

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

    public Object getItem(int position)
    {
        return mDataset.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return mDataset.indexOf(getItem(position));
    }


    @Override
    public int getItemViewType(int position)
    {
        return super.getItemViewType(position);
    }
}

这是我的StoreModel

public class StoresItem
{
        private String txtStoreName, txtDeliveryTime, storeImg;

        public StoresItem(String txtStoreName, String txtDeliveryTime,String storeImg)
        {

            this.txtStoreName = txtStoreName;
            this.txtDeliveryTime = txtDeliveryTime;
            this.storeImg = storeImg;

        }

    public String gettxtStoreName()
    {
        return txtStoreName;
    }

    public void settxtStoreName(String txtStoreName)
    {
        this.txtStoreName = txtStoreName;
    }

    public String gettxtDeliveryTime()
    {
        return txtDeliveryTime;
    }

    public void settxtDeliveryTime(String txtDeliveryTime)
    {
        this.txtDeliveryTime = txtDeliveryTime;
    }

    public String getstoreImg()
    {
        return storeImg;
    }

    public void setstoreImg(String storeImg)
    {
        this.storeImg = storeImg;
    }


}

这是我使用 onclickListner 的 fragment 。

 public class RecylerFragment extends Fragment
{

    ListView storeListView;
    List<StoresItem> storesItem;
    StoresListAdaptor adapter;
    String selectedStore;

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;



    public static final String[] storeNameGrocery = new String[]
            {
                    "Value Store", "Grocery Mart", "Wild Water-Sadar Bazar", "Store99","Coco-Buzz", "Wild Water - Sector 46"
            };
    public static final String[] storeNameFresh = new String[]
            {
                    "Mother's Love", "The Flower Shop", "Flower N Emotions"
            };
    public static final String[] storeNameElectronics = new String[]
            {
                    "Molife-Sheetla Mata Road", "Apple Store- Shona Road", "Vandana Communication", "Samsung Store","JMD Mobile - Sector 14", "Sterling - Gurgaon"
            };
    public static final String[] storeNameVegetable = new String[]
            {
                    "Fortune Store", "Best Food - Mega Mall", "Sadar Bazar", "MTR Store","Coco-Buzz"
            };

    public static final String[] deliveryTime = new String[]
            {
                    "20min", "10min", "9min", "15min","30min", "1hr","20min","20min", "10min", "9min", "15min","30min", "1hr","20min" };


    private static final String KEY_POSITION="position";



    public static final String[] iconsUrl = new String[]
            {
                    "http://icons.iconarchive.com/icons/femfoyou/angry-birds/96/angry-bird-icon.png",
                    "http://icons.iconarchive.com/icons/rokey/the-blacy/96/grimace-icon.png",
                    "http://wcdn1.dataknet.com/static/resources/icons/set106/fec007de.png",
                    "http://cdn4.aptoide.com/imgs/7/6/e/76e0376928b8393227a150fbed5d6b4a_icon_96x96.png",
                    "http://vaivocabulary.com/vai/images/android.png",
                    "http://cdn4.aptoide.com/imgs/7/6/e/76e0376928b8393227a150fbed5d6b4a_icon_96x96.png",
                    "http://vaivocabulary.com/vai/images/android.png",
                    "http://wcdn1.dataknet.com/static/resources/icons/set106/fec007de.png",
            };


    public RecylerFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.activity_recycler_view, container, false);


        Bundle bundle = this.getArguments();
        String myString = bundle.getString("page_position");

        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);


        RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL);
        mRecyclerView.addItemDecoration(itemDecoration);

        // Code to Add an item with default animation
        //((MyRecyclerViewAdapter) mAdapter).addItem(obj, index);

        // Code to remove an item with default animation
        //((MyRecyclerViewAdapter) mAdapter).deleteItem(index);


        storesItem = new ArrayList<StoresItem>();

        if(myString.equals("999")) {
            for (int i = 0; i < storeNameGrocery.length; i++) {
                StoresItem item = new StoresItem(storeNameGrocery[i], "Delivery Time " + deliveryTime[i],iconsUrl[i]);
                storesItem.add(item);
            }
        }

        else if(myString.equals("888")) {
            for (int i = 0; i < storeNameFresh.length; i++) {
                StoresItem item = new StoresItem(storeNameFresh[i], "Delivery Time " + deliveryTime[i], iconsUrl[i]);
                storesItem.add(item);
            }
        }

        else if(myString.equals("777")) {
            for (int i = 0; i < storeNameElectronics.length; i++) {
                StoresItem item = new StoresItem(storeNameElectronics[i], "Delivery Time " + deliveryTime[i], iconsUrl[i]);
                storesItem.add(item);
            }
        }

        else if(myString.equals("666")) {
            for (int i = 0; i < storeNameVegetable.length; i++) {
                StoresItem item = new StoresItem(storeNameVegetable[i], "Delivery Time " + deliveryTime[i], iconsUrl[i]);
                storesItem.add(item);
            }
        }

        mAdapter = new MyRecyclerViewAdapter(getActivity(), storesItem);
        mRecyclerView.setAdapter(mAdapter);




        return rootView;
    }


    **@Override
    public void onResume() {
        super.onResume();
        ((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new MyRecyclerViewAdapter.MyClickListener()
        {
        @Override
         public void onItemClick(int position, View v)
        {
            System.out.println(" Clicked on Item " + position);
            StoresItem storesItems = (StoresItem) ((MyRecyclerViewAdapter) mAdapter).getItem(position);
            Bundle args = new Bundle();
            Intent in = new Intent(getActivity(), ProductActivity.class);
            args.putString("SelectedStoreName", storesItems.gettxtStoreName().toString());
            in.putExtras(args);
            startActivity(in);
        }
       });
    }**


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
}

okk...recyclerviews-onItemclicklister 有问题,因为 listviews - onItemCLicklistner() 提供 Adapterview ,我可以像这样使用 parent.getItematposition(position) 简单地获取 Item。

 storeListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            StoresItem storesItems = (StoresItem) parent.getItemAtPosition(position);
            Bundle args = new Bundle();
            Intent in = new Intent(getActivity(), ProductActivity.class);
            args.putString("SelectedStoreName", storesItems.gettxtStoreName().toString());
            in.putExtras(args);
            startActivity(in);

        }
    });

任何人都可以告诉我 getWrong StoreName 的原因是什么吗??

最佳答案

您正在使用 myClickListener.onItemClick(getLayoutPosition(), v); 您必须使用 myClickListener.onItemClick(getAdapterPosition(), v);

关于java - 如何在recyclerview适配器中使用getItematposition()作为ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099249/

相关文章:

java - 将对象添加到二叉搜索树

java - 如何在 apache poi 上设置元素的 Z 顺序?

java - 为什么从 Android 应用程序访问数据库不安全?

android - 在android中使一个单元格横跨两行

android - 如何向字体 TextView 类添加多种字体?

java - 为什么添加这 3 行可以防止 NullPointerException?

java - 使用自定义比较器时使用 TreeSet 还是 ArrayList 更好

java - Android App addTextChangedListner

android - 如何增加或减少listview每一行中edittext的值?

android - 异步任务加载器、谷歌云消息、同步适配器未正确连接、阵列适配器