Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t将上下文强制转换到片段的FragmentAdapter中的CustomCallBack接口_Java_Android_Android Fragments_Fragment_Android Cardview - Fatal编程技术网

Java Can';t将上下文强制转换到片段的FragmentAdapter中的CustomCallBack接口

Java Can';t将上下文强制转换到片段的FragmentAdapter中的CustomCallBack接口,java,android,android-fragments,fragment,android-cardview,Java,Android,Android Fragments,Fragment,Android Cardview,我在片段的FragmentAdapter中强制转换上下文时遇到问题。我的应用程序流程是: -当我单击导航列表项(Nav One)时,它将显示带有recyclerview和cardview的片段。 -当我单击cardview列表项的图像时,我希望获得一个显示Toast消息的操作,或者使用名为(CustomCallBack)的costom接口执行一些操作。 这是我的代码: MainActivity.java public class MainActivity extends AppCompatAct

我在片段的FragmentAdapter中强制转换上下文时遇到问题。我的应用程序流程是: -当我单击导航列表项(Nav One)时,它将显示带有recyclerview和cardview的片段。 -当我单击cardview列表项的图像时,我希望获得一个显示Toast消息的操作,或者使用名为(CustomCallBack)的costom接口执行一些操作。 这是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private ListView lvNavigation;
    private DrawerLayout mDrawer;
    private NavigationView mNavigation;
    private LinearLayout llMianContain;
    String[] navigation = new String[]{"Nav One","Nav Two", "Nav Three","Nav Four"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        lvNavigation = (ListView) findViewById(R.id.lv_listView);
        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        mNavigation= (NavigationView) findViewById(R.id.navigation_view);
        llMianContain = (LinearLayout) findViewById(R.id.ll_main_content);

        setSupportActionBar(toolbar);
        lvNavigation.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, navigation));
        lvNavigation.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                replaceFragment(i);
                lvNavigation.setItemChecked(i, true);
                hideDrawer();
            }
        });

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.open, R.string.close);
        mDrawer.setDrawerListener(toggle);
        toggle.syncState();
    }
    private void replaceFragment(int position){
        Fragment fragment = null;
        switch (position){
            case 0:
                fragment = new OneFragment();
                break;
            case 1:
                fragment = new TwoFragment();
                break;
            case 2:
                fragment = new ThreeFragment();
                break;
            case 3:
                fragment= new FourFragment();
                break;
            default:
                fragment = new OneFragment();
                break;
        }
        if(null!= fragment){
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.ll_main_content, fragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    }
    private void hideDrawer(){
        mDrawer.closeDrawer(GravityCompat.START);
    }
    private void showDrawer(){
        mDrawer.openDrawer(GravityCompat.START);
    }
    @Override
    public void onBackPressed() {
        if (mDrawer.isDrawerOpen(GravityCompat.START))
            hideDrawer();
        else
            super.onBackPressed();
    }
}
public类MainActivity扩展了AppCompatActivity{
专用工具栏;
私有列表视图导航;
私人抽屉布置图;
私人导航;
私人线路布局;
字符串[]导航=新字符串[]{“导航一号”、“导航二号”、“导航三号”、“导航四号”};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
lvNavigation=(ListView)findViewById(R.id.lv\u ListView);
mDrawer=(抽屉布局)findViewById(R.id.抽屉布局);
导航=(导航视图)findViewById(R.id.navigation\U视图);
llMianContain=(线性布局)findViewById(R.id.ll\u主内容);
设置支持操作栏(工具栏);
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,导航));
lvNavigation.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
替换片段(i);
lvNavigation.setItemChecked(i,true);
hideDrawer();
}
});
ActionBarDrawerToggle toggle=新的ActionBarDrawerToggle(this,mDrawer,toolbar,R.string.open,R.string.close);
mDrawer.setDrawerListener(切换);
toggle.syncState();
}
私有void replaceFragment(int位置){
片段=空;
开关(位置){
案例0:
fragment=新的OneFragment();
打破
案例1:
fragment=新的TwoFragment();
打破
案例2:
片段=新的三片段();
打破
案例3:
fragment=newfourfragment();
打破
违约:
fragment=新的OneFragment();
打破
}
if(null!=片段){
FragmentManager=getSupportFragmentManager();
FragmentTransaction=manager.beginTransaction();
事务.替换(R.id.ll\u主内容,片段);
transaction.addToBackStack(空);
commit();
}
}
私有void hideDrawer(){
mDrawer.closeDrawer(重力compat.START);
}
私人发票人(){
mDrawer.openDrawer(GravityCompat.START);
}
@凌驾
public void onBackPressed(){
if(mDrawer.isDrawerOpen(重力公司启动))
hideDrawer();
其他的
super.onBackPressed();
}
}
OneFragment.java

public class OneFragment extends Fragment implements FragmentOneAdapter.CustomCallBack{

    private ArrayList<ListItem> listItems;
    private RecyclerView recyclerView;
    private FragmentOneAdapter adapter;

    public OneFragment() { }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.fragment_one, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(manager);
        listItems = new ArrayList<>();
        for(int i=0;i<40;i++){
            listItems.add(new ListItem(R.drawable.ic_account_circle_black_48dp, "MY NAME "+ i));
        }
        adapter = new FragmentOneAdapter(listItems, getActivity());
        recyclerView.setAdapter(adapter);
        return view;
    }

    @Override
    public void onProfileClick(int position) {
        Toast.makeText(getActivity(), "position "+ position, Toast.LENGTH_SHORT).show();
    }
}
public类OneFragment扩展片段实现FragmentOneAdapter.CustomCallBack{
私有ArrayList列表项;
私人回收站;
私有碎片适配器;
公共OneFragment(){}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u one,容器,错误);
recyclerView=(recyclerView)视图.findViewById(R.id.recycler\u视图);
LinearLayoutManager=newlinearlayoutmanager(getActivity());
recyclerView.setLayoutManager(管理器);
listItems=new ArrayList();
对于(inti=0;iHmm

因此,您的片段正在实现CustomCallBack接口

为什么不将片段对象本身传递给适配器呢

例如,在FragmentOneAdapter.java中

更改:

public FragmentOneAdapter(ArrayList<ListItem> listItems, Context context) ===> public FragmentOneAdapter(ArrayList<ListItem> listItems, CustomCallBack callback)
显然,现在在OneFragment.java中

只需将“this”作为参数传递,因为片段本身就是CustomCallBack:

adapter = new FragmentOneAdapter(listItems, getActivity()); ===> adapter = new FragmentOneAdapter(listItems, this);

如果我想在单击ImageIcon时显示向下滑动动画,我该怎么办?我不知道你想做什么。你想要一个拖放动画吗?在这种情况下,ItemTouchHelper.Callback将发挥神奇的作用。看看这个例子:基本上,你做回调来处理滑动或拖动运动,然后使用attachToRec应用它yclerView()方法。
this.customCallBack = (CustomCallBack) context; ===> this.customCallBack = callback;
adapter = new FragmentOneAdapter(listItems, getActivity()); ===> adapter = new FragmentOneAdapter(listItems, this);