Я пытался найти ответ повсюду, но я не нашел его.Почему ViewPager получает неправильную позицию в Android?
У меня есть Viewpager в моем фрагменте. Я вызвал адаптер в свой фрагмент и установил его в ViewPager. Мой ViewPager является динамическим в соответствии с данными JSONArray. У меня есть jsonArray, у которого есть пять объектов. Я добавил каждый объект в список и передал его в адаптер. Итак, мой viewpager создан в соответствии с list.size(), но проблема в том, что загрузился мой HomeFragment.java. Адаптер вызывается дважды (не уверен), но журнал показывает, что он вызывается дважды.
Вот мой Homefragment.java
private class TabJson extends AsyncTask<String,String,String> {
String jsonStr="";
private static final String url="http://10.0.2.2/JSON/recentmatch.php";
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
ServiceHandler sh=new ServiceHandler();
jsonStr=sh.makeServiceCall(url,ServiceHandler.POST);
try{
JSONObject obj=new JSONObject(jsonStr);
JSONObject data=obj.getJSONObject("data");
JSONArray card=data.getJSONArray("cards");
PagerLength=0;
lst_obj=new ArrayList<>();
for(int i=0;i<card.length();i++){
JSONObject card_obj=card.getJSONObject(i);
if(card_obj.getString("status").equals("started") || card_obj.getString("status").equals("notstarted")){
PagerLength++;
lst_obj.add(card_obj);
}
}
}
catch (JSONException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
LiveAdapter adapterTabRecent=new LiveAdapter(getContext(),lst_obj);
pagerRecentMatches.setAdapter(adapterTabRecent);
pagerRecentMatches.setCurrentItem(0);
float scaledDensity = getResources().getDisplayMetrics().scaledDensity;
LinearLayout.LayoutParams param1=new LinearLayout.LayoutParams(10*(int)scaledDensity,10*(int)scaledDensity);
// for(int i=0;i<PagerLength-1;i++){
// ImageView img=new ImageView(getContext());
// TextView space=new TextView(getContext());
// img.setId(R.id.selected_id);
// img.setLayoutParams(param1);
// img.setImageResource(R.drawable.unselect);
// space.setText(" ");
// selector_dynamic.addView(img);
// }
}
}
Выше код, где я получил данные из JSON и где я поставил его на мой адаптер.
Вот мой LiveAdapter.java
public class LiveAdapter extends PagerAdapter{
private Context context;
List<JSONObject> lst;
JSONObject mainObj=null;
View itemView;
private LayoutInflater inflater;
String status="";
public LiveAdapter(Context context,List<JSONObject> lst){
this.context=context;
this.lst=lst;
inflater=(LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return lst.size();
}
@Override
public int getItemPosition(Object object) {
int index=lst.indexOf((List)object);
if(lst.contains((List)object)){
return index;
}
else{
return POSITION_NONE;
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==((LinearLayout)object);
}
private class Holder{
TextView txt_one_country_name;
TextView txt_two_country_name;
TextView txt_venue;
TextView match;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
itemView=inflater.inflate(R.layout.tab_slider,container,false);
Holder holder=new Holder();
String[] parts;
String[] state_parts;
String[] match_parts;
Log.e("POSITION",""+position);
mainObj=this.lst.get(position);
holder.txt_one_country_name=(TextView)itemView.findViewById(R.id.txt_one_country_name);
holder.txt_two_country_name=(TextView)itemView.findViewById(R.id.txt_two_country_name);
holder.txt_venue=(TextView)itemView.findViewById(R.id.venue);
holder.match=(TextView)itemView.findViewById(R.id.match);
try {
status=mainObj.getString("status");
Log.e("POSITION INSIDE TRY",""+position);
Log.e("Status-->>>",""+status);
String name = mainObj.getString("name");
String state=mainObj.getString("venue");
String title=mainObj.getString("title");
parts=name.split("vs");
match_parts=title.split("-");
state_parts=state.split(",");
holder.txt_one_country_name.setText(parts[0]);
holder.txt_two_country_name.setText(parts[1]);
holder.txt_venue.setText(state_parts[1]);
holder.match.setText(match_parts[1]);
}
catch (JSONException e){
e.printStackTrace();
}
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(status.equals("notstarted")) {
Log.e("STATUS INSIDE ONCLICK",""+status);
Intent intent = new Intent(context, NotStartedMatchDetails.class);
context.startActivity(intent);
}
}
});
container.addView(itemView);
return itemView;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
// super.setPrimaryItem(container, position, object);
itemView=(View)object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((LinearLayout)object);
}
}
Я установил журнал в instantiateItem(). При запуске приложения позиции набора для меня по умолчанию как 0 и 1.
Здесь, мое значение позиции
01-18 15:47:02.295 31593-31593/com.example.myworld.materialdesign E/POSITION: 0
01-18 15:47:02.295 31593-31593/com.example.myworld.materialdesign E/POSITION INSIDE TRY: 0
01-18 15:47:02.295 31593-31593/com.example.myworld.materialdesign E/Status-->>>: notstarted
01-18 15:47:02.306 31593-31593/com.example.myworld.materialdesign E/POSITION: 1
01-18 15:47:02.306 31593-31593/com.example.myworld.materialdesign E/POSITION INSIDE TRY: 1
01-18 15:47:02.306 31593-31593/com.example.myworld.materialdesign E/Status-->>>: started
Проблема заключается в том, когда я сильно ударить справа налево, значение позиции указанных ниже: У меня есть пять вкладок, динамически созданных. Это значение равно 2,3,4. где 0 и 1?
, но когда я прокручиваю влево-вправо, значение позиции, упомянутое ниже: 2,1,0 Вот оно где 3 и 4?
Пожалуйста, помогите мне преодолеть эту проблему.
Пожалуйста, решить эту проблему. –
Можете ли вы прикрепить журналы и подытожить проблему, которую у вас есть? –
ok dude i edit my post –