【问题标题】:Create ActionBar Tabs with Fragments + viepage and recyclerView使用 Fragments + viepage 和 recyclerView 创建 ActionBar 选项卡
【发布时间】:2017-08-31 03:07:30
【问题描述】:

大家好,我是 android 的菜鸟,所以请多多包涵!

我使用下面的示例创建了一个带有四个选项卡式片段的 recyclerview,每个片段显示我正在为其创建应用程序的本地团队的列表(卡片视图)。

Recyclerview example

我想在每个片段中添加一个 onclicklistener 并尝试使用 if position 方法,就像我几年前创建类似应用程序时所做的那样,但 get position 方法已被贬值。

我知道我可以在适配器中放置 onviewbind 方法,但我被告知这不是最好的方法,(我无法让它工作)并且点击侦听器应该放置在片段中,因为这样你可以重用我想要做的适配器,因为当有人在其中一个片段中进行选择时,我想在另一个片段中创建另一个列表,然后将包含一个可扩展列表。

我的适配器

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

private String[] mDataset;

public static class MyViewHolder extends RecyclerView.ViewHolder{
    public CardView mCardView;
    public TextView mTextView;
    public MyViewHolder(View v){
        super(v);

        mCardView = (CardView) v.findViewById(R.id.card_view);
        mTextView = (TextView) v.findViewById(R.id.tv_text);

    }

}

public MyAdapter(String[] myDataset){
    mDataset = myDataset;
}

@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position){
    holder.mTextView.setText(mDataset[position]);
}

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

我的片段

public class BlankFragment extends Fragment {

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

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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_blank, container, false);

    RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
    rv.setHasFixedSize(true);
    MyAdapter adapter = new MyAdapter(new String[]{"Example One", "Example Two", "Example Three", "Example Four", "Example Five" , "Example Six" , "Example Seven"});
    rv.setAdapter(adapter);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);

    return rootView;
}

}

我已经尝试了各种方法来使其正常工作,但我一直面临错误或贬值的代码。

任何人都可以将我链接到教程吗?这将帮助我或帮助我使用一些代码来解决这个问题!提前致谢

【问题讨论】:

  • 你想做什么?你想有一个监听器,当在列表中单击一个项目时会通知它?
  • 我想在单击列表中的项目时开始另一个活动,然后我计划使用另一个适配器或相同的采用者创建另一个具有可扩展列表的列表视图

标签: android android-fragments android-recyclerview android-cardview


【解决方案1】:

您可以在适配器中创建一个接口,如 onItemClickedListener,使用方法 onItemClicked(int position) 和适配器中的公共方法 setOnItemClickListener 来初始化适配器中的 onItemClickedListener 实例,从片段和 onBindViewHolder添加setOnClickListener,检查onItemClickListener是否不为空,然后调用方法onItemClicked(int position),你的代码会是这样的

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

    private String[] mDataset;

    private onItemClickListener onItemClickListener;

    interface onItemClickListener{
        void onItemClicked(int position)
    }

    public void setOnItemClickListener(onItemClickListener 
    onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        public CardView mCardView;
        public TextView mTextView;

        public MyViewHolder(View v){
            super(v);

            mCardView = (CardView) v.findViewById(R.id.card_view);
            mTextView = (TextView) v.findViewById(R.id.tv_text);

        }

    }

    public MyAdapter(String[] myDataset){
        mDataset = myDataset;
    }

    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position){
        holder.mTextView.setText(mDataset[position]);
        holder.mTextView.setOnClickListener(new View.OnClickListener(){
            @Override
                public void onClick(View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClicked(position);
                    }
                }
        });
    }

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

    }

你的片段看起来像

public class BlankFragment extends Fragment {

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

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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_blank, container, false);

    RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
    rv.setHasFixedSize(true);
    MyAdapter adapter = new MyAdapter(new String[]{"Example One", "Example Two", "Example Three", "Example Four", "Example Five" , "Example Six" , "Example Seven"});
    rv.setAdapter(adapter);
    adapter.setOnItemClickListener(new MyAdapter.onItemClickListener){
             @Override
            public void onItemClicked(int pos) {
         // DO here what you want ot do on item clicked
            }
    });
    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);

    return rootView;
}
}

【讨论】:

  • 嗨,我试过了,它说无法解析方法 setonitemclicklistener 匿名 view.view onclicklistener in myadapter 并且无法解析片段中的 onclicklister
  • 我的错,你必须在适配器上设置OnItemClickListener,在onBindViewHolder中设置OnClickListener,我已经修复了
  • 没问题感谢您的帮助在 MyAdapter 类中,当我这样做时,onbindviewholder 中的 intposition 应该设置为 final (新的 MyAdapter.OnItemClickListener)无法解析 onitemclicklistener。
  • 如果你想在接口实现中使用变量,那么它必须是最终的。
  • 你在MyAdapter中创建接口了吗,interface onItemClickListener{ void onItemClicked(int position) }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多