2016-01-18 4 views
1

Я пытался найти ответ повсюду, но я не нашел его.Почему 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?

Пожалуйста, помогите мне преодолеть эту проблему.

+0

Пожалуйста, решить эту проблему. –

+0

Можете ли вы прикрепить журналы и подытожить проблему, которую у вас есть? –

+0

ok dude i edit my post –

ответ

1

сделать это когда экземпляр объекта

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
..... 
itemView.setTag(position); 
..... 

} 
//now on click of the item view you can get it back as follows 
itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int position = (int) v.getTag();// v here is your itemView 
} 
+0

Но мне нужно значение позиции, когда я нажимаю на itemview. –

+0

да, я думаю, что это именно то, что в первую очередь сохранить позиционный клапан в itemview при создании экземпляра и вернуть его обратно на клик, просто взгляните на ответ снова im, редактируя его –

+0

вы можете мне объяснить ??? пожалуйста, –

Смежные вопросы