Я использую библиотеку SwipeCards, и основной код находится внутри адаптера массива.Activity (BaseCardsActivity) обрабатывает некоторые данные из Firebase, передает их в ArrayAdapter (SwingAdapterClass).Внутри этого адаптера есть несколько изображений, и когда пользователь щелкает одно из них, этот ImageView исчезает, и интерфейс (не показан здесь) выбирает некоторые изображения в зависимости от изображения, которое пользователь щелкнул, и загружает их все в ViewPager.
Проблема в том, что мне нужно загрузить Viewpager изнутри метода OnClickListener, прикрепленного к каждому ImageView (причина слишком длинная, а этот вопрос уже слишком длинный), поэтому я могу запросить Firebase, только если пользователь щелкнет по img.
Однако изнутри OnClickListener ViewPager не загружается.Снаружи OnClickListener это работает, как я показываю в примере.
Я предоставил более простой пример логики, иначе этот пост будет слишком длинным.Прошу вашей помощи, пожалуйста.Извините, я так плохо редактирую код здесь.
Спасибо.
BaseCardsActivity.java
//implement the onFlingListener
public class BaseCardsActivity extends AppCompatActivity{
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_cards);
//mAuth, DatabaseReference, etc.
rowItem = new ArrayList<CardsModel>();
mAdapterClass = new SwingAdapterClass(BaseCardsActivity.this, R.layout.cards,rowItem);
final SwipeFlingAdapterView flingContainer = (SwipeFlingAdapterView) findViewById(R.id.frame);
// flingContainer.setAdapter(mAdapterClass);
flingContainer.setAdapter(mViewpagerEvents);
instantiateSwipeCards();
}
private void instantiateSwipeCards(){
mDatabaseReference.addChildEventListener(new ChildEventListener() {
//datasnapshot....
// get all images I need
// put images in List<String> imgList
CardsModel cards = new CardsModel(imgList);
rowItem.add(cardsModel);
mAdapterClass.notifyDataSetChanged();
}
}
activity_base_cards.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.lorentzos.flingswipe.SwipeFlingAdapterView
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffeee9e2"
app:rotation_degrees="15.5"
tools:context=".BaseCardsActivity"/>
</RelativeLayout>
SwingAdapterClass.java
public class SwingAdapterClass extends ArrayAdapter<CardsModel>{
public SwingAdapterClass(@NonNull Context context, int resource, List<CardsModel> item) {
super(context, resource, item);
mContext = context;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final CardsModel cardsModel = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.cards, parent, false);
}
mPager = convertView.findViewById(R.id.viewpager);
mImageView = convertView.findViewById(R.Id.clickImg);
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCircleImageView.setVisibility(View.INVISIBLE);
mPager.setVisibility(View.VISIBLE);
/*====this code outside OnClickListener Works ====*/
mProfileViewPagerAdapter = new ProfileViewPagerAdapter(mContext, cardsModel.getCreatorGallery());
mPager.setAdapter(mProfileViewPagerAdapter);
/*======= ======*/
}
});
}
private class ViewAdapter extends PagerAdapter{
private Context mContext;
private List<String> mListData= new ArrayList<String>();
public ViewAdapter(Context context, List<String> listData){
mContext = context;
mListData = listData;
notifyDataSetChanged();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
Log.d(tag, Integer.toString(mListData.size()));
return mListData.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ViewGroup view = (ViewGroup) inflater.inflate(R.layout.view_item, container, false);
final ImageView imageView = view.findViewById(R.id.theImg);
Log.d(tag, Integer.toString(mListData.size()));
Glide.with(mContext).load(mListData.get(position)).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(imageView);
container.addView(view);
return view;
}
}
}
Макет для ArrayAdapter:
cards.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="120dp"
android:layout_height="120dp"
android:src="@drawable/empty_profile"
android:id="@+id/clickImg"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="400dp"
android:visibility="invisible">
</android.support.v4.view.ViewPager>
</RelativeLayout>
РЕДАКТИРОВАТЬ: Я также пытался:
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
mCircleImageView.setVisibility(View.INVISIBLE);
mPager.setVisibility(View.VISIBLE);
mProfileViewPagerAdapter = new ProfileViewPagerAdapter(mContext, cardsModel.getCreatorGallery());
mPager.setAdapter(mProfileViewPagerAdapter);
}
});
}
});
И также пытался накачать Viewpager изнутри OnClickListener,если это имеет смысл:
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
View v = LayoutInflater.from(mContext).inflate(R.layout.cards, parent, false);
mPager = v.findViewById(R.id.vpag);
mCircleImageView.setVisibility(View.INVISIBLE);
mPager.setVisibility(View.VISIBLE);
mProfileViewPagerAdapter = new ProfileViewPagerAdapter(mContext, cardsModel.getCreatorGallery());
mPager.setAdapter(mProfileViewPagerAdapter);
}
});
}
});