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