首页 > 解决方案 > 如何通过回调方法将点击位置的item传回Activity

问题描述

我正在尝试找到如何将单击的项目返回到 ListActivity(在此 Activity 中,列表适配器已启用)。我通过在适配器中使用 getAdapterPosition() 方法获得该项目。

列表活动

public class ListActivity extends AppCompatActivity implements ListAdapter.ItemClickListener {

//some irrelevant code

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        adapter = new ListAdapter(context, this);

        adapter.setClickListener(this);

        //more irrelevant code
    }
}

Adapter类里面的回调代码

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.RowViewHolder> {
// Adapter class code
...
    class RowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView viewName;
        ImageView viewFlag;
        LinearLayout countryEntry;

        RowViewHolder(View view) {

            super(view);
            viewName = view.findViewById(R.id.name);
            viewFlag = view.findViewById(R.id.flag);
            countryEntry = view.findViewById(R.id.rowId);
            view.setOnClickListener(this);
        }

        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            ListActivity.position = getAdapterPosition();
            final Country currentCountry = countriesList.get(getAdapterPosition());
            listActivity.setCurrentCountry(currentCountry);

        }
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
...
}

整个 Adapter 类(如果你想运行它)

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.RowViewHolder> {

    private ItemClickListener mClickListener;
    FragmentManager fm;
    Activity listActivity;
    private Context context;
    private List<Country> countriesList;

    public ListAdapter(Context context, Activity listActivity) {

        this.fm = fm;
        this.listActivity = listActivity;
        this.context = context;
        countriesList = new ArrayList<>();
    }

    @NotNull
    @Override
    public RowViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(context)
                .inflate(R.layout.row_list, parent,false);

//        context = parent.getContext();
        return new RowViewHolder(itemView);
    }

    class RowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView viewName;
        ImageView viewFlag;

        LinearLayout countryEntry;

        RowViewHolder(View view) {

            super(view);
            viewName = view.findViewById(R.id.name);
            viewFlag = view.findViewById(R.id.flag);
            countryEntry = view.findViewById(R.id.rowId);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
            ListActivity.position = getAdapterPosition();
            final Country currentCountry = countriesList.get(getAdapterPosition());
//todo: can i return currentCountry to the listActivity in order to pass it?
        }
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }

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

        final Country currentCountry = countriesList.get(position);
        int id = currentCountry.getId();

        holder.viewName.setText(countriesList.get(position).getName());

        Uri imageUrl = Uri.parse(String.valueOf(countriesList.get(position).getFlag()));

        SvgLoader.pluck()
                .with(listActivity)//Replace new MainActivity with activity
                .setPlaceHolder(R.mipmap.ic_launcher, R.mipmap.ic_launcher)
                .load(imageUrl, holder.viewFlag);

//        holder.viewFlag.setImageURI(Uri.parse(String.valueOf(countriesList.get(position).getFlag())));
//        holder.countryEntry.setOnClickListener(new View.OnClickListener() {
//        });
    }

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

    public void attachCountriesList(List<Country> countriesList) {
        // getting list from Fragment.
        this.countriesList = countriesList;
    }
}

来自 Activity 的调用是adapter.setClickListener(this);. 我一直在尝试将此调用的结果分配给一个 int 变量,但它没有用。

谢谢!

标签: javaandroidandroid-recyclerview

解决方案


推荐阅读