我是Android开发的新手。出于学习目的,我正在尝试创建一个可滑动的轮播式东西。我在ViewPager的帮助下这样做,然后使用PagerAdapter。
我正在使用 JSON 数据填充视图,它工作正常。使用 JSON 加载和显示数据没有问题。问题是当我尝试在轮播活动中获取当前视图的数据时出现空指针异常。
我想在我的视图页中复制/烘烤当前视图中的数据。就此而言,我正在尝试获取当前视图,然后获取带有findViewById()
的相关文本视图,但它会抛出空指针异常。
我什至尝试过findViewWithTag()
,但再次失败了。一些研究告诉我,你必须在膨胀视图的帮助下,只在适配器类中获取文本视图。不过我并没有完全理解它。
下面给出的是我的旋转木马适配器.java文件:
public class CarouselAdapter extends PagerAdapter {
Context context;
public static LayoutInflater inflater=null;
List<CarouselModel> result;
public CarouselAdapter(CarouselPage carouselPage, List<CarouselModel> contentData) {
result=contentData;
context= carouselPage;
inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public class SlideHolder {
TextView description;
}
@Override
public int getCount() {
return this.result.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return (view==(LinearLayout)object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
SlideHolder holder = new SlideHolder();
inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.carousel_adapter,container,false);
TextView tv = (TextView) view.findViewById(R.id.txtdescription);
holder.description = tv;
holder.description.setText(result.get(position).getDescription());
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((LinearLayout)object);
}
}
它还使用了一个模型类,如下所示:
public class CarouselModel {
String description;
public CarouselModel(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
现在在我的轮播活动中.java,我有如下事情发生:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.carousel_page);
content = (ViewPager) findViewById(R.id.viewpager);
cNextButton = (ImageButton) findViewById(R.id.carousel_next);
cPrevButton = (ImageButton) findViewById(R.id.carousel_prev);
// This button creates problem, and returns the null pointer error
cCopyButton = (ImageButton) findViewById(R.id.carousel_copy);
// This function loads up data from JSON to show in different views, and it works fine
retrieveJSON();
content.addOnPageChangeListener(viewListener);
tv = content.findViewById(R.id.txtdescription);
cNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
content.setCurrentItem(cCurrentPage + 1);
}
});
cPrevButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
content.setCurrentItem(cCurrentPage - 1);
}
});
cCopyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast toast = Toast.makeText(getApplicationContext(), "Text is " + msg, Toast.LENGTH_LONG);
toast.show();
}
});
}
private void retrieveJSON() {
....
}
ViewPager.OnPageChangeListener viewListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int j) {
}
@Override
public void onPageSelected(int i) {
cCurrentPage = i;
//Have also tried this logic, but it returned null pointer error again
//View view = content.getRootView();
//tv = view.findViewById(R.id.txtdescription);
if(i == 0) {
cNextButton.setEnabled(true);
cPrevButton.setEnabled(false);
} else if(i == content.getChildCount()) {
cNextButton.setEnabled(false);
cPrevButton.setEnabled(true);
} else {
cNextButton.setEnabled(true);
cPrevButton.setEnabled(true);
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
};
谁能指出我在这里做错了什么?
您可以通过两种方式做到这一点。
- 使用
Interface
. 通过使用接口,您必须创建一个类似onGetText(String text)
.此文本指示您要在位于"活动"中的"文本视图"中设置此文本(假定活动处于活动状态)。因此,在您的活动中实现接口,并在查看页面的页面更改时调用接口方法
注意:我只是举一个例子,你只想传递文本。但是如果你愿意,你可以通过其他东西。
示例代码:
public interface Communicator{
void onGetText(String text);
}
在您的活动中:
class CarouselActivity implements Communicator{
.....
@Override
void onGetText(String text){
// You have activity so now access your textView
}
}
您必须初始化接口:
viewPgaerAdapter.init(this);
视图寻呼机中的最新更改:
private Communicator callback;
public void init(Communicator c){
callback = c;
}
....
@Override
onPageSelected(...){
if(callback!=null){
callback.onGetText(yourText);
}
}
- 使用活动实例。 您必须在视图寻呼机中传递活动上下文。并且活动的文本视图必须是公开的。然后
((ActivityName)mContext)publicTextViewOfActivity
mContext 是您传递的上下文。
我想你会得到一些想法。
您可以将方法添加到适配器,该方法使用cCurrentPosition
返回当前选定的CarouselModel
它看起来像这样
public CarouselModel getItem(Integer position) {
return result.get(position)
}
我假设您正在活动中创建适配器实例,在这种情况下保存适配器的实例,并修改活动的代码:
cCopyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String msg = mPagerAdapter.getItem(cCurrentPosition);
Toast toast = Toast.makeText(getApplicationContext(), "Text is " + msg, Toast.LENGTH_LONG);
toast.show();
}
});