2016-01-05 1 views
1

У меня проблема с использованием SwipeRefreshLayout, функциональность работает отлично, но счетчик не покажет. Я уже использовал все предоставленные решения, но все равно ничего.SwipeRefreshLayout работает, но счетчик не покажет

Мне совсем не нравится использовать XML, поэтому я в основном кодирую все и избегаю этого. У меня есть класс, расширяющий SwipeRefreshLayout, где я создаю listView, добавляю адаптер и настраиваю действие обновления и т. Д. Мой минимальный уровень API равен 16.

Если вам нужны какие-либо дополнительные данные или код, пожалуйста, дайте мне знать, и я будьте рады предоставить их, любая помощь будет оценена!

Моя активность

public class MainActivity extends Activity { 

    private static MainActivity mainActivity = null; 
    private MainView mainView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     mainView = new MainView(this); 
     setContentView(mainView); 
    } 

    public static MainActivity getMainActivity() { 
     return mainActivity; 
    } 
} 

Мой главный вид:

public class MainView extends SwipeRefreshLayout { 

    private ListView listView; 

    public MainView(Context context) { 
     super(context); 

     final String [] objects = new String[] {"panda", "horse", "fox"}; 

     listView = new ListView(context); 
     final ArrayAdapter arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, objects); 
     listView.setAdapter(arrayAdapter); 
     addView(listView); 

     this.setOnRefreshListener(new OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       objects[0] = "Big panda!"; 
       arrayAdapter.notifyDataSetChanged(); 
       setRefreshing(false); 
      } 
     }); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     int width = r - l; 
     int height = b - t; 

     listView.layout(0, 0, width, height); 
    } 
} 
+2

отправьте соответствующий код –

+0

Добавлен код, который я использую, а не полный класс, но часть, которая имеет значение. – adrastious

+0

Обновление: это не было решено, попробовал много решений, но, похоже, не работает. – adrastious

ответ

0

Трудно сказать, не видя никакого кода, но моя кишка говорит мне, что вам нужно, чтобы убедиться, что соответствующий вид прогресс связан и вы устанавливаете видимость для VISIBLE и INVISIBLE в нужное время.

+0

Я попытался настроить listView на невидимое, когда происходит обновление, вещь кругового загрузчика даже не отображается. – adrastious

+0

Я считаю, что вам нужно называть «setOnRefreshListener» в списке. Проверьте http://stackoverflow.com/questions/26858692/swiperefreshlayout-setrefreshing-not-showing-indicator-initially. –

+0

Я не могу установить прослушиватель обновлений в списке, я действительно сделал это на классе, и эта часть работает, единственная странная вещь - загрузка не отображается. – adrastious

0

Вот простой демо, с рабочим прогресса в кодированном SwipeRefreshLayout каждый раз, когда вы проводите это добавит элемент к списку

моя активность:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RelativeLayout container = (RelativeLayout) findViewById(R.id.container); 

     CustomSwipeRefresh swipeRefresh = new CustomSwipeRefresh(this); 
     container.addView(swipeRefresh); 
     swipeRefresh.refreshData(); 
    } 
} 

с планировкой:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/container" 
    tools:context="com.divshark.customswiperefresh.MainActivity"> 


</RelativeLayout> 

Затем я создал CustomSwipeRefresh:

public class CustomSwipeRefresh extends SwipeRefreshLayout { 

    private static final String TAG = CustomSwipeRefresh.class.getSimpleName(); 

    private static int MIN_LIST = 50; 

    private List<String> mItems = new ArrayList<>(); 
    private Context mContext; 

    private ListView listView; 
    private ListAdapter mAdapter; 

    public CustomSwipeRefresh(Context context){ 
     super(context); 

     this.mContext = context; 


     mAdapter = new ListAdapter(mContext, mItems); 

     listView = new ListView(context); 
     listView.setAdapter(mAdapter); 
     listView.setBackgroundColor(Color.WHITE); 
     listView.setDivider(null); 
     listView.setDividerHeight(0); 
     addView(listView); 

     setOnRefreshListener(new OnRefreshListener() { 
      @Override 
      public void onRefresh() { 

       setRefreshing(true); 

       postDelayed(new Runnable() { 
        @Override 
        public void run() { 

         onRefreshData(true); 

         Log.d(TAG,"--- FINISHED REFRESHING ---"); 
         setRefreshing(false); 
        } 
       }, 2000); 

      } 
     }); 

    } 

    public void refreshData(){ 
     onRefreshData(false); 
    } 

    /** 
    * Called when the data is refreshed in the list 
    */ 
    private void onRefreshData(boolean addItem){ 

     if(addItem){ 
      MIN_LIST++; 
     } 

     mItems.clear(); 

     for(int i = 0; i < MIN_LIST; i++){ 
      mItems.add("New item "+ Integer.toString(i + 1)); 
     } 

     mAdapter.notifyDataSetChanged(); 
    } 


    public class ListAdapter extends BaseAdapter{ 

     public List<String> mItems; 
     public Context mContext; 
     public LayoutInflater mInflater; 

     class Holder{ 
      AppCompatTextView mTvItem; 
     } 

     public ListAdapter(Context context, List<String> items){ 

      this.mContext = context; 
      this.mItems = items; 
      this.mInflater = LayoutInflater.from(mContext); 

     } 

     @Override 
     public int getCount() { 
      return mItems.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return mItems.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      Holder holder ; 

      if(convertView == null){ 
       holder = new Holder(); 
       convertView = mInflater.inflate(R.layout.item_row, parent, false); 

       holder.mTvItem = (AppCompatTextView) convertView.findViewById(R.id.item); 

       convertView.setTag(holder); 
      }else{ 
       holder = (Holder) convertView.getTag(); 
      } 

      String item = mItems.get(position); 
      if(item != null){ 
       holder.mTvItem.setText(item); 
      } 

      return convertView; 
     } 
    } 
} 

и элемент макет:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:padding="16dp"> 
<android.support.v7.widget.AppCompatTextView 
    android:id="@+id/item" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" /> 
</LinearLayout> 

Надеется, что это помогает!

+0

Я проверил ваш код, и он работает, я отредактировал свой вопрос и добавил весь код, поскольку у меня есть его, чтобы вы могли видеть, как счетчик не будет показывать, и если вы сможете найти проблему, я буду спасен! – adrastious